@Override public Optional<ValueAndBound<T2>> getLastKnownLocalValue() { return delegate.getLastKnownLocalValue() .map(preservingBounds(transformFromUnderlying)); }
/** * Registers a gauge which tracks the current value of the validity bound. Under normal operation and within the * lifetiem of a single JVM, this should not decrease. * * @param metricsManager metrics manager to register the gauge on * @param metadataCoordinationService metadata coordination service that should be tracked */ private static void registerValidityBoundMetric(MetricsManager metricsManager, CoordinationService<InternalSchemaMetadata> metadataCoordinationService) { metricsManager.registerMetric( MetadataCoordinationServiceMetrics.class, AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND, TrackerUtils.createCachingExceptionHandlingGauge( log, Clock.defaultClock(), AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND, () -> metadataCoordinationService.getLastKnownLocalValue() .map(ValueAndBound::bound) .orElse(Long.MIN_VALUE))); }
@Test public void getsEmptyLocalValueFromDelegateIfDelegateHasEmptyLocalValue() { when(delegate.getLastKnownLocalValue()).thenReturn(Optional.empty()); assertThat(coordinationService.getLastKnownLocalValue()).isEmpty(); verify(delegate).getLastKnownLocalValue(); } }
/** * Registers a gauge which tracks the eventual transactions schema version - that is, at the end of the current * period of validity for the bound, what the metadata says the transactions schema version should be. * * @param metricsManager metrics manager to register the gauge on * @param metadataCoordinationService metadata coordination service that should be tracked */ private static void registerEventualTransactionsSchemaVersionMetric(MetricsManager metricsManager, CoordinationService<InternalSchemaMetadata> metadataCoordinationService) { metricsManager.registerMetric( MetadataCoordinationServiceMetrics.class, AtlasDbMetricNames.COORDINATION_EVENTUAL_TRANSACTIONS_SCHEMA_VERSION, TrackerUtils.createCachingExceptionHandlingGauge( log, Clock.defaultClock(), AtlasDbMetricNames.COORDINATION_EVENTUAL_TRANSACTIONS_SCHEMA_VERSION, () -> { Optional<ValueAndBound<InternalSchemaMetadata>> latestValue = metadataCoordinationService.getLastKnownLocalValue(); return latestValue .map(ValueAndBound::value) .flatMap(Function.identity()) .map(InternalSchemaMetadata::timestampToTransactionsTableSchemaVersion) .map(timestampMap -> timestampMap.getValueForTimestamp(latestValue.get().bound())) .orElse(null); })); }
@Test public void getsLastKnownLocalValueFromDelegateIfPresent() { when(delegate.getLastKnownLocalValue()).thenReturn(Optional.of(ValueAndBound.of(INTEGER_1, BOUND))); assertThat(coordinationService.getLastKnownLocalValue()).contains(ValueAndBound.of(STRING_1, BOUND)); verify(delegate).getLastKnownLocalValue(); verify(intToStringTransform).apply(INTEGER_1); }
@Test public void returnsValidityBoundFromCoordinationService() { Gauge<Long> boundGauge = getGauge(metricsManager, AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND); assertThat(boundGauge.getValue()).isEqualTo(TIMESTAMP_1); verify(metadataCoordinationService).getLastKnownLocalValue(); verifyNoMoreInteractions(metadataCoordinationService); }
@Test public void returnsEventualTransactionsSchemaVersionFromCoordinationService() { Gauge<Integer> boundGauge = getGauge(metricsManager, AtlasDbMetricNames.COORDINATION_EVENTUAL_TRANSACTIONS_SCHEMA_VERSION); assertThat(boundGauge.getValue()).isEqualTo(2); verify(metadataCoordinationService).getLastKnownLocalValue(); verifyNoMoreInteractions(metadataCoordinationService); }
@Test public void retrieveLocalValueReturnsEmptyIfNothingCached() { when(coordinationStore.getAgreedValue()).thenReturn(Optional.of(OTHER_STRING_AND_ONE_THOUSAND)); assertThat(stringCoordinationService.getLastKnownLocalValue()).isEmpty(); verify(coordinationStore, never()).getAgreedValue(); } }
@Before public void setUp() { when(metadataCoordinationService.getLastKnownLocalValue()) .thenReturn(Optional.of(ValueAndBound.of(INTERNAL_SCHEMA_METADATA, TIMESTAMP_1))); MetadataCoordinationServiceMetrics.registerMetrics(metricsManager, metadataCoordinationService); }
@Test public void handlesMultitenancyCorrectly() { CoordinationService<InternalSchemaMetadata> otherService = mock(CoordinationService.class); MetricsManager otherManager = MetricsManagers.createForTests(); MetadataCoordinationServiceMetrics.registerMetrics(otherManager, otherService); when(otherService.getLastKnownLocalValue()).thenReturn( Optional.of(ValueAndBound.of(Optional.empty(), TIMESTAMP_2))); assertThat(getGauge(metricsManager, AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND).getValue()) .isEqualTo(TIMESTAMP_1); assertThat(getGauge(otherManager, AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND).getValue()) .isEqualTo(TIMESTAMP_2); }
@Test public void retrieveLocalValueRetrievesCachedValue() { when(coordinationStore.getAgreedValue()).thenReturn(Optional.of(STRING_AND_ONE_HUNDRED)); assertThat(stringCoordinationService.getValueForTimestamp(42)).contains(STRING_AND_ONE_HUNDRED); when(coordinationStore.getAgreedValue()).thenReturn(Optional.of(OTHER_STRING_AND_ONE_THOUSAND)); assertThat(stringCoordinationService.getLastKnownLocalValue()).contains(STRING_AND_ONE_HUNDRED); verify(coordinationStore, times(1)).getAgreedValue(); }
@Override public Optional<ValueAndBound<T2>> getLastKnownLocalValue() { return delegate.getLastKnownLocalValue() .map(preservingBounds(transformFromUnderlying)); }
/** * Registers a gauge which tracks the current value of the validity bound. Under normal operation and within the * lifetiem of a single JVM, this should not decrease. * * @param metricsManager metrics manager to register the gauge on * @param metadataCoordinationService metadata coordination service that should be tracked */ private static void registerValidityBoundMetric(MetricsManager metricsManager, CoordinationService<InternalSchemaMetadata> metadataCoordinationService) { metricsManager.registerMetric( MetadataCoordinationServiceMetrics.class, AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND, TrackerUtils.createCachingExceptionHandlingGauge( log, Clock.defaultClock(), AtlasDbMetricNames.COORDINATION_LAST_VALID_BOUND, () -> metadataCoordinationService.getLastKnownLocalValue() .map(ValueAndBound::bound) .orElse(Long.MIN_VALUE))); }
/** * Registers a gauge which tracks the eventual transactions schema version - that is, at the end of the current * period of validity for the bound, what the metadata says the transactions schema version should be. * * @param metricsManager metrics manager to register the gauge on * @param metadataCoordinationService metadata coordination service that should be tracked */ private static void registerEventualTransactionsSchemaVersionMetric(MetricsManager metricsManager, CoordinationService<InternalSchemaMetadata> metadataCoordinationService) { metricsManager.registerMetric( MetadataCoordinationServiceMetrics.class, AtlasDbMetricNames.COORDINATION_EVENTUAL_TRANSACTIONS_SCHEMA_VERSION, TrackerUtils.createCachingExceptionHandlingGauge( log, Clock.defaultClock(), AtlasDbMetricNames.COORDINATION_EVENTUAL_TRANSACTIONS_SCHEMA_VERSION, () -> { Optional<ValueAndBound<InternalSchemaMetadata>> latestValue = metadataCoordinationService.getLastKnownLocalValue(); return latestValue .map(ValueAndBound::value) .flatMap(Function.identity()) .map(InternalSchemaMetadata::timestampToTransactionsTableSchemaVersion) .map(timestampMap -> timestampMap.getValueForTimestamp(latestValue.get().bound())) .orElse(null); })); }