public static long getBlockingTimeout(ObjectMapper mapper, TimeLockServerConfiguration configuration) { // TODO (jkong): Need to decide if this is worth the pain to enforce our invariant, or if we should just // let users do it manually! Preconditions.checkNotNull(mapper, "ObjectMapper should not be null"); Preconditions.checkNotNull(configuration, "TimeLockServerConfiguration should not be null"); try { List<Map<String, String>> connectorData = getConnectorData(mapper, configuration); long minimumTimeout = getMinimumTimeout(connectorData); return scaleForErrorMargin(minimumTimeout, getErrorMargin(configuration)); } catch (IOException e) { return scaleForErrorMargin(logAndGetDefault(), getErrorMargin(configuration)); } }
@Test public void scaleForErrorMarginDoesNotReduceAlreadySmallTimeouts() { assertThat(BlockingTimeouts.scaleForErrorMargin(FIVE, TEST_ERROR_MARGIN)) .isEqualTo(FIVE); }
@Test public void returnsDefaultBlockingTimeoutWithNoSpecifiedConnectors() { TimeLockServerConfiguration basicConfiguration = new TimeLockServerConfiguration( null, CLUSTER, CLIENTS, ImmutableTimeLimiterConfiguration.of(true, TEST_ERROR_MARGIN), null, null); long expectedMargin = scaleForErrorMarginReferenceImplementation( BlockingTimeouts.DEFAULT_IDLE_TIMEOUT, TEST_ERROR_MARGIN); assertThat(BlockingTimeouts.getBlockingTimeout(OBJECT_MAPPER, basicConfiguration)) .isEqualTo(expectedMargin); }
private static long getMinimumTimeout(List<Map<String, String>> connectorData) { Optional<Long> minimum = connectorData.stream() .map(connectorDatum -> connectorDatum.get(IDLE_TIMEOUT)) .map(idleTimeout -> Duration.parse(idleTimeout).toMilliseconds()) .min(Long::compareTo); if (minimum.isPresent()) { return minimum.get(); } return logAndGetDefault(); }
@Test public void scaleForErrorMarginReducesTimeoutSlightly() { assertThat(BlockingTimeouts.scaleForErrorMargin(ONE_MILLION, TEST_ERROR_MARGIN)) .isLessThan(ONE_MILLION) .isEqualTo(scaleForErrorMarginReferenceImplementation(ONE_MILLION, TEST_ERROR_MARGIN)); }
private static TimeLockDeprecatedConfiguration createDeprecatedConfiguration(TimeLockServerConfiguration config, Environment environment) { ImmutableTimeLockDeprecatedConfiguration.Builder deprecatedBuilder = ImmutableTimeLockDeprecatedConfiguration.builder(); if (config.timeLimiterConfiguration().enableTimeLimiting()) { deprecatedBuilder.useLockTimeLimiter(true); deprecatedBuilder.blockingTimeoutInMs( BlockingTimeouts.getBlockingTimeout(environment.getObjectMapper(), config)); } if (config.useClientRequestLimit()) { deprecatedBuilder.useClientRequestLimit(true); deprecatedBuilder.availableThreads(config.availableThreads()); } return deprecatedBuilder.build(); } }
@Test public void scaleForErrorMarginScalesProportionalToTimeoutValue() { assertThat(BlockingTimeouts.scaleForErrorMargin(FIVE_HUNDRED, TEST_ERROR_MARGIN)) .isGreaterThan(0) .isEqualTo(scaleForErrorMarginReferenceImplementation(FIVE_HUNDRED, TEST_ERROR_MARGIN)); }