private void waitUntilTransactionManagerIsReady() throws InterruptedException { while (!transactionManager.isInitialized()) { log.info("Waiting for transaction manager to be initialized; going to sleep for {} ms while waiting", SafeArg.of("sleepTimeMillis", SLEEP_TIME_WHEN_NOTHING_TO_COMPACT_MIN_MILLIS)); sleepForMillis(SLEEP_TIME_WHEN_NOTHING_TO_COMPACT_MIN_MILLIS); } }
@Test public void transactionManagerCannotInitializeWhilePrerequisitesAreFalse() { assertFalse(manager.isInitialized()); tickInitializingThread(); assertFalse(manager.isInitialized()); tickInitializingThread(); assertFalse(manager.isInitialized()); }
@Test public void callbackRunsOnlyOnceAsInitializationStatusChanges() { everythingInitialized(); tickInitializingThread(); assertTrue(manager.isInitialized()); nothingInitialized(); assertFalse(manager.isInitialized()); everythingInitialized(); assertTrue(manager.isInitialized()); verify(mockCallback, times(1)).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void isInitializedAndCallbackHasRunWhenPrerequisitesAreInitialized() { everythingInitialized(); tickInitializingThread(); assertTrue(manager.isInitialized()); verify(mockCallback, times(1)).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void switchBackToUninitializedImmediatelyWhenPrerequisitesBecomeFalse() { everythingInitialized(); tickInitializingThread(); assertTrue(manager.isInitialized()); nothingInitialized(); assertFalse(manager.isInitialized()); assertThatThrownBy(() -> manager.runTaskWithRetry(ignore -> null)).isInstanceOf(NotInitializedException.class); }
@Test public void isNotInitializedWhenCleanerIsNotInitialized() { setInitializationStatus(true, true, false, true); tickInitializingThread(); assertFalse(manager.isInitialized()); verify(mockCallback, never()).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void isNotInitializedWhenInitializerIsNotInitialized() { setInitializationStatus(true, true, true, false); tickInitializingThread(); assertFalse(manager.isInitialized()); verify(mockCallback, never()).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void isNotInitializedWhenKvsIsNotInitialized() { setInitializationStatus(false, true, true, true); tickInitializingThread(); assertFalse(manager.isInitialized()); verify(mockCallback, never()).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void isNotInitializedWhenTimelockIsNotInitialized() { setInitializationStatus(true, false, true, true); tickInitializingThread(); assertFalse(manager.isInitialized()); verify(mockCallback, never()).runWithRetry(any(SerializableTransactionManager.class)); }
@Test public void synchronouslyInitializedManagerIsInitializedEvenIfNothingElseIs() { manager = getManagerWithCallback(false, mockCallback, executorService); assertTrue(manager.isInitialized()); verify(mockCallback).runWithRetry(manager); }
@Test public void initializingExecutorShutsDownWhenInitialized() { everythingInitialized(); tickInitializingThread(); assertTrue(manager.isInitialized()); assertTrue(executorService.isShutdown()); }
@Test public void callbackBlocksInitializationUntilDone() { everythingInitialized(); ClusterAvailabilityStatusBlockingCallback blockingCallback = new ClusterAvailabilityStatusBlockingCallback(); manager = getManagerWithCallback(true, blockingCallback, executorService); ExecutorService tickerThread = PTExecutors.newSingleThreadExecutor(true); tickerThread.submit(() -> executorService.tick(1000, TimeUnit.MILLISECONDS)); Awaitility.waitAtMost(THREE, TimeUnit.SECONDS).until(blockingCallback::wasInvoked); assertFalse(manager.isInitialized()); blockingCallback.stopBlocking(); Awaitility.waitAtMost(THREE, TimeUnit.SECONDS).until(manager::isInitialized); tickerThread.shutdown(); }
@Test public void asyncInitializationEventuallySucceeds() { AtlasDbConfig atlasDbConfig = ImmutableAtlasDbConfig.builder() .keyValueService(new InMemoryAsyncAtlasDbConfig()) .initializeAsync(true) .build(); TransactionManager manager = TransactionManagers.builder() .config(atlasDbConfig) .userAgent("test") .globalMetricsRegistry(new MetricRegistry()) .globalTaggedMetricRegistry(DefaultTaggedMetricRegistry.getDefault()) .registrar(environment) .addSchemas(GenericTestSchema.getSchema()) .build() .serializable(); assertFalse(manager.isInitialized()); assertThatThrownBy(() -> manager.runTaskWithRetry(unused -> null)).isInstanceOf(NotInitializedException.class); Awaitility.await().atMost(12, TimeUnit.SECONDS).until(manager::isInitialized); performTransaction(manager); }
@Test public void callbackRunsAfterPreconditionsAreMet() { ClusterAvailabilityStatusBlockingCallback blockingCallback = new ClusterAvailabilityStatusBlockingCallback(); blockingCallback.stopBlocking(); manager = getManagerWithCallback(true, blockingCallback, executorService); tickInitializingThread(); assertFalse(manager.isInitialized()); assertFalse(blockingCallback.wasInvoked()); everythingInitialized(); tickInitializingThread(); assertTrue(blockingCallback.wasInvoked()); }
private void waitUntilTransactionManagerIsReady() throws InterruptedException { while (!transactionManager.isInitialized()) { log.info("Waiting for transaction manager to be initialized; going to sleep for {} ms while waiting", SafeArg.of("sleepTimeMillis", SLEEP_TIME_WHEN_NOTHING_TO_COMPACT_MIN_MILLIS)); sleepForMillis(SLEEP_TIME_WHEN_NOTHING_TO_COMPACT_MIN_MILLIS); } }
@Test public void asyncInitializationIsSynchronousIfKvsIsReady() { AtlasDbConfig atlasDbConfig = ImmutableAtlasDbConfig.builder() .keyValueService(new InMemoryAtlasDbConfig()) .initializeAsync(true) .build(); TransactionManager manager = TransactionManagers.builder() .config(atlasDbConfig) .userAgent("test") .globalMetricsRegistry(new MetricRegistry()) .globalTaggedMetricRegistry(DefaultTaggedMetricRegistry.getDefault()) .registrar(environment) .addSchemas(GenericTestSchema.getSchema()) .build() .serializable(); assertTrue(manager.isInitialized()); performTransaction(manager); }