All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mongodb.internal.TimeoutSettings Maven / Gradle / Ivy

/*
 * Copyright 2008-present MongoDB, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.mongodb.internal;

import com.mongodb.MongoClientSettings;
import com.mongodb.lang.Nullable;

import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import static com.mongodb.assertions.Assertions.isTrueArgument;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

/**
 * Timeout Settings.
 *
 * 

Includes all client based timeouts

*/ public class TimeoutSettings { private static final AtomicLong NEXT_ID = new AtomicLong(0); private final long generationId; private final long serverSelectionTimeoutMS; private final long connectTimeoutMS; @Nullable private final Long timeoutMS; // Deprecated configuration timeout options private final long readTimeoutMS; // aka socketTimeoutMS private final long maxWaitTimeMS; // aka waitQueueTimeoutMS @Nullable private final Long wTimeoutMS; // Deprecated options for CRUD methods private final long maxTimeMS; private final long maxAwaitTimeMS; @Nullable private final Long maxCommitTimeMS; public static final TimeoutSettings DEFAULT = create(MongoClientSettings.builder().build()); @Nullable public static Long convertAndValidateTimeoutNullable(@Nullable final Long timeout, final TimeUnit timeUnit) { return timeout == null ? null : convertAndValidateTimeout(timeout, timeUnit, "timeout"); } public static long convertAndValidateTimeout(final long timeout, final TimeUnit timeUnit) { return convertAndValidateTimeout(timeout, timeUnit, "timeout"); } public static long convertAndValidateTimeout(final long timeout, final TimeUnit timeUnit, final String fieldName) { return isTrueArgument(fieldName + " was too small. After conversion it was rounded to 0 milliseconds, " + " which would result in an unintended infinite timeout.", () -> MILLISECONDS.convert(timeout, timeUnit), (timeoutMS) -> timeout == 0 && timeoutMS == 0 || timeoutMS > 0); } @SuppressWarnings("deprecation") public static TimeoutSettings create(final MongoClientSettings settings) { return new TimeoutSettings( settings.getClusterSettings().getServerSelectionTimeout(TimeUnit.MILLISECONDS), settings.getSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS), settings.getSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS), settings.getTimeout(TimeUnit.MILLISECONDS), settings.getConnectionPoolSettings().getMaxWaitTime(TimeUnit.MILLISECONDS)); } public static TimeoutSettings createHeartbeatSettings(final MongoClientSettings settings) { return new TimeoutSettings( settings.getClusterSettings().getServerSelectionTimeout(TimeUnit.MILLISECONDS), settings.getHeartbeatSocketSettings().getConnectTimeout(TimeUnit.MILLISECONDS), settings.getHeartbeatSocketSettings().getReadTimeout(TimeUnit.MILLISECONDS), settings.getTimeout(TimeUnit.MILLISECONDS), settings.getConnectionPoolSettings().getMaxWaitTime(TimeUnit.MILLISECONDS)); } public TimeoutSettings(final long serverSelectionTimeoutMS, final long connectTimeoutMS, final long readTimeoutMS, @Nullable final Long timeoutMS, final long maxWaitTimeMS) { this(-1, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, 0, 0, null, null, maxWaitTimeMS); } TimeoutSettings(@Nullable final Long timeoutMS, final long serverSelectionTimeoutMS, final long connectTimeoutMS, final long readTimeoutMS, final long maxAwaitTimeMS, final long maxTimeMS, @Nullable final Long maxCommitTimeMS, @Nullable final Long wTimeoutMS, final long maxWaitTimeMS) { this(timeoutMS != null ? NEXT_ID.incrementAndGet() : -1, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } private TimeoutSettings(final long generationId, @Nullable final Long timeoutMS, final long serverSelectionTimeoutMS, final long connectTimeoutMS, final long readTimeoutMS, final long maxAwaitTimeMS, final long maxTimeMS, @Nullable final Long maxCommitTimeMS, @Nullable final Long wTimeoutMS, final long maxWaitTimeMS) { isTrueArgument("timeoutMS must be >= 0", timeoutMS == null || timeoutMS >= 0); isTrueArgument("maxAwaitTimeMS must be >= 0", maxAwaitTimeMS >= 0); isTrueArgument("maxTimeMS must be >= 0", maxTimeMS >= 0); isTrueArgument("timeoutMS must be greater than maxAwaitTimeMS", timeoutMS == null || timeoutMS == 0 || timeoutMS > maxAwaitTimeMS); isTrueArgument("maxCommitTimeMS must be >= 0", maxCommitTimeMS == null || maxCommitTimeMS >= 0); this.generationId = generationId; this.serverSelectionTimeoutMS = serverSelectionTimeoutMS; this.connectTimeoutMS = connectTimeoutMS; this.timeoutMS = timeoutMS; this.maxAwaitTimeMS = maxAwaitTimeMS; this.readTimeoutMS = readTimeoutMS; this.maxTimeMS = maxTimeMS; this.maxCommitTimeMS = maxCommitTimeMS; this.wTimeoutMS = wTimeoutMS; this.maxWaitTimeMS = maxWaitTimeMS; } public TimeoutSettings connectionOnly() { return new TimeoutSettings(serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, null, maxWaitTimeMS); } public TimeoutSettings withTimeout(@Nullable final Long timeout, final TimeUnit timeUnit) { return withTimeoutMS(convertAndValidateTimeoutNullable(timeout, timeUnit)); } TimeoutSettings withTimeoutMS(@Nullable final Long timeoutMS) { return new TimeoutSettings(timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withMaxTimeMS(final long maxTimeMS) { return new TimeoutSettings(generationId, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withMaxAwaitTimeMS(final long maxAwaitTimeMS) { return new TimeoutSettings(generationId, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withMaxTimeAndMaxAwaitTimeMS(final long maxTimeMS, final long maxAwaitTimeMS) { return new TimeoutSettings(generationId, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withMaxCommitMS(@Nullable final Long maxCommitTimeMS) { return new TimeoutSettings(generationId, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withWTimeoutMS(@Nullable final Long wTimeoutMS) { return new TimeoutSettings(timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withReadTimeoutMS(final long readTimeoutMS) { return new TimeoutSettings(generationId, timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withServerSelectionTimeoutMS(final long serverSelectionTimeoutMS) { return new TimeoutSettings(timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public TimeoutSettings withMaxWaitTimeMS(final long maxWaitTimeMS) { return new TimeoutSettings(timeoutMS, serverSelectionTimeoutMS, connectTimeoutMS, readTimeoutMS, maxAwaitTimeMS, maxTimeMS, maxCommitTimeMS, wTimeoutMS, maxWaitTimeMS); } public long getServerSelectionTimeoutMS() { return serverSelectionTimeoutMS; } public long getConnectTimeoutMS() { return connectTimeoutMS; } @Nullable public Long getTimeoutMS() { return timeoutMS; } public long getMaxAwaitTimeMS() { return maxAwaitTimeMS; } public long getReadTimeoutMS() { return readTimeoutMS; } public long getMaxTimeMS() { return maxTimeMS; } @Nullable public Long getWTimeoutMS() { return wTimeoutMS; } public long getMaxWaitTimeMS() { return maxWaitTimeMS; } @Nullable public Long getMaxCommitTimeMS() { return maxCommitTimeMS; } /** * The generation id represents a creation counter for {@code TimeoutSettings} that contain a {@code timeoutMS} value. * *

This is used to determine if a new set of {@code TimeoutSettings} has been created within a {@code withTransaction} * block, so that a client side error can be issued.

* * @return the generation id or -1 if no timeout MS is set. */ public long getGenerationId() { return generationId; } @Override public String toString() { return "TimeoutSettings{" + "generationId=" + generationId + ", timeoutMS=" + timeoutMS + ", serverSelectionTimeoutMS=" + serverSelectionTimeoutMS + ", connectTimeoutMS=" + connectTimeoutMS + ", readTimeoutMS=" + readTimeoutMS + ", maxWaitTimeMS=" + maxWaitTimeMS + ", wTimeoutMS=" + wTimeoutMS + ", maxTimeMS=" + maxTimeMS + ", maxAwaitTimeMS=" + maxAwaitTimeMS + ", maxCommitTimeMS=" + maxCommitTimeMS + '}'; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final TimeoutSettings that = (TimeoutSettings) o; return serverSelectionTimeoutMS == that.serverSelectionTimeoutMS && connectTimeoutMS == that.connectTimeoutMS && readTimeoutMS == that.readTimeoutMS && maxWaitTimeMS == that.maxWaitTimeMS && maxTimeMS == that.maxTimeMS && maxAwaitTimeMS == that.maxAwaitTimeMS && Objects.equals(timeoutMS, that.timeoutMS) && Objects.equals(wTimeoutMS, that.wTimeoutMS) && Objects.equals(maxCommitTimeMS, that.maxCommitTimeMS); } @Override public int hashCode() { return Objects.hash(generationId, serverSelectionTimeoutMS, connectTimeoutMS, timeoutMS, readTimeoutMS, maxWaitTimeMS, wTimeoutMS, maxTimeMS, maxAwaitTimeMS, maxCommitTimeMS); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy