package com.sun.enterprise.shoal.carryel; import com.sun.enterprise.ee.cms.core.*; import java.util.logging.Logger; import java.util.logging.Level; import java.util.UUID; import java.util.Map; import java.util.Random; public class RaiseFenceTest { private static final Logger logger = Logger.getLogger( "RaiseFenceTest" ); private static final Random RANDOM = new Random(); private static final String GROUP_NAME = "TestGroup"; private static final String COMPONENT_NAME = "TestComponent"; private static final String FAILED_MEMBER_TOKEN = "I_am_already_failed_member"; public static void main( String[] args ) { RaiseFenceTest check = new RaiseFenceTest(); try { check.runSimpleSample(); } catch( GMSException e ) { logger.log( Level.SEVERE, "Exception occured while joining group:" + e ); } } private void runSimpleSample() throws GMSException { logger.log( Level.INFO, "Starting RaiseFenceTest...." ); String serverName = UUID.randomUUID().toString(); //initialize Group Management Service GroupManagementService gms = initializeGMS( serverName, GROUP_NAME ); //join group logger.log( Level.INFO, "Joining Group " + GROUP_NAME ); gms.join(); try { Thread.sleep( 3000 ); } catch( InterruptedException e ) { } // raise fence GroupHandle gh = gms.getGroupHandle(); while( true ) { try { gh.raiseFence( COMPONENT_NAME, FAILED_MEMBER_TOKEN ); logger.log( Level.INFO, "raiseFence() called successfully" ); checkRaiseFence( gh, COMPONENT_NAME, FAILED_MEMBER_TOKEN ); } catch( GMSException gmse ) { gmse.printStackTrace(); } catch( RuntimeException re ) { re.printStackTrace(); leaveGroupAndShutdown( serverName, gms ); System.exit( 0 ); } finally { gh.lowerFence( COMPONENT_NAME, FAILED_MEMBER_TOKEN ); logger.log( Level.INFO, "lowerFence() called successfully" ); } try { Thread.sleep( getRandomSleep() ); } catch( InterruptedException e ) { } } } private void checkRaiseFence( GroupHandle gh, String componentName, String memberToken ) { DistributedStateCache dsc = gh.getDistributedStateCache(); final Map entries; entries = dsc.getFromCache( memberToken ); int raisedCount = 0; for( GMSCacheable c : entries.keySet() ) { if( componentName.equals( c.getComponentName() ) ) { if( memberToken.equals( c.getKey() ) ) { if( !memberToken.equals( c.getMemberTokenId() ) ) { raisedCount++; } } } } if( raisedCount > 1 ) throw new RuntimeException( "raised count should not exceed 1" ); } private static int getRandomSleep() { return RANDOM.nextInt( 3 ) * 1000; } private GroupManagementService initializeGMS( String serverName, String groupName ) { logger.log( Level.INFO, "Initializing Shoal for member: " + serverName + " group:" + groupName ); return (GroupManagementService)GMSFactory.startGMSModule( serverName, groupName, GroupManagementService.MemberType.CORE, null ); } private void leaveGroupAndShutdown( String serverName, GroupManagementService gms ) { logger.log( Level.INFO, "Shutting down gms " + gms + "for server " + serverName ); gms.shutdown( GMSConstants.shutdownType.INSTANCE_SHUTDOWN ); } }