Fabulous work Akila!! :-) On Mon, Nov 30, 2015 at 12:55 AM, Akila Ravihansa Perera <raviha...@wso2.com > wrote:
> Hi, > > Currently there are lot of Thread.sleep calls in mock iaas component which > makes it slow and cause unexpected behavior due to concurrency issues. Also > it has a significant performance overhead when running integration tests > since mock iaas is being used for test cases. I've been working on > improving this component by doing following changes; > > - Remove *all* Thread sleep calls in mock iaas > - Introduce a method named 'initialize' to start event receivers and > publishers. This is a synchronous call which grantees that receiver and > publisher objects will be created successfully. If not it will throw an > exception and startInstance() method call in CC will fail. Earlier this > task was delegated to an executor service which made it difficult to check > whether mock instance was created successfully. > - Create topology receiver in mock instance and listen for member > initialized and member started events. It will publish instance started and > instance activated events based on topology events received rather than > sleeping for some time interval before publishing. > > After making those changes I faced multiple integration test failures. > This was mainly because integration tests relied heavily on Thread sleep > calls to assert various conditions. With these changes, the time taken for > a mock instance/app to become active came down to milliseconds, hence test > cases could not detect member status or app status correctly. Therefore I > had to introduce a new non-blocking mechanism to check app/member status by > using thread synchronization. > > Now the average time taken for complete integration tests is around 16 > mins (earlier it was more than 30 mins). This is almost 50% performance > gain. Created JIRA at [1]. > > > Following is a summary of changes. > > AutoscalerTopologyEventReceiver: > - Fix formatting and log messages > - ClusterInstanceTerminatedEventListener check appMonitor is null when > calling destroy() on monitor > > AutoscalerServiceImpl > - Fix formatting and log messages > > ClusterStatusActiveProcessor > - Fix formatting and log messages (log cluster-instance-id) > > GroupStatusActiveProcessor > - Fix formatting and log messages (log group-instance-id) > - Print groups map entries and cluster data holder map entries if debug > enabled > > GroupStatusProcessor > - Fix formatting and log messages (log group-instance-id) > > GroupStatusTerminatedProcessor > - Fix formatting and log messages (log group-instance-id) > > CloudControllerServiceComponent > - Increase THREAD_POOL_SIZE from 10 to 20 > > > TopologyBuilder > - Fix formatting and log messages > - Move acquire topology lock call outside of try block > > RestClient > - Add logs for every method to help troubleshooting integration failures > > StratosTestServerManager > - Call waitForPort method with restart timeout of 600000 ms. This is to > avoid test failures due to slow builder machines. > > > RestConstants > - Add entity name: REPO_NOTIFY_NAME = "GitHook" > > TopologyHandler > - Update timeout values: > APPLICATION_ACTIVATION_TIMEOUT = 300000; > APPLICATION_INACTIVATION_TIMEOUT = 120000; > APPLICATION_UNDEPLOYMENT_TIMEOUT = 30000; > MEMBER_TERMINATION_TIMEOUT = 120000; > APPLICATION_TOPOLOGY_INIT_TIMEOUT = 20000; > > - Increase executorService pool size from 10 to 30 to compensate for > additional event receivers > - Event receivers with logs for events > - healthStatEventReceiver: MemberFaultEvent > > - applicationsEventReceiver: > ApplicationInstanceActivatedEventListener, > ApplicationInstanceInactivatedEventListener > > - topologyEventReceiver: MemberActivatedEventListener, > MemberTerminatedEventListener, ClusterInstanceActivatedEventListener, > ClusterInstanceInactivateEventListener > > - Added logs for every method to help troubleshoot integration failures > - Asynchronous mechanism to assertApplicationActiveStatus > - Asynchronous mechanism to assertApplicationInactiveStatus > > > Application > - Added log in getStatus() method to print status of all application > instances > > > ApplicationCreatedMessageProcessor > - Fix formatting and log messages > > ApplicationDeletedMessageProcessor > - Fix formatting and log messages > ApplicationInstanceActivatedMessageProcessor > - Fix formatting and log messages (log app-instance-id) > > ApplicationInstanceCreatedMessageProcessor > - Fix formatting and log messages (log app-instance-id) > > ApplicationInstanceInactivatedMessageProcessor > - Fix formatting and log messages (log app-instance-id) > > ApplicationInstanceTerminatedMessageProcessor > - Fix formatting and log messages (log app-instance-id) > > ApplicationInstanceTerminatingMessageProcessor > - Fix formatting and log messages (log app-instance-id) > > ClusterStatusClusterActivatedMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > ClusterStatusClusterInactivateMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > ClusterStatusClusterInstanceCreatedMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > ClusterStatusClusterResetMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > ClusterStatusClusterTerminatedMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > ClusterStatusClusterTerminatingMessageProcessor > - Fix formatting and log messages (log cluster-instance-id) > > Introduce removeEventListener method for message processor chain to remove > a registered event listener object. This is needed since integration tests > will be registering event listeners on-demand. Those listeners needs to be > removed at the end of the test case. > - ApplicationSignUpMessageProcessorChain > - ApplicationsMessageProcessorChain > - ClusterStatusMessageProcessorChain > - DomainMappingMessageProcessorChain > - HealthStatMessageProcessorChain > - InitializerMessageProcessorChain > - InstanceNotifierMessageProcessorChain > - InstanceStatusMessageProcessorChain > - TenantMessageProcessorChain > - TopologyMessageProcessorChain > - MessageProcessorChain > - ApplicationsEventMessageDelegator > - ApplicationsEventReceiver > > InstanceNotifierEventReceiver > - synchronized blocks for execute() and terminate() > - eventSubscriber object creation moved to constructor from execute() > method. This is to avoid possible NPE when calling terminate() method > > MetadataApi > - Catch generic Exception instead of RegistryException > > DataStore > - throws MetadataException in addition to RegistryException > MetadataApiRegistry > - throw new MetadataException instead of RegistryException > > > MockIaasServiceComponent > - Move mockIaasServiceUtil.startInstancesPersisted() to > MockIaasServiceImpl() > > MockIaasServiceImpl > - start persisted mock instances in the constructor > - Remove all thread sleep calls > > > MockIaasServiceUtil > - Move startInstancesPersisted() method to MockIaasServiceImpl() > > > MockInstance > - Create TopologyEventReceiver object and register: > MemberInitializedEventListener, MemberStartedEventListener, > MemberMaintenanceListener > - Publish InstanceStartedEvent upon receiving MemberInitializedEvent > - Publish InstanceActivatedEvent upon receiving MemberStartedEvent > - Publish InstanceReadyToShutdownEvent upon receiving > MemberMaintenanceModeEvent > - synchronized terminate() and initialize() methods > - Introduce an initialize() method to start event receivers and health > stat publisher > - Introduce field 'memberStatus' of type MemberStatus to track the > life-cycle of mock instance > > MockIaasServiceTest > - Start embedded MB in unit test case since mockIaasService.startInstance > call will start the event receivers as well > > GitHookTestCase > - Make artifactUpdateEventCount an AtomicInteger > - Replace restClient.doPost call with restClient.addEntity call > - Terminate instanceNotifierEventReceiver at the end of test case > - Shutdown eventListenerExecutorService at the end of test case > > [1] https://issues.apache.org/jira/browse/STRATOS-1633 > > Thanks. > > -- > Akila Ravihansa Perera > WSO2 Inc.; http://wso2.com/ > > Blog: http://ravihansa3000.blogspot.com > -- Imesh Gunaratne Senior Technical Lead, WSO2 Committer & PMC Member, Apache Stratos