From 0bb32e1a3cd322c534d7cb0daee8c2dda9151310 Mon Sep 17 00:00:00 2001 From: David Noble Date: Fri, 8 Nov 2019 16:15:11 -0800 Subject: [PATCH 01/32] Corrected package misspelling in log4j.properties, removed System.exit from Main.java, and attempted to address a memory leak in the RntbdRequestTimer --- .../java/com/azure/cosmos/benchmark/Main.java | 2 -- .../src/main/resources/log4j.properties | 4 +-- .../rntbd/RntbdClientChannelHandler.java | 2 +- .../rntbd/RntbdRequestManager.java | 2 -- .../rntbd/RntbdRequestRecord.java | 13 ++++----- .../rntbd/RntbdRequestTimer.java | 27 ++++++++++++++----- .../rntbd/RntbdTokenStream.java | 2 +- 7 files changed, 32 insertions(+), 20 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java index 81edd063bf8d..e56ea98b7ef7 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java @@ -74,8 +74,6 @@ public static void main(String[] args) throws Exception { System.err.println("INVALID Usage: " + e.getMessage()); System.err.println("Try '-help' for more information."); throw e; - } finally { - System.exit(0); } } } diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties b/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties index 5750c0b8bf36..eed9c4895995 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties @@ -5,8 +5,8 @@ log4j.rootLogger=INFO, Console log4j.category.com.azure.cosmos=INFO log4j.category.com.azure.cosmos.benchmark=INFO log4j.category.com.azure.cosmos.internal=INFO -log4j.category.com.aure.cosmos.internal.caches=INFO -log4j.category.com.aure.cosmos.internal.changefeed=INFO +log4j.category.com.azure.cosmos.internal.caches=INFO +log4j.category.com.azure.cosmos.internal.changefeed=INFO log4j.category.com.azure.cosmos.internal.directconnectivity=INFO log4j.category.com.azure.cosmos.internal.directconnectivity.rntbd=INFO log4j.category.com.azure.cosmos.internal.http=INFO diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdClientChannelHandler.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdClientChannelHandler.java index 6d72ce01c43f..435709630ec6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdClientChannelHandler.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdClientChannelHandler.java @@ -25,8 +25,8 @@ public class RntbdClientChannelHandler extends ChannelInitializer imple private static final AttributeKey REQUEST_MANAGER = AttributeKey.newInstance("requestManager"); private static final Logger logger = LoggerFactory.getLogger(RntbdClientChannelHandler.class); - private final Config config; private final ChannelHealthChecker healthChecker; + private final Config config; RntbdClientChannelHandler(final Config config, final ChannelHealthChecker healthChecker) { checkNotNull(healthChecker, "expected non-null healthChecker"); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestManager.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestManager.java index 2da46db269dd..7321f1967004 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestManager.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestManager.java @@ -576,8 +576,6 @@ private RntbdRequestArgs addPendingRequestRecord(final ChannelHandlerContext con } }); - boolean done = record.isDone(); - record.whenComplete((response, error) -> { this.pendingRequests.remove(id); pendingRequestTimeout.cancel(); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestRecord.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestRecord.java index 9f1f6328cd43..52d87287ea1c 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestRecord.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestRecord.java @@ -30,7 +30,7 @@ public final class RntbdRequestRecord extends CompletableFuture { private static final AtomicReferenceFieldUpdater - stateUpdater = AtomicReferenceFieldUpdater.newUpdater(RntbdRequestRecord.class, Stage.class, "stage"); + stageUpdater = AtomicReferenceFieldUpdater.newUpdater(RntbdRequestRecord.class, Stage.class, "stage"); private final RntbdRequestArgs args; private final RntbdRequestTimer timer; @@ -74,13 +74,12 @@ public Timeout newTimeout(final TimerTask task) { return this.timer.newTimeout(task); } - @JsonProperty public Stage stage() { - return stateUpdater.get(this); + return stageUpdater.get(this); } public RntbdRequestRecord stage(Stage value) { - stateUpdater.set(this, value); + stageUpdater.set(this, value); return this; } @@ -120,8 +119,10 @@ static final class JsonSerializer extends StdSerializer { } @Override - public void serialize(final RntbdRequestRecord value, final JsonGenerator generator, - final SerializerProvider provider) throws IOException { + public void serialize( + final RntbdRequestRecord value, + final JsonGenerator generator, + final SerializerProvider provider) throws IOException { generator.writeStartObject(); generator.writeObjectFieldStart("status"); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestTimer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestTimer.java index 328a0ddb0a5e..a407ad18116a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestTimer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdRequestTimer.java @@ -13,6 +13,8 @@ import java.util.Set; import java.util.concurrent.TimeUnit; +import static com.google.common.base.Strings.lenientFormat; + public final class RntbdRequestTimer implements AutoCloseable { private static final long FIVE_MILLISECONDS = 5000000L; @@ -22,11 +24,9 @@ public final class RntbdRequestTimer implements AutoCloseable { private final Timer timer; public RntbdRequestTimer(final long requestTimeout) { - // Inspection of the HashWheelTimer code indicates that our choice of a 5 millisecond timer resolution ensures // a request will expire within 10 milliseconds of the specified requestTimeout interval. This is because // cancellation of a timeout takes two timer resolution units to complete. - this.timer = new HashedWheelTimer(FIVE_MILLISECONDS, TimeUnit.NANOSECONDS); this.requestTimeout = requestTimeout; } @@ -37,13 +37,28 @@ public long getRequestTimeout(final TimeUnit unit) { @Override public void close() { + final Set timeouts = this.timer.stop(); - if (logger.isDebugEnabled()) { - final int count = timeouts.size(); - if (count > 0) { - logger.debug("request expiration tasks cancelled: {}", count); + final int count = timeouts.size(); + + if (count == 0) { + logger.debug("no outstanding request timeout tasks"); + return; + } + + logger.debug("stopping {} request timeout tasks", count); + + for (final Timeout timeout : timeouts) { + if (!timeout.isExpired()) { + try { + timeout.task().run(timeout); + } catch (Throwable error) { + logger.warn(lenientFormat("request timeout task failed due to ", error)); + } } } + + logger.debug("{} request timeout tasks stopped", count); } public Timeout newTimeout(final TimerTask task) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdTokenStream.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdTokenStream.java index bb06a881ddfe..38bf51f4cde0 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdTokenStream.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/internal/directconnectivity/rntbd/RntbdTokenStream.java @@ -60,7 +60,7 @@ final int computeLength() { static > T decode(final T stream) { - ByteBuf in = stream.in; + final ByteBuf in = stream.in; while (in.readableBytes() > 0) { From 30f5fd32f948a5c901226219516ad61b420b01b5 Mon Sep 17 00:00:00 2001 From: David Noble Date: Fri, 8 Nov 2019 23:45:05 -0800 Subject: [PATCH 02/32] Fixed a merge error and resolved #5043, Variables that specify time in long or int value should specify units --- .../main/java/com/azure/cosmos/benchmark/Main.java | 3 --- .../rntbd/RntbdClientChannelHandler.java | 6 +++--- .../rntbd/RntbdClientChannelHealthChecker.java | 6 +++--- .../rntbd/RntbdClientChannelPool.java | 2 +- .../directconnectivity/rntbd/RntbdEndpoint.java | 14 +++++++------- .../rntbd/RntbdServiceEndpoint.java | 9 +++++---- .../RntbdTransportClientTest.java | 2 +- 7 files changed, 20 insertions(+), 22 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java index 7f900a5a20b8..3cdea57c6dec 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/Main.java @@ -72,13 +72,10 @@ public static void main(String[] args) throws Exception { System.err.println("INVALID Usage: " + e.getMessage()); System.err.println("Try '-help' for more information."); throw e; -<<<<<<< HEAD -======= } finally { if (benchmark != null) { benchmark.shutdown(); } ->>>>>>> dfb3f436eeaae112d2e33dc14d7668be31ca75a6 } } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHandler.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHandler.java index c05a11feb5e9..5518a6e4b3c4 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHandler.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHandler.java @@ -96,9 +96,9 @@ protected void initChannel(final Channel channel) { checkNotNull(channel); final RntbdRequestManager requestManager = new RntbdRequestManager(this.healthChecker, this.config.maxRequestsPerChannel()); - final long readerIdleTime = this.config.receiveHangDetectionTime(); - final long writerIdleTime = this.config.sendHangDetectionTime(); - final long allIdleTime = this.config.idleConnectionTimeout(); + final long readerIdleTime = this.config.receiveHangDetectionTimeInNanos(); + final long writerIdleTime = this.config.sendHangDetectionTimeInNanos(); + final long allIdleTime = this.config.idleConnectionTimeoutInNanos(); final ChannelPipeline pipeline = channel.pipeline(); pipeline.addFirst( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java index 7c0efb45b1aa..c844c3fb1f1a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java @@ -69,12 +69,12 @@ public RntbdClientChannelHealthChecker(final Config config) { checkNotNull(config, "config: null"); - this.idleConnectionTimeout = config.idleConnectionTimeout(); + this.idleConnectionTimeout = config.idleConnectionTimeoutInNanos(); - this.readDelayLimit = config.receiveHangDetectionTime(); + this.readDelayLimit = config.receiveHangDetectionTimeInNanos(); checkArgument(this.readDelayLimit > readHangGracePeriod, "config.receiveHangDetectionTime: %s", this.readDelayLimit); - this.writeDelayLimit = config.sendHangDetectionTime(); + this.writeDelayLimit = config.sendHangDetectionTimeInNanos(); checkArgument(this.writeDelayLimit > writeHangGracePeriod, "config.sendHangDetectionTime: %s", this.writeDelayLimit); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java index 9130ddcbc683..6814916f1b77 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java @@ -146,7 +146,7 @@ public void onTimeout(AcquireTask task) { } } - final long idleEndpointTimeout = config.idleEndpointTimeout(); + final long idleEndpointTimeout = config.idleEndpointTimeoutInNanos(); this.idleStateDetectionScheduledFuture = this.executor.scheduleAtFixedRate( () -> { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdEndpoint.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdEndpoint.java index c1e19967a6fe..25f8b3f947e6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdEndpoint.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdEndpoint.java @@ -105,19 +105,19 @@ public int bufferPageSize() { } @JsonProperty - public int connectionTimeout() { + public int connectionTimeoutInMillis() { final long value = this.options.connectionTimeout().toMillis(); assert value <= Integer.MAX_VALUE; return (int)value; } @JsonProperty - public long idleConnectionTimeout() { + public long idleConnectionTimeoutInNanos() { return this.options.idleChannelTimeout().toNanos(); } @JsonProperty - public long idleEndpointTimeout() { + public long idleEndpointTimeoutInNanos() { return this.options.idleEndpointTimeout().toNanos(); } @@ -137,22 +137,22 @@ public int maxRequestsPerChannel() { } @JsonProperty - public long receiveHangDetectionTime() { + public long receiveHangDetectionTimeInNanos() { return this.options.receiveHangDetectionTime().toNanos(); } @JsonProperty - public long requestTimeout() { + public long requestTimeoutInNanos() { return this.options.requestTimeout().toNanos(); } @JsonProperty - public long sendHangDetectionTime() { + public long sendHangDetectionTimeInNanos() { return this.options.sendHangDetectionTime().toNanos(); } @JsonProperty - public long shutdownTimeout() { + public long shutdownTimeoutInNanos() { return this.options.shutdownTimeout().toNanos(); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdServiceEndpoint.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdServiceEndpoint.java index e7c6a1e3a83e..ed0602e42d6d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdServiceEndpoint.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdServiceEndpoint.java @@ -48,7 +48,7 @@ public final class RntbdServiceEndpoint implements RntbdEndpoint { // region Fields private static final String TAG_NAME = RntbdServiceEndpoint.class.getSimpleName(); - private static final long QUIET_PERIOD = 2L * 1_000_000_000L; // 2 seconds + private static final long QUIET_PERIOD = 2_000_000_000L; // 2 seconds private static final AtomicLong instanceCount = new AtomicLong(); private static final Logger logger = LoggerFactory.getLogger(RntbdServiceEndpoint.class); @@ -79,7 +79,7 @@ private RntbdServiceEndpoint( .group(group) .option(ChannelOption.ALLOCATOR, config.allocator()) .option(ChannelOption.AUTO_READ, true) - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, config.connectionTimeout()) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, config.connectionTimeoutInMillis()) .option(ChannelOption.RCVBUF_ALLOCATOR, receiveBufferAllocator) .option(ChannelOption.SO_KEEPALIVE, true) .remoteAddress(physicalAddress.getHost(), physicalAddress.getPort()); @@ -330,7 +330,7 @@ public Provider(final RntbdTransportClient transportClient, final Options option this.transportClient = transportClient; this.config = new Config(options, sslContext, wireLogLevel); - this.requestTimer = new RntbdRequestTimer(config.requestTimeout()); + this.requestTimer = new RntbdRequestTimer(config.requestTimeoutInNanos()); this.eventLoopGroup = new NioEventLoopGroup(threadCount, threadFactory); this.endpoints = new ConcurrentHashMap<>(); @@ -349,7 +349,7 @@ public void close() { endpoint.close(); } - this.eventLoopGroup.shutdownGracefully(QUIET_PERIOD, this.config.shutdownTimeout(), NANOSECONDS) + this.eventLoopGroup.shutdownGracefully(QUIET_PERIOD, this.config.shutdownTimeoutInNanos(), NANOSECONDS) .addListener(future -> { if (future.isSuccess()) { logger.debug("\n [{}]\n closed endpoints", this); @@ -357,6 +357,7 @@ public void close() { } logger.error("\n [{}]\n failed to close endpoints due to ", this, future.cause()); }); + return; } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java index d737315ffc1b..576649a303e8 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java @@ -914,7 +914,7 @@ static class Provider implements RntbdEndpoint.Provider { Provider(RntbdTransportClient.Options options, SslContext sslContext, RntbdResponse expected) { this.config = new Config(options, sslContext, LogLevel.WARN); - this.timer = new RntbdRequestTimer(config.requestTimeout()); + this.timer = new RntbdRequestTimer(config.requestTimeoutInNanos()); this.expected = expected; } From 7a9b9471c89c8a0183bc12d0a15f4af308c81f8f Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 9 Nov 2019 01:21:49 -0800 Subject: [PATCH 03/32] Minor code cleanup in RntbdTransportClient --- .../directconnectivity/RntbdTransportClient.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java index 5debbaa660c2..d16f27dde069 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java @@ -256,17 +256,17 @@ public Duration shutdownTimeout() { return this.shutdownTimeout; } - @Override - public String toString() { - return RntbdObjectMapper.toJson(this); + public UserAgentContainer userAgent() { + return this.userAgent; } // endregion // region Methods - public UserAgentContainer userAgent() { - return this.userAgent; + @Override + public String toString() { + return RntbdObjectMapper.toJson(this); } // endregion From 89bed8fd35ed4cd95edafe24079a0b3b4b322534 Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 9 Nov 2019 09:52:50 -0800 Subject: [PATCH 04/32] Fixed a second merge issue --- .../src/main/resources/log4j.properties | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties b/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties index 2dce63d81848..6eb66dcf608a 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/resources/log4j.properties @@ -4,19 +4,6 @@ log4j.rootLogger=INFO, Console log4j.category.com.azure.cosmos=INFO log4j.category.com.azure.cosmos.benchmark=INFO -<<<<<<< HEAD -log4j.category.com.azure.cosmos.internal=INFO -log4j.category.com.azure.cosmos.internal.caches=INFO -log4j.category.com.azure.cosmos.internal.changefeed=INFO -log4j.category.com.azure.cosmos.internal.directconnectivity=INFO -log4j.category.com.azure.cosmos.internal.directconnectivity.rntbd=INFO -log4j.category.com.azure.cosmos.internal.http=INFO -log4j.category.com.azure.cosmos.internal.query=INFO -log4j.category.com.azure.cosmos.internal.query.aggregation=INFO -log4j.category.com.azure.cosmos.internal.query.metrics=INFO -log4j.category.com.azure.cosmos.internal.query.orderbyquery=INFO -log4j.category.com.azure.cosmos.internal.routing=INFO -======= log4j.category.com.azure.cosmos.implementation=INFO log4j.category.com.azure.cosmos.implementation.caches=INFO log4j.category.com.azure.cosmos.implementation.changefeed=INFO @@ -28,7 +15,6 @@ log4j.category.com.azure.cosmos.implementation.query.aggregation=INFO log4j.category.com.azure.cosmos.implementation.query.metrics=INFO log4j.category.com.azure.cosmos.implementation.query.orderbyquery=INFO log4j.category.com.azure.cosmos.implementation.routing=INFO ->>>>>>> dfb3f436eeaae112d2e33dc14d7668be31ca75a6 log4j.category.com.azure.cosmos.implementation.directconnectivity.RntbdTransportClient=INFO log4j.category.com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdRequestManager=INFO From 6430a706d7ffa3c9663acec2895d1f3c93b7faaf Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 12:03:53 -0800 Subject: [PATCH 05/32] Re-enabled all tests --- .../cosmos/rx/examples/ConflictAPITest.java | 3 +- .../rx/examples/DocumentCRUDAsyncAPITest.java | 3 +- .../rx/examples/InMemoryGroupbyTest.java | 3 +- .../rx/examples/UniqueIndexAsyncAPITest.java | 3 +- .../azure/cosmos/CosmosPartitionKeyTests.java | 3 +- .../implementation/ConsistencyTests1.java | 24 +++++-------- .../cosmos/implementation/SessionTest.java | 7 ++-- .../DCDocumentCrudTest.java | 14 ++++---- .../GatewayAddressCacheTest.java | 3 +- ...catedResourceClientPartitionSplitTest.java | 3 +- .../com/azure/cosmos/rx/BackPressureTest.java | 3 +- .../com/azure/cosmos/rx/DocumentCrudTest.java | 7 ++-- .../com/azure/cosmos/rx/LogLevelTest.java | 13 ++++--- .../cosmos/rx/OrderbyDocumentQueryTest.java | 34 +++++++++---------- .../cosmos/rx/ParallelDocumentQueryTest.java | 18 +++++----- .../azure/cosmos/rx/PermissionQueryTest.java | 9 +++-- .../com/azure/cosmos/rx/ProxyHostTest.java | 7 ++-- .../cosmos/rx/ReadFeedDocumentsTest.java | 3 +- .../rx/ReadFeedStoredProceduresTest.java | 3 +- .../azure/cosmos/rx/ReadFeedTriggersTest.java | 3 +- .../com/azure/cosmos/rx/ReadFeedUdfsTest.java | 3 +- .../azure/cosmos/rx/ResourceTokenTest.java | 3 +- .../rx/SinglePartitionDocumentQueryTest.java | 22 ++++++------ .../cosmos/rx/StoredProcedureQueryTest.java | 3 +- .../rx/StoredProcedureUpsertReplaceTest.java | 3 +- .../azure/cosmos/rx/TokenResolverTest.java | 3 +- .../com/azure/cosmos/rx/TopQueryTests.java | 3 +- .../com/azure/cosmos/rx/TriggerCrudTest.java | 3 +- .../com/azure/cosmos/rx/TriggerQueryTest.java | 3 +- .../cosmos/rx/TriggerUpsertReplaceTest.java | 11 +++--- .../rx/UserDefinedFunctionQueryTest.java | 3 +- .../UserDefinedFunctionUpsertReplaceTest.java | 7 ++-- .../com/azure/cosmos/rx/UserQueryTest.java | 5 ++- .../cosmos/rx/VeryLargeDocumentQueryTest.java | 3 +- 34 files changed, 99 insertions(+), 142 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java index b47f0cf94976..07d444ffeab9 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java @@ -41,8 +41,7 @@ * transform a flux to CompletableFuture. Please see * {@link #transformObservableToCompletableFuture()} */ -// FIXME: setup method times out inconsistently -@Ignore +// TODO (DANOBLE) setup method times out inconsistently public class ConflictAPITest extends DocumentClientTest { private final static int TIMEOUT = 60000; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java index 9345ee5a056e..295c4661fb29 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java @@ -68,8 +68,7 @@ * transform a flux to CompletableFuture. Please see * {@link #transformObservableToCompletableFuture()} */ -//FIXME: beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class DocumentCRUDAsyncAPITest extends DocumentClientTest { private final static String PARTITION_KEY_PATH = "/mypk"; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java index d31da1cc9c18..6f32cdcc6bea 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java @@ -28,8 +28,7 @@ import java.util.List; import java.util.UUID; -//FIXME setup method times out occasionally when running against emulator. -@Ignore +// TODO (DANOBLE) setup method times out occasionally when running against emulator. public class InMemoryGroupbyTest extends DocumentClientTest { private final static int TIMEOUT = 60000; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java index 3a45afe39979..864e0b48a3e3 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java @@ -38,8 +38,7 @@ public class UniqueIndexAsyncAPITest extends DocumentClientTest { private AsyncDocumentClient client; private Database createdDatabase; - //FIXME: Times out when running in emulator tests. - @Ignore + // TODO (DANOBLE) Times out when running in emulator tests. @Test(groups = "samples", timeOut = TIMEOUT) public void uniqueIndex() { DocumentCollection collectionDefinition = new DocumentCollection(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java index 74880e4f7ef2..bf5f3d721a50 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java @@ -123,8 +123,7 @@ private void createContainerWithoutPk() throws URISyntaxException, IOException { assertThat(body).contains("\"id\":\"" + NON_PARTITIONED_CONTAINER_DOCUEMNT_ID + "\""); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }) public void testNonPartitionedCollectionOperations() throws Exception { createContainerWithoutPk(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java index 9e3b5e54468d..d7da88a665e8 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java @@ -21,8 +21,7 @@ public class ConsistencyTests1 extends ConsistencyTestsBase { - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateStrongConsistencyOnSyncReplication() throws Exception { if (!TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.STRONG.toString())) { @@ -133,22 +132,19 @@ public void validateConsistentLSNAndQuorumAckedLSNForDirectHttpsClient() { validateConsistentLSNAndQuorumAckedLSN(); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateStrongConsistencyOnAsyncReplicationGW() throws InterruptedException { validateStrongConsistencyOnAsyncReplication(true); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateStrongConsistencyOnAsyncReplicationDirect() throws InterruptedException { validateStrongConsistencyOnAsyncReplication(false); } - //FIXME: test is flaky, fails inconsistently - @Ignore + // TODO (DANOBLE) test is flaky, fails inconsistently @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateSessionContainerAfterCollectionCreateReplace() { //TODO Need to test with TCP protocol @@ -158,8 +154,7 @@ public void validateSessionContainerAfterCollectionCreateReplace() { validateSessionContainerAfterCollectionCreateReplace(true); } - // FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateConsistentPrefixOnSyncReplication() throws InterruptedException { if (!(TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.STRONG.toString()) || TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.BOUNDED_STALENESS.toString()))) { @@ -182,8 +177,7 @@ public void validateConsistentPrefixOnSyncReplication() throws InterruptedExcept assertThat(readLagging).isFalse(); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateConsistentPrefixOnAsyncReplication() throws InterruptedException { if (!(TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.STRONG.toString()) || TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.BOUNDED_STALENESS.toString()))) { @@ -211,14 +205,14 @@ public void validateConsistentPrefixOnAsyncReplication() throws InterruptedExcep @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT, enabled = false) public void validateConsistentPrefixWithReplicaRestartWithPause() { - //TODO this need to complete once we implement emulator container in java, and the we can do operation + //TODO this need to complete once we implement emulator container in java, and the we can do operation // like pause, resume, stop, recycle on it needed for this test. // https://msdata.visualstudio.com/CosmosDB/_workitems/edit/355053 } @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT, enabled = false) public void validateConsistentPrefixWithReplicaRestart() { - //TODO this need to complete once we implement emulator container in java, and the we can do operation + //TODO this need to complete once we implement emulator container in java, and the we can do operation // like pause, resume, stop, recycle on it needed for this test. // https://msdata.visualstudio.com/CosmosDB/_workitems/edit/355053 } @@ -231,7 +225,7 @@ public void validateSubstatusCodeOnNotFoundExceptionInSessionReadAsync() { @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT, enabled = false) public void validateBarrierStrongConsistencyForMasterResources() { - //TODO this need to complete once we implement emulator container in java, and the we can do operation + //TODO this need to complete once we implement emulator container in java, and the we can do operation // like pause, resume, stop, recycle on it needed for this test. // https://msdata.visualstudio.com/CosmosDB/_workitems/edit/355053 } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java index 9e956a5c776a..c9b3711df1de 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java @@ -98,15 +98,14 @@ private List getSessionTokensInRequests() { .map(r -> r.headers().value(HttpConstants.HttpHeaders.SESSION_TOKEN)).collect(Collectors.toList()); } - //FIXME: Test flakes inconsistently with assertion error - @Ignore + // TODO (DANOBLE) Test flakes inconsistently with assertion error @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "sessionTestArgProvider") public void sessionConsistency_ReadYourWrites(boolean isNameBased) { spyClient.readCollection(getCollectionLink(isNameBased), null).blockFirst(); spyClient.createDocument(getCollectionLink(isNameBased), new Document(), null, false).blockFirst(); spyClient.clearCapturedRequests(); - + for (int i = 0; i < 10; i++) { Document documentCreated = spyClient.createDocument(getCollectionLink(isNameBased), new Document(), null, false) .blockFirst().getResource(); @@ -182,7 +181,7 @@ private String getCollectionLink(boolean isNameBased) { return isNameBased ? "dbs/" + createdDatabase.getId() + "/colls/" + createdCollection.getId(): createdCollection.getSelfLink(); } - + private String getDocumentLink(Document doc, boolean isNameBased) { return isNameBased ? "dbs/" + createdDatabase.getId() + "/colls/" + createdCollection.getId() + "/docs/" + doc.getId() : "dbs/" + createdDatabase.getResourceId() + "/colls/" + createdCollection.getResourceId() + "/docs/" + doc.getResourceId() + "/"; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java index 733de355d03c..085dbdb8632e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java @@ -33,7 +33,6 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Factory; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; @@ -52,7 +51,7 @@ * The tests in other test classes validate the actual behaviour and different scenarios. */ public class DCDocumentCrudTest extends TestSuiteBase { - + private final static int QUERY_TIMEOUT = 40000; private final static String PARTITION_KEY_FIELD_NAME = "mypk"; @@ -191,17 +190,16 @@ public void upsert() throws Exception { String propName = "newProp"; String propValue = "hello"; BridgeInternal.setProperty(document, propName, propValue); - + ResourceResponseValidator validator = ResourceResponseValidator.builder() - .withProperty(propName, propValue) - .build(); + .withProperty(propName, propValue) + .build(); validateSuccess(client.upsertDocument(getCollectionLink(), document, options, false), validator, TIMEOUT); validateNoDocumentOperationThroughGateway(); } - //FIXME: Times out - @Ignore + // TODO (DANOBLE) Times out @Test(groups = { "direct" }, timeOut = QUERY_TIMEOUT) public void crossPartitionQuery() { @@ -319,5 +317,5 @@ private Document getDocumentDefinition() { BridgeInternal.setProperty(doc, "name", "Hafez"); return doc; } - + } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java index 0d4da1ad8ff0..0624ab260bf3 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java @@ -519,8 +519,7 @@ public void tryGetAddresses_ForMasterPartition_MasterPartitionAddressAlreadyCach assertThat(clientWrapper.capturedRequests).asList().hasSize(0); } - //FIXME times out inconsistently - @Ignore + // TODO (DANOBLE) times out inconsistently @Test(groups = { "direct" }, timeOut = TIMEOUT) public void tryGetAddresses_ForMasterPartition_ForceRefresh() throws Exception { Configs configs = new Configs(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java index 5545af1883a2..567568fe9347 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java @@ -44,8 +44,7 @@ public Object[][] partitionIsSplittingArgProvider() { }; } - //FIXME test times out inconsistently - @Ignore + // TODO (DANOBLE) test times out inconsistently @Test(groups = { "unit" }, dataProvider = "partitionIsSplittingArgProvider", timeOut = TIMEOUT) public void partitionSplit_RefreshCache_Read(ConsistencyLevel consistencyLevel, int partitionIsSplitting) { URI secondary1AddressBeforeMove = URI.create("secondary"); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java index bd99b19dd72a..990e5cf5c15c 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java @@ -34,8 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; -// FIXME: beforeClass method times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass method times out inconsistently public class BackPressureTest extends TestSuiteBase { private static final int TIMEOUT = 200000; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java index 1957b217a797..11b77318abc4 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java @@ -50,7 +50,7 @@ public Object[][] documentCrudArgProvider() { { "+ -_,:.|~" + UUID.randomUUID().toString() + " +-_,:.|~" }, }; } - + @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void createDocument(String documentId) throws InterruptedException { @@ -159,8 +159,7 @@ public void readDocument(String documentId) throws InterruptedException { validateSuccess(readObservable, validator); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void timestamp(String documentId) throws Exception { OffsetDateTime before = OffsetDateTime.now(); @@ -277,7 +276,7 @@ public void replaceDocument(String documentId) throws InterruptedException { options.setPartitionKey(new PartitionKey(docDefinition.get("mypk"))); // replace document Mono replaceObservable = document.replace(docDefinition, options); - + // validate CosmosResponseValidator validator = new CosmosResponseValidator.Builder() .withProperty("newProp", newPropValue).build(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java index dfe7b4b32e0b..90d6f8de9cfe 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java @@ -53,7 +53,7 @@ public void beforeClass() { /** * This test will try to create document with netty wire DEBUG logging and * validate it. - * + * * @throws Exception */ @Test(groups = { "simple" }, timeOut = TIMEOUT) @@ -82,7 +82,7 @@ public void createDocumentWithDebugLevel() throws Exception { /** * This test will try to create document with netty wire WARN logging and * validate it. - * + * * @throws Exception */ @Test(groups = { "simple" }, timeOut = TIMEOUT) @@ -111,11 +111,10 @@ public void createDocumentWithWarningLevel() throws Exception { /** * This test will try to create document with netty wire TRACE logging and * validate it. - * + * * @throws Exception */ - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithTraceLevel() throws Exception { LogManager.getRootLogger().setLevel(Level.INFO); @@ -197,7 +196,7 @@ public void createDocumentWithDebugLevelAtRoot() throws Exception { /** * This test will try to create document with netty wire ERROR logging and * validate it. - * + * * @throws Exception */ @Test(groups = { "simple" }, timeOut = TIMEOUT) @@ -226,7 +225,7 @@ public void createDocumentWithErrorClient() throws Exception { /** * This test will try to create document with netty wire INFO logging and * validate it. - * + * * @throws Exception */ @Test(groups = { "simple" }, timeOut = TIMEOUT) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java index 32855627cb02..f5ad31c384cd 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java @@ -50,8 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; -//FIXME beforeClass times out inconsistently. -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently. public class OrderbyDocumentQueryTest extends TestSuiteBase { private final double minQueryRequestChargePerPartition = 2.0; @@ -67,8 +66,7 @@ public OrderbyDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - //FIXME test times out inconsistently - @Ignore + // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocumentsValidateContent(boolean qmEnabled) throws Exception { CosmosItemProperties expectedDocument = createdDocuments.get(0); @@ -219,7 +217,7 @@ public void queryOrderWithTop(int topValue) throws Exception { Comparator validatorComparator = Comparator.nullsFirst(Comparator.naturalOrder()); - List expectedResourceIds = + List expectedResourceIds = sortDocumentsAndCollectResourceIds("propInt", d -> d.getInt("propInt"), validatorComparator) .stream().limit(topValue).collect(Collectors.toList()); @@ -297,10 +295,10 @@ public void queryScopedToSinglePartition_StartWithContinuationToken() throws Exc .allPagesSatisfy(new FeedResponseValidator.Builder() .requestChargeGreaterThanOrEqualTo(1.0).build()) .build(); - + validateQuerySuccess(queryObservable, validator); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void orderByContinuationTokenRoundTrip() throws Exception { { @@ -314,7 +312,7 @@ public void orderByContinuationTokenRoundTrip() throws Exception { false); String serialized = orderByContinuationToken.toString(); ValueHolder outOrderByContinuationToken = new ValueHolder(); - + assertThat(OrderByContinuationToken.tryParse(serialized, outOrderByContinuationToken)).isTrue(); OrderByContinuationToken deserialized = outOrderByContinuationToken.v; CompositeContinuationToken compositeContinuationToken = deserialized.getCompositeContinuationToken(); @@ -325,19 +323,19 @@ public void orderByContinuationTokenRoundTrip() throws Exception { assertThat(range.getMax()).isEqualTo("D"); assertThat(range.isMinInclusive()).isEqualTo(false); assertThat(range.isMaxInclusive()).isEqualTo(true); - + QueryItem[] orderByItems = deserialized.getOrderByItems(); assertThat(orderByItems).isNotNull(); assertThat(orderByItems.length).isEqualTo(1); assertThat(orderByItems[0].getItem()).isEqualTo(42); - + String rid = deserialized.getRid(); assertThat(rid).isEqualTo("rid"); - + boolean inclusive = deserialized.getInclusive(); assertThat(inclusive).isEqualTo(false); } - + { // Negative ValueHolder outOrderByContinuationToken = new ValueHolder(); @@ -353,20 +351,20 @@ public void queryDocumentsWithOrderByContinuationTokensInteger(String sortOrder) // Get Expected Comparator order = sortOrder.equals("ASC")?Comparator.naturalOrder():Comparator.reverseOrder(); Comparator validatorComparator = Comparator.nullsFirst(order); - + List expectedResourceIds = sortDocumentsAndCollectResourceIds("propInt", d -> d.getInt("propInt"), validatorComparator); this.queryWithContinuationTokensAndPageSizes(query, new int[] { 1, 5, 10, 100}, expectedResourceIds); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT * 10, dataProvider = "sortOrder") public void queryDocumentsWithOrderByContinuationTokensString(String sortOrder) throws Exception { // Get Actual String query = String.format("SELECT * FROM c ORDER BY c.id %s", sortOrder); - + // Get Expected Comparator order = sortOrder.equals("ASC")?Comparator.naturalOrder():Comparator.reverseOrder(); Comparator validatorComparator = Comparator.nullsFirst(order); - + List expectedResourceIds = sortDocumentsAndCollectResourceIds("id", d -> d.getString("id"), validatorComparator); this.queryWithContinuationTokensAndPageSizes(query, new int[] { 1, 5, 10, 100 }, expectedResourceIds); } @@ -455,7 +453,7 @@ public void beforeClass() throws Exception { public void afterClass() { safeClose(client); } - + private void assertInvalidContinuationToken(String query, int[] pageSize, List expectedIds) { String requestContinuation = null; do { @@ -481,7 +479,7 @@ private void assertInvalidContinuationToken(String query, int[] pageSize, List expectedIds) { for (int pageSize : pageSizes) { List receivedDocuments = this.queryWithContinuationTokens(query, pageSize); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java index 2f3ce07cb2ae..28a132d844d5 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java @@ -40,8 +40,7 @@ import static com.azure.cosmos.CommonsBridgeInternal.partitionKeyRangeIdInternal; import static org.assertj.core.api.Assertions.assertThat; -//FIXME beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class ParallelDocumentQueryTest extends TestSuiteBase { private CosmosAsyncDatabase createdDatabase; private CosmosAsyncContainer createdCollection; @@ -66,8 +65,7 @@ public Object[][] queryMetricsArgProvider() { }; } - //FIXME test times out inconsistently - @Ignore + // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocuments(boolean qmEnabled) { String query = "SELECT * from c where c.prop = 99"; @@ -221,7 +219,7 @@ public void partitionKeyRangeId() { assertThat(sum).isEqualTo(createdDocuments.size()); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void compositeContinuationTokenRoundTrip() throws Exception { { @@ -241,14 +239,14 @@ public void compositeContinuationTokenRoundTrip() throws Exception { assertThat(range.isMinInclusive()).isEqualTo(false); assertThat(range.isMaxInclusive()).isEqualTo(true); } - + { // Negative ValueHolder outCompositeContinuationToken = new ValueHolder(); boolean succeeed = CompositeContinuationToken.tryParse("{\"property\" : \"not a valid composite continuation token\"}", outCompositeContinuationToken); assertThat(succeeed).isFalse(); } - + { // Negative - GATEWAY composite continuation token ValueHolder outCompositeContinuationToken = new ValueHolder(); @@ -261,11 +259,11 @@ public void compositeContinuationTokenRoundTrip() throws Exception { @Test(groups = { "non-emulator" }, timeOut = TIMEOUT * 10) public void queryDocumentsWithCompositeContinuationTokens() throws Exception { String query = "SELECT * FROM c"; - + // Get Expected List expectedDocs = new ArrayList<>(createdDocuments); assertThat(expectedDocs).isNotEmpty(); - + this.queryWithContinuationTokensAndPageSizes(query, new int[] {1, 10, 100}, expectedDocs); } @@ -325,7 +323,7 @@ public CosmosItemProperties createDocument(CosmosAsyncContainer cosmosContainer, return cosmosContainer.createItem(docDefinition).block().getProperties(); } - + private void queryWithContinuationTokensAndPageSizes(String query, int[] pageSizes, List expectedDocs) { for (int pageSize : pageSizes) { List receivedDocuments = this.queryWithContinuationTokens(query, pageSize); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java index f68771ea8ece..3621f0e40663 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java @@ -30,9 +30,8 @@ import static org.assertj.core.api.Assertions.assertThat; -//TODO: change to use external TestSuiteBase -//FIXME beforeClass times out inconsistently -@Ignore +// TODO: change to use external TestSuiteBase +// TODO (DANOBLE) beforeClass times out inconsistently public class PermissionQueryTest extends TestSuiteBase { public final String databaseId = DatabaseForTest.generateId(); @@ -163,12 +162,12 @@ private static User getUserDefinition() { public Permission createPermissions(AsyncDocumentClient client, int index) { DocumentCollection collection = new DocumentCollection(); collection.setId(UUID.randomUUID().toString()); - + Permission permission = new Permission(); permission.setId(UUID.randomUUID().toString()); permission.setPermissionMode(PermissionMode.READ); permission.setResourceLink("dbs/AQAAAA==/colls/AQAAAJ0fgT" + Integer.toString(index) + "="); - + return client.createPermission(getUserLink(), permission, null).single().block().getResource(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java index 0b4f43e4bc51..694eb81a6beb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java @@ -37,7 +37,7 @@ /** * This class help to test proxy host feature scenarios where user can provide proxy * host server during AsyncDocumentClient initialization and all its request will - * go through that particular host. + * go through that particular host. * */ public class ProxyHostTest extends TestSuiteBase { @@ -67,7 +67,7 @@ public void beforeClass() throws Exception { /** * This test will try to create document via http proxy server and validate it. - * + * * @throws Exception */ @Test(groups = { "simple" }, timeOut = TIMEOUT) @@ -97,8 +97,7 @@ public void createDocumentWithValidHttpProxy() throws Exception { * * @throws Exception */ - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithValidHttpProxyWithNettyWireLogging() throws Exception { LogManager.getRootLogger().setLevel(Level.INFO); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java index 695967c8dd80..0a63f2026f4a 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java @@ -25,8 +25,7 @@ import java.util.UUID; import java.util.stream.Collectors; -//FIXME: beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class ReadFeedDocumentsTest extends TestSuiteBase { private CosmosAsyncDatabase createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java index c2737daf0e8c..44853a7ed4dd 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java @@ -23,8 +23,7 @@ import java.util.UUID; import java.util.stream.Collectors; -//FIXME beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class ReadFeedStoredProceduresTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java index 9c0f877e0785..d866a37ea385 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java @@ -24,8 +24,7 @@ import java.util.UUID; import java.util.stream.Collectors; -//FIXME beforeClass times out inconsistently. -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently. public class ReadFeedTriggersTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java index 371f1e6e9388..5cdc55f033c2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java @@ -23,8 +23,7 @@ import java.util.UUID; import java.util.stream.Collectors; -//FIXME beforeClass times out. -@Ignore +// TODO (DANOBLE) beforeClass times out. public class ReadFeedUdfsTest extends TestSuiteBase { private Database createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java index 366d045442b7..96af7f682337 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java @@ -40,8 +40,7 @@ * */ -// TODO: change to use external TestSuiteBase -@Ignore +// TODO (DANOBLE) change to use external TestSuiteBase public class ResourceTokenTest extends TestSuiteBase { public final String databaseId = DatabaseForTest.generateId(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java index 4b1f12d855ee..f23cc548cec9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java @@ -33,8 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; -// FIXME beforeclass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeclass times out inconsistently public class SinglePartitionDocumentQueryTest extends TestSuiteBase { private Database createdDatabase; @@ -52,8 +51,7 @@ public SinglePartitionDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocuments(boolean queryMetricsEnabled) throws Exception { @@ -87,7 +85,7 @@ public void queryDocuments_ParameterizedQueryWithInClause() throws Exception { String query = "SELECT * from c where c.prop IN (@param1, @param2)"; SqlParameterList params = new SqlParameterList(new SqlParameter("@param1", 3), new SqlParameter("@param2", 4)); SqlQuerySpec sqs = new SqlQuerySpec(query, params); - + FeedOptions options = new FeedOptions(); options.maxItemCount(5); options.setEnableCrossPartitionQuery(true); @@ -210,20 +208,20 @@ public void continuationToken() throws Exception { options.setEnableCrossPartitionQuery(true); options.maxItemCount(3); Flux> queryObservable = createdCollection.queryItems(query, options); - + TestSubscriber> subscriber = new TestSubscriber<>(); queryObservable.take(1).subscribe(subscriber); - + subscriber.awaitTerminalEvent(); subscriber.assertComplete(); subscriber.assertNoErrors(); assertThat(subscriber.valueCount()).isEqualTo(1); FeedResponse page = ((FeedResponse) subscriber.getEvents().get(0).get(0)); assertThat(page.getResults()).hasSize(3); - + assertThat(page.getContinuationToken()).isNotEmpty(); - - + + options.requestContinuation(page.getContinuationToken()); queryObservable = createdCollection.queryItems(query, options); @@ -231,7 +229,7 @@ public void continuationToken() throws Exception { int expectedPageSize = (expectedDocs.size() + options.maxItemCount() - 1) / options.maxItemCount(); assertThat(expectedDocs).hasSize(createdDocuments.size() -3); - + FeedResponseListValidator validator = new FeedResponseListValidator.Builder() .containsExactly(expectedDocs.stream() .sorted((e1, e2) -> Integer.compare(e1.getInt("prop"), e2.getInt("prop"))) @@ -242,7 +240,7 @@ public void continuationToken() throws Exception { .build(); validateQuerySuccess(queryObservable, validator); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void invalidQuerySytax() throws Exception { String query = "I am an invalid query"; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java index 93e8055dedc5..9de8b7514b7e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java @@ -26,8 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat; -//FIXME beforeCLass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeCLass times out inconsistently public class StoredProcedureQueryTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java index 305046bffcf7..7333dad6f2aa 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java @@ -67,8 +67,7 @@ public void replaceStoredProcedure() throws Exception { validateSuccess(replaceObservable, validatorForReplace); } - // FIXME test times out inconsistently - @Ignore + // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT) public void executeStoredProcedure() throws Exception { // create a stored procedure diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java index 52d48e25357d..c65ee7089aaa 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java @@ -154,8 +154,7 @@ public void writeDocumentWithReadPermission(ConnectionMode connectionMode) { } } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = {"simple"}, dataProvider = "connectionMode", timeOut = TIMEOUT) public void writeDocumentWithAllPermission(ConnectionMode connectionMode) { AsyncDocumentClient asyncClientWithTokenResolver = null; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java index 0cfb59cbcdd0..6f1c6a0701e0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java @@ -46,8 +46,7 @@ public TopQueryTests(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - //FIXME: line 82 Assertion error. Error message "Expecting <0> to be greater than <0>" : FastIntegrationTests (Builds: SingeRegionSessionTcp) - @Ignore + // TODO (DANOBLE) line 82 Assertion error. Error message "Expecting <0> to be greater than <0>" : FastIntegrationTests (Builds: SingeRegionSessionTcp) @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider", retryAnalyzer = RetryAnalyzer.class) public void queryDocumentsWithTop(boolean qmEnabled) throws Exception { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java index 9709f65026b3..78a6177899f9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java @@ -76,8 +76,7 @@ public void readTrigger() throws Exception { validateSuccess(readObservable, validator); } - //FIXME test is flaky - @Ignore + // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void deleteTrigger() throws Exception { // create a trigger diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java index 3cdbeb38c122..9ef7a5a9fd0e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java @@ -29,8 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; -//FIXME beforeClass times out. -@Ignore +// TODO (DANOBLE) beforeClass times out. public class TriggerQueryTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java index ecc66a24b431..9a6712bc5521 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java @@ -19,8 +19,7 @@ import java.util.UUID; -//FIXME beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class TriggerUpsertReplaceTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; @@ -42,7 +41,7 @@ public void replaceTrigger() throws Exception { trigger.setTriggerOperation(TriggerOperation.CREATE); trigger.setTriggerType(TriggerType.PRE); CosmosTriggerProperties readBackTrigger = createdCollection.getScripts().createTrigger(trigger).block().getProperties(); - + // read trigger to validate creation waitIfNeededForReplicasToCatchUp(clientBuilder()); Mono readObservable = createdCollection.getScripts().getTrigger(readBackTrigger.getId()).read(); @@ -55,7 +54,7 @@ public void replaceTrigger() throws Exception { .notNullEtag() .build(); validateSuccess(readObservable, validatorForRead); - + //update getTrigger readBackTrigger.setBody("function() {var x = 11;}"); @@ -68,7 +67,7 @@ public void replaceTrigger() throws Exception { .withTriggerInternals(TriggerType.PRE, TriggerOperation.CREATE) .notNullEtag() .build(); - validateSuccess(updateObservable, validatorForUpdate); + validateSuccess(updateObservable, validatorForUpdate); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) @@ -77,7 +76,7 @@ public void beforeClass() { createdCollection = getSharedMultiPartitionCosmosContainer(client); truncateCollection(createdCollection); } - + @AfterClass(groups = { "simple" }, timeOut = SHUTDOWN_TIMEOUT, alwaysRun = true) public void afterClass() { safeClose(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java index 27cd94a96c81..e2b49bbe868e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java @@ -28,8 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; -//FIXME beforeClass times out inconsistently -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently public class UserDefinedFunctionQueryTest extends TestSuiteBase { private Database createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java index e77fb4a42ed7..b94c46778f9d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java @@ -17,8 +17,7 @@ import java.util.UUID; -//FIXME beforeClass times out inconsistently. -@Ignore +// TODO (DANOBLE) beforeClass times out inconsistently. public class UserDefinedFunctionUpsertReplaceTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; @@ -53,7 +52,7 @@ public void replaceUserDefinedFunction() throws Exception { .notNullEtag() .build(); validateSuccess(readObservable, validatorForRead); - + //update udf readBackUdf.setBody("function() {var x = 11;}"); @@ -65,7 +64,7 @@ public void replaceUserDefinedFunction() throws Exception { .withUserDefinedFunctionBody("function() {var x = 11;}") .notNullEtag() .build(); - validateSuccess(replaceObservable, validatorForReplace); + validateSuccess(replaceObservable, validatorForReplace); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java index f3eaadd21f5a..db8bef25ef56 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java @@ -41,11 +41,10 @@ public UserQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - //FIXME test times out inconsistently - @Ignore + // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT) public void queryUsersWithFilter() throws Exception { - + String filterUserId = createdUsers.get(0).getId(); String query = String.format("SELECT * from c where c.id = '%s'", filterUserId); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java index 20d30981d918..fc9535e0c8bb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java @@ -28,8 +28,7 @@ import static org.apache.commons.io.FileUtils.ONE_MB; -//FIXME: beforeClass method times out. -@Ignore +// TODO (DANOBLE) beforeClass method times out. public class VeryLargeDocumentQueryTest extends TestSuiteBase { private final static int TIMEOUT = 60000; From a1d0118eb73953f2a11d1c5e0e6badebf395f53c Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 14:03:28 -0800 Subject: [PATCH 06/32] Attempt to fix a test break --- .../ReplicatedResourceClientPartitionSplitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java index 567568fe9347..0f4742a721d4 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java @@ -24,6 +24,7 @@ import org.testng.annotations.DataProvider; import org.testng.annotations.Ignore; import org.testng.annotations.Test; +import reactor.core.Exceptions; import reactor.core.publisher.Mono; import java.net.URI; @@ -191,7 +192,7 @@ public static void validateFailure(Mono single, FailureValidator testSubscriber.assertNotComplete(); testSubscriber.assertTerminated(); Assertions.assertThat(testSubscriber.errorCount()).isEqualTo(1); - validator.validate(testSubscriber.errors().get(0)); + validator.validate(Exceptions.unwrap(testSubscriber.errors().get(0))); } private PartitionKeyRange partitionKeyRangeWithId(String id) { From 077d88af2919f80304872f06707dbccf4c4cc13f Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 14:27:30 -0800 Subject: [PATCH 07/32] Fixed a javadoc issue and bumped the value of RntbdRequestTimer.TIMER_RESOLUTION_IN_NANOS from 5 to 100 ms in the hopes of resolving a performance issue on Windows --- .../java/com/azure/cosmos/ConflictResolutionPolicy.java | 1 - .../directconnectivity/rntbd/RntbdRequestTimer.java | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java index 14bf1c6de6f6..96d9e7915d83 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java @@ -63,7 +63,6 @@ public class ConflictResolutionPolicy extends JsonSerializable { * Creates a LAST_WRITER_WINS {@link ConflictResolutionPolicy} with "/_ts" as the resolution path. * * In case of a conflict occurring on a document, the document with the higher integer value in the default path - * {@link Resource#timestamp()}, i.e., "/_ts" will be used. * {@link Resource#getTimestamp()}, i.e., "/_ts" will be used. * * @return ConflictResolutionPolicy. diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java index c0650c897e74..d04ae3af2716 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java @@ -17,17 +17,16 @@ public final class RntbdRequestTimer implements AutoCloseable { - private static final long FIVE_MILLISECONDS = 5000000L; + private static final long TIMER_RESOLUTION_IN_NANOS = 100_000_000L; // 100 ms // 5_000_000L; private static final Logger logger = LoggerFactory.getLogger(RntbdRequestTimer.class); private final long requestTimeout; private final Timer timer; public RntbdRequestTimer(final long requestTimeout) { - // Inspection of the HashWheelTimer code indicates that our choice of a 5 millisecond timer resolution ensures - // a request will expire within 10 milliseconds of the specified requestTimeout interval. This is because - // cancellation of a timeout takes two timer resolution units to complete. - this.timer = new HashedWheelTimer(FIVE_MILLISECONDS, TimeUnit.NANOSECONDS); + // Inspection of the HashedWheelTimer code shows that expiration of a timeout task takes two timer resolution + // units to complete + this.timer = new HashedWheelTimer(TIMER_RESOLUTION_IN_NANOS, TimeUnit.NANOSECONDS); this.requestTimeout = requestTimeout; } From 98981fd91821d390474c5dfd47a34237b4582d89 Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 14:36:07 -0800 Subject: [PATCH 08/32] Fixed a javadoc issues --- .../main/java/com/azure/cosmos/ConflictResolutionMode.java | 6 +++--- .../java/com/azure/cosmos/ConflictResolutionPolicy.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java index 106f1fd441f8..7d3716986512 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java @@ -25,7 +25,7 @@ public enum ConflictResolutionMode { * The user could elect to register a user specified {@link StoredProcedure} for handling conflicting resources. * Should the user not register a user specified StoredProcedure, conflicts will default to being made available as {@link Conflict} resources, * which the user can inspect and manually resolve. - * See {@link ConflictResolutionPolicy#conflictResolutionProcedure()} for details on how to specify the stored procedure + * See {@link ConflictResolutionPolicy#getConflictResolutionProcedure()} for details on how to specify the stored procedure * to run for conflict resolution. */ CUSTOM, @@ -34,10 +34,10 @@ public enum ConflictResolutionMode { * INVALID or unknown mode. */ INVALID; - + @Override public String toString() { - return StringUtils.remove(WordUtils.capitalizeFully(this.name(), '_'), '_'); + return StringUtils.remove(WordUtils.capitalizeFully(this.name(), '_'), '_'); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java index 96d9e7915d83..9aab9ca69acc 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java @@ -192,7 +192,7 @@ public String getConflictResolutionPath() { * Sets the path which is present in each document in the Azure Cosmos DB service for last writer wins conflict-resolution. * This path must be present in each document and must be an integer value. * In case of a conflict occurring on a document, the document with the higher integer value in the specified path will be picked. - * If the path is unspecified, by default the {@link Resource#timestamp()} path will be used. + * If the path is unspecified, by default the {@link Resource#getTimestamp()} path will be used. * * This value should only be set when using {@link ConflictResolutionMode#LAST_WRITER_WINS} * From e9d07b03950b1c6b8412c2c050d83c1e1d39bcc6 Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 14:43:36 -0800 Subject: [PATCH 09/32] Fixed a javadoc issue --- .../main/java/com/azure/cosmos/ConflictResolutionMode.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java index 7d3716986512..d579a356281f 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionMode.java @@ -12,8 +12,9 @@ public enum ConflictResolutionMode { /** * Last writer wins conflict resolution mode * - * Setting the ConflictResolutionMode to "LAST_WRITER_WINS" indicates that conflict resolution should be done by inspecting a field in the conflicting documents - * and picking the document which has the higher value in that path. See {@link ConflictResolutionPolicy#conflictResolutionPath()} for details on how to specify the path + * Setting the ConflictResolutionMode to "LAST_WRITER_WINS" indicates that conflict resolution should be done by + * inspecting a field in the conflicting documents and picking the document which has the higher value in that + * path. See {@link ConflictResolutionPolicy#getConflictResolutionPath} for details on how to specify the path * to be checked for conflict resolution. Also note that Deletes win. */ LAST_WRITER_WINS, From 7bcb84c825f9b5255f56ac7cdb0f1d944d8dd07c Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 16:06:05 -0800 Subject: [PATCH 10/32] Reenabled direct tcp backpressure tests --- .../cosmos/implementation/TestSuiteBase.java | 11 +++++----- .../rx/BackPressureCrossPartitionTest.java | 2 +- .../com/azure/cosmos/rx/BackPressureTest.java | 2 +- .../com/azure/cosmos/rx/TestSuiteBase.java | 20 ++++++++++--------- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java index e6e2e4ea6150..5107063be896 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java @@ -783,15 +783,16 @@ public static Object[][] simpleClientBuildersWithDirect() { return simpleClientBuildersWithDirect(toArray(protocols)); } - @DataProvider - public static Object[][] simpleClientBuildersWithDirectHttps() { - return simpleClientBuildersWithDirect(Protocol.HTTPS); - } + // TODO (DANOBLE) uncomment this DataProvider + // @DataProvider + // public static Object[][] simpleClientBuildersWithDirectHttps() { + // return simpleClientBuildersWithDirect(Protocol.HTTPS); + // } private static Object[][] simpleClientBuildersWithDirect(Protocol... protocols) { logger.info("Max test consistency to use is [{}]", accountConsistency); List testConsistencies = ImmutableList.of(ConsistencyLevel.EVENTUAL); - + boolean isMultiMasterEnabled = preferredLocations != null && accountConsistency == ConsistencyLevel.SESSION; List builders = new ArrayList<>(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java index 9501089f80b8..b523d362cb34 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java @@ -89,7 +89,7 @@ static protected CosmosContainerProperties getCollectionDefinition() { return collectionDefinition; } - @Factory(dataProvider = "simpleClientBuildersWithDirectHttps") + @Factory(dataProvider = "simpleClientBuildersWithDirect") public BackPressureCrossPartitionTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java index 990e5cf5c15c..79fd044471ab 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java @@ -60,7 +60,7 @@ private static CosmosContainerProperties getSinglePartitionCollectionDefinition( return collectionDefinition; } - @Factory(dataProvider = "simpleClientBuildersWithDirectHttps") + @Factory(dataProvider = "simpleClientBuildersWithDirect") public BackPressureTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java index 54f7dd3200f7..629b648a82c2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java @@ -643,7 +643,7 @@ static protected void safeDeleteSyncDatabase(CosmosDatabase database) { } } } - + static protected void safeDeleteAllCollections(CosmosAsyncDatabase database) { if (database != null) { List collections = database.readAllContainers() @@ -838,10 +838,11 @@ public static Object[][] simpleClientBuildersWithDirect() { return simpleClientBuildersWithDirect(toArray(protocols)); } - @DataProvider - public static Object[][] simpleClientBuildersWithDirectHttps() { - return simpleClientBuildersWithDirect(Protocol.HTTPS); - } + // TODO (DANOBLE) uncomment this DataProvider + // @DataProvider + // public static Object[][] simpleClientBuildersWithDirectHttps() { + // return simpleClientBuildersWithDirect(Protocol.HTTPS); + // } private static Object[][] simpleClientBuildersWithDirect(Protocol... protocols) { logger.info("Max test consistency to use is [{}]", accountConsistency); @@ -852,10 +853,11 @@ private static Object[][] simpleClientBuildersWithDirect(Protocol... protocols) List cosmosConfigurations = new ArrayList<>(); for (Protocol protocol : protocols) { - testConsistencies.forEach(consistencyLevel -> cosmosConfigurations.add(createDirectRxDocumentClient(consistencyLevel, - protocol, - isMultiMasterEnabled, - preferredLocations))); + testConsistencies.forEach(consistencyLevel -> cosmosConfigurations.add(createDirectRxDocumentClient( + consistencyLevel, + protocol, + isMultiMasterEnabled, + preferredLocations))); } cosmosConfigurations.forEach(c -> logger.info("Will Use ConnectionMode [{}], Consistency [{}], Protocol [{}]", From e16b79b6bd161378960f4c56c9d1fe8ee1e9520e Mon Sep 17 00:00:00 2001 From: David Noble Date: Tue, 12 Nov 2019 16:34:48 -0800 Subject: [PATCH 11/32] Fixed a javadoc issue --- .../java/com/azure/cosmos/ConflictResolutionPolicy.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java index 9aab9ca69acc..2ae1e89b964b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/ConflictResolutionPolicy.java @@ -63,7 +63,7 @@ public class ConflictResolutionPolicy extends JsonSerializable { * Creates a LAST_WRITER_WINS {@link ConflictResolutionPolicy} with "/_ts" as the resolution path. * * In case of a conflict occurring on a document, the document with the higher integer value in the default path - * {@link Resource#getTimestamp()}, i.e., "/_ts" will be used. + * {@link Resource#getTimestamp}, i.e., "/_ts" will be used. * * @return ConflictResolutionPolicy. */ @@ -103,7 +103,7 @@ public static ConflictResolutionPolicy createLastWriterWinsPolicy(String conflic *
    *
  • In case the stored procedure fails or throws an exception, * the conflict resolution will default to registering conflicts in the conflicts feed
  • - *
  • The user can provide the stored procedure @see {@link Resource#id()}
  • + *
  • The user can provide the stored procedure @see {@link Resource#getId()}
  • *
* @param conflictResolutionSprocName stored procedure to perform conflict resolution. * @return ConflictResolutionPolicy. @@ -177,7 +177,7 @@ ConflictResolutionPolicy setMode(ConflictResolutionMode mode) { * Gets the path which is present in each document in the Azure Cosmos DB service for last writer wins conflict-resolution. * This path must be present in each document and must be an integer value. * In case of a conflict occurring on a document, the document with the higher integer value in the specified path will be picked. - * If the path is unspecified, by default the {@link Resource#timestamp()} path will be used. + * If the path is unspecified, by default the {@link Resource#getTimestamp()} path will be used. * * This value should only be set when using {@link ConflictResolutionMode#LAST_WRITER_WINS} * @@ -212,7 +212,7 @@ ConflictResolutionPolicy setConflictResolutionPath(String value) { *
  • This value should only be set when using {@link ConflictResolutionMode#CUSTOM}
  • *
  • In case the stored procedure fails or throws an exception, * the conflict resolution will default to registering conflicts in the conflicts feed
  • - *
  • The user can provide the stored procedure @see {@link Resource#id()}
  • + *
  • The user can provide the stored procedure @see {@link Resource#getId}
  • * ** * @return the stored procedure to perform conflict resolution.] From 849cbb4b0dfa901c81654f3c1ee81dda7d33927a Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Wed, 13 Nov 2019 01:14:23 -0800 Subject: [PATCH 12/32] Updated collection cache layer logic with v2. Removed Flux.empty() and Mono.empty() and instead used ValueHolder<>(null) --- .../ICollectionRoutingMapCache.java | 4 +- .../implementation/IRoutingMapProvider.java | 2 +- .../PartitionKeyRangeGoneRetryPolicy.java | 34 ++-- ...enameCollectionAwareClientRetryPolicy.java | 13 +- .../implementation/RxDocumentClientImpl.java | 22 +- .../caches/IPartitionKeyRangeCache.java | 11 +- .../caches/RxCollectionCache.java | 40 ++-- .../caches/RxPartitionKeyRangeCache.java | 91 +++++---- .../directconnectivity/AddressResolver.java | 192 +++++++++--------- .../GatewayAddressCache.java | 23 ++- .../GlobalAddressResolver.java | 20 +- .../directconnectivity/IAddressCache.java | 3 +- .../DocumentQueryExecutionContextFactory.java | 26 +-- ...eCollectionAwareClientRetryPolicyTest.java | 2 +- .../AddressResolverTest.java | 16 +- .../GatewayAddressCacheTest.java | 59 +++--- .../GlobalAddressResolverTest.java | 7 +- 17 files changed, 299 insertions(+), 266 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ICollectionRoutingMapCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ICollectionRoutingMapCache.java index a37ef5618ef1..e6b335a81e86 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ICollectionRoutingMapCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ICollectionRoutingMapCache.java @@ -13,14 +13,14 @@ * This is meant to be internally used only by our sdk. **/ public interface ICollectionRoutingMapCache { - default Mono tryLookupAsync( + default Mono> tryLookupAsync( String collectionRid, CollectionRoutingMap previousValue, Map properties) { return tryLookupAsync(collectionRid, previousValue, false, properties); } - Mono tryLookupAsync( + Mono> tryLookupAsync( String collectionRid, CollectionRoutingMap previousValue, boolean forceRefreshCollectionRoutingMap, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java index af1415f7a8fc..1c631b9785b6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java @@ -25,6 +25,6 @@ public interface IRoutingMapProvider { Mono> tryGetOverlappingRangesAsync(String collectionResourceId, Range range, boolean forceRefresh /* = false */, Map properties); - Mono tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, + Mono> tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, boolean forceRefresh /* = false */, Map properties); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyRangeGoneRetryPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyRangeGoneRetryPolicy.java index 686431eb9207..15407a32ce76 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyRangeGoneRetryPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyRangeGoneRetryPolicy.java @@ -38,7 +38,7 @@ public PartitionKeyRangeGoneRetryPolicy( this.feedOptions = feedOptions; } - /// + /// /// Should the caller retry the operation. /// /// Exception that occured when the operation was tried @@ -46,7 +46,7 @@ public PartitionKeyRangeGoneRetryPolicy( /// True indicates caller should retry, False otherwise public Mono shouldRetry(Exception exception) { CosmosClientException clientException = Utils.as(exception, CosmosClientException.class); - if (clientException != null && + if (clientException != null && Exceptions.isStatusCode(clientException, HttpConstants.StatusCodes.GONE) && Exceptions.isSubStatusCode(clientException, HttpConstants.SubStatusCodes.PARTITION_KEY_RANGE_GONE)) { @@ -64,28 +64,30 @@ public Mono shouldRetry(Exception exception) { if (this.feedOptions != null) { request.properties = this.feedOptions.properties(); } - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); - return collectionObs.flatMap(collection -> { + return collectionObs.flatMap(collectionValueHolder -> { - Mono routingMapObs = this.partitionKeyRangeCache.tryLookupAsync(collection.getResourceId(), null, request.properties); + Mono> routingMapObs = this.partitionKeyRangeCache.tryLookupAsync(collectionValueHolder.v.getResourceId(), + null, request.properties); - Mono refreshedRoutingMapObs = routingMapObs.flatMap(routingMap -> { - // Force refresh. - return this.partitionKeyRangeCache.tryLookupAsync( - collection.getResourceId(), - routingMap, + Mono> refreshedRoutingMapObs = routingMapObs.flatMap(routingMapValueHolder -> { + if (routingMapValueHolder.v != null) { + // Force refresh. + return this.partitionKeyRangeCache.tryLookupAsync( + collectionValueHolder.v.getResourceId(), + routingMapValueHolder.v, request.properties); - }).switchIfEmpty(Mono.defer(Mono::empty)); + } else { + return Mono.just(new Utils.ValueHolder<>(null)); + } + }); // TODO: Check if this behavior can be replaced by doOnSubscribe return refreshedRoutingMapObs.flatMap(rm -> { this.retried = true; return Mono.just(ShouldRetryResult.retryAfter(Duration.ZERO)); - }).switchIfEmpty(Mono.defer(() -> { - this.retried = true; - return Mono.just(ShouldRetryResult.retryAfter(Duration.ZERO)); - })); + }); }); @@ -96,7 +98,7 @@ public Mono shouldRetry(Exception exception) { @Override public void onBeforeSendRequest(RxDocumentServiceRequest request) { - this.nextRetryPolicy.onBeforeSendRequest(request); + this.nextRetryPolicy.onBeforeSendRequest(request); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RenameCollectionAwareClientRetryPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RenameCollectionAwareClientRetryPolicy.java index 20a7033f8d2d..0706ea2d406d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RenameCollectionAwareClientRetryPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RenameCollectionAwareClientRetryPolicy.java @@ -61,17 +61,16 @@ public Mono shouldRetry(Exception e) { request.forceNameCacheRefresh = true; request.requestContext.resolvedCollectionRid = null; - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); - return collectionObs.flatMap(collectionInfo -> { - if (!StringUtils.isEmpty(oldCollectionRid) && !StringUtils.isEmpty(collectionInfo.getResourceId())) { + return collectionObs.flatMap(collectionValueHolder -> { + if (collectionValueHolder.v == null) { + logger.warn("Can't recover from session unavailable exception because resolving collection name {} returned null", request.getResourceAddress()); + } else if (!StringUtils.isEmpty(oldCollectionRid) && !StringUtils.isEmpty(collectionValueHolder.v.getResourceId())) { return Mono.just(ShouldRetryResult.retryAfter(Duration.ZERO)); } return Mono.just(shouldRetryResult); - }).switchIfEmpty(Mono.defer(() -> { - logger.warn("Can't recover from session unavailable exception because resolving collection name {} returned null", request.getResourceAddress()); - return Mono.just(shouldRetryResult); - })).onErrorResume(throwable -> { + }).onErrorResume(throwable -> { // When resolveCollectionAsync throws an exception ignore it because it's an attempt to recover an existing // error. When the recovery fails we return ShouldRetryResult.noRetry and propagate the original exception to the client diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java index 8a5082d131f8..0e19a666ba43 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java @@ -869,19 +869,19 @@ private Map getRequestHeaders(RequestOptions options) { private Mono addPartitionKeyInformation(RxDocumentServiceRequest request, Document document, RequestOptions options) { - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); return collectionObs - .map(collection -> { - addPartitionKeyInformation(request, document, options, collection); + .map(collectionValueHolder -> { + addPartitionKeyInformation(request, document, options, collectionValueHolder.v); return request; }); } private Mono addPartitionKeyInformation(RxDocumentServiceRequest request, Document document, RequestOptions options, - Mono collectionObs) { + Mono> collectionObs) { - return collectionObs.map(collection -> { - addPartitionKeyInformation(request, document, options, collection); + return collectionObs.map(collectionValueHolder -> { + addPartitionKeyInformation(request, document, options, collectionValueHolder.v); return request; }); } @@ -969,7 +969,7 @@ private Mono getCreateDocumentRequest(String documentC RxDocumentServiceRequest request = RxDocumentServiceRequest.create(operationType, ResourceType.Document, path, typedDocument, requestHeaders, options); - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); return addPartitionKeyInformation(request, typedDocument, options, collectionObs); } @@ -1217,7 +1217,7 @@ private Flux> replaceDocumentInternal(String document validateResource(document); - Mono collectionObs = collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = collectionCache.resolveCollectionAsync(request); Mono requestObs = addPartitionKeyInformation(request, document, options, collectionObs); return requestObs.flux().flatMap(req -> { @@ -1247,7 +1247,7 @@ private Flux> deleteDocumentInternal(String documentL RxDocumentServiceRequest request = RxDocumentServiceRequest.create(OperationType.Delete, ResourceType.Document, path, requestHeaders, options); - Mono collectionObs = collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = collectionCache.resolveCollectionAsync(request); Mono requestObs = addPartitionKeyInformation(request, null, options, collectionObs); @@ -1283,7 +1283,7 @@ private Flux> readDocumentInternal(String documentLin RxDocumentServiceRequest request = RxDocumentServiceRequest.create(OperationType.Read, ResourceType.Document, path, requestHeaders, options); - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); Mono requestObs = addPartitionKeyInformation(request, null, options, collectionObs); @@ -2587,7 +2587,7 @@ private Flux> readFeedCollectionChild(FeedO Function>> executeFunc = request -> { return ObservableHelper.inlineIfPossibleAsObs(() -> { - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); Mono requestObs = this.addPartitionKeyInformation(request, null, requestOptions, collectionObs); return requestObs.flux().flatMap(req -> this.readFeed(req) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java index 1c8d5f25e498..e9c1cf74870d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java @@ -2,6 +2,7 @@ // Licensed under the MIT License. package com.azure.cosmos.implementation.caches; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.routing.CollectionRoutingMap; import com.azure.cosmos.implementation.routing.Range; import com.azure.cosmos.implementation.ICollectionRoutingMapCache; @@ -13,18 +14,18 @@ import java.util.Map; /** - * + * */ public interface IPartitionKeyRangeCache extends IRoutingMapProvider, ICollectionRoutingMapCache { - Mono tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, Map properties); + Mono> tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, Map properties); Mono> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, Map properties); - Mono tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, boolean forceRefresh, - Map properties); + Mono> tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, boolean forceRefresh, + Map properties); - Mono tryGetRangeByPartitionKeyRangeId(String collectionRid, String partitionKeyRangeId, Map properties); + Mono> tryGetRangeByPartitionKeyRangeId(String collectionRid, String partitionKeyRangeId, Map properties); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java index 2068a98b7507..5fd376e038c0 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java @@ -2,6 +2,7 @@ // Licensed under the MIT License. package com.azure.cosmos.implementation.caches; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.routing.PartitionKeyRangeIdentity; import com.azure.cosmos.implementation.DocumentCollection; import com.azure.cosmos.InvalidPartitionException; @@ -36,7 +37,7 @@ protected RxCollectionCache() { * @param request Request to resolve. * @return an instance of Single<DocumentCollection> */ - public Mono resolveCollectionAsync( + public Mono> resolveCollectionAsync( RxDocumentServiceRequest request) { // Mono Void to represent only terminal events specifically complete and error Mono init = null; @@ -46,14 +47,17 @@ public Mono resolveCollectionAsync( init = mono.then(Mono.fromRunnable(() -> request.setForceNameCacheRefresh(false))); } - Mono collectionInfoObs = this.resolveByPartitionKeyRangeIdentityAsync( + Mono> collectionInfoObs = this.resolveByPartitionKeyRangeIdentityAsync( request.getPartitionKeyRangeIdentity(), request.properties); if (init != null) { collectionInfoObs = init.then(collectionInfoObs); } - return collectionInfoObs.flatMap(Mono::just).switchIfEmpty(Mono.defer(() -> { + return collectionInfoObs.flatMap(collectionValueHolder -> { + if (collectionValueHolder.v != null) { + return Mono.just(collectionValueHolder); + } if (request.requestContext.resolvedCollectionRid == null) { Mono collectionInfoRes = this.resolveByNameAsync(request.getResourceAddress(), request.properties); @@ -67,16 +71,23 @@ public Mono resolveCollectionAsync( request.setResourceId(collection.getResourceId()); request.requestContext.resolvedCollectionRid = collection.getResourceId(); - return Mono.just(collection); + return Mono.just(new Utils.ValueHolder<>(collection)); }); } else { return this.resolveByRidAsync(request.requestContext.resolvedCollectionRid, request.properties); } - })); + }); } else { return resolveByPartitionKeyRangeIdentityAsync(request.getPartitionKeyRangeIdentity(),request.properties) - .flatMap(Mono::just).switchIfEmpty(this.resolveByRidAsync(request.getResourceAddress(), request.properties)); + .flatMap(collectionValueHolder -> { + + if (collectionValueHolder.v != null) { + return Mono.just(collectionValueHolder); + } + + return this.resolveByRidAsync(request.getResourceAddress(), request.properties); + }); } } @@ -101,7 +112,7 @@ public void refresh(String resourceAddress, Map properties) { protected abstract Mono getByNameAsync(String resourceAddress, Map properties); - private Mono resolveByPartitionKeyRangeIdentityAsync(PartitionKeyRangeIdentity partitionKeyRangeIdentity, Map properties) { + private Mono> resolveByPartitionKeyRangeIdentityAsync(PartitionKeyRangeIdentity partitionKeyRangeIdentity, Map properties) { // if request is targeted at specific partition using x-ms-documentd-partitionkeyrangeid header, // which contains value ",", then resolve to collection rid in this header. if (partitionKeyRangeIdentity != null && partitionKeyRangeIdentity.getCollectionRid() != null) { @@ -117,19 +128,20 @@ private Mono resolveByPartitionKeyRangeIdentityAsync(Partiti }); } - return Mono.empty(); + return Mono.just(new Utils.ValueHolder<>(null)); } - private Mono resolveByRidAsync( + private Mono> resolveByRidAsync( String resourceId, Map properties) { ResourceId resourceIdParsed = ResourceId.parse(resourceId); String collectionResourceId = resourceIdParsed.getDocumentCollectionId().toString(); - return this.collectionInfoByIdCache.getAsync( - collectionResourceId, - null, - () -> this.getByRidAsync(collectionResourceId, properties)); + Mono async = this.collectionInfoByIdCache.getAsync( + collectionResourceId, + null, + () -> this.getByRidAsync(collectionResourceId, properties)); + return async.map(Utils.ValueHolder::new); } private Mono resolveByNameAsync( @@ -167,7 +179,7 @@ private Mono refreshAsync(RxDocumentServiceRequest request) { }); }).then(); } else { - // In case of ForceRefresh directive coming from client, there will be no ResolvedCollectionRid, so we + // In case of ForceRefresh directive coming from client, there will be no ResolvedCollectionRid, so we // need to refresh unconditionally. mono = Mono.fromRunnable(() -> this.refresh(request.getResourceAddress(), request.properties)); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java index 1b59fda07920..462f84472c70 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java @@ -25,6 +25,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -52,25 +53,26 @@ public RxPartitionKeyRangeCache(AsyncDocumentClient client, RxCollectionCache co * @see IPartitionKeyRangeCache#tryLookupAsync(java.lang.STRING, com.azure.cosmos.internal.routing.CollectionRoutingMap) */ @Override - public Mono tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, Map properties) { + public Mono> tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, Map properties) { return routingMapCache.getAsync( collectionRid, previousValue, () -> getRoutingMapForCollectionAsync(collectionRid, previousValue, properties)) - .onErrorResume(err -> { - logger.debug("tryLookupAsync on collectionRid {} encountered failure", collectionRid, err); - CosmosClientException dce = Utils.as(err, CosmosClientException.class); - if (dce != null && Exceptions.isStatusCode(dce, HttpConstants.StatusCodes.NOTFOUND)) { - return Mono.empty(); - } - - return Mono.error(err); - }); + .map(Utils.ValueHolder::new) + .onErrorResume(err -> { + logger.debug("tryLookupAsync on collectionRid {} encountered failure", collectionRid, err); + CosmosClientException dce = Utils.as(err, CosmosClientException.class); + if (dce != null && Exceptions.isStatusCode(dce, HttpConstants.StatusCodes.NOTFOUND)) { + return Mono.just(new Utils.ValueHolder<>(null)); + } + + return Mono.error(err); + }); } @Override - public Mono tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, boolean forceRefreshCollectionRoutingMap, - Map properties) { + public Mono> tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, boolean forceRefreshCollectionRoutingMap, + Map properties) { return tryLookupAsync(collectionRid, previousValue, properties); } @@ -81,60 +83,70 @@ public Mono tryLookupAsync(String collectionRid, Collectio public Mono> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, Map properties) { - Mono routingMapObs = tryLookupAsync(collectionRid, null, properties); + Mono> routingMapObs = tryLookupAsync(collectionRid, null, properties); - return routingMapObs.flatMap(routingMap -> { - if (forceRefresh) { + return routingMapObs.flatMap(routingMapValueHolder -> { + if (forceRefresh && routingMapValueHolder.v != null) { logger.debug("tryGetOverlappingRangesAsync with forceRefresh on collectionRid {}", collectionRid); - return tryLookupAsync(collectionRid, routingMap, properties); + return tryLookupAsync(collectionRid, routingMapValueHolder.v, properties); } - return Mono.just(routingMap); - }).switchIfEmpty(Mono.empty()).map(routingMap -> routingMap.getOverlappingRanges(range)).switchIfEmpty(Mono.defer(() -> { - logger.debug("Routing Map Null for collection: {} for range: {}, forceRefresh:{}", collectionRid, range.toString(), forceRefresh); - return Mono.empty(); - })); + return Mono.just(routingMapValueHolder); + }).map(routingMapValueHolder -> { + if (routingMapValueHolder.v != null) { + // TODO: the routingMap.getOverlappingRanges(range) returns Collection + // maybe we should consider changing to ArrayList to avoid conversion + return new ArrayList<>(routingMapValueHolder.v.getOverlappingRanges(range)); + } else { + logger.debug("Routing Map Null for collection: {} for range: {}, forceRefresh:{}", collectionRid, range.toString(), forceRefresh); + return null; + } + }); } /* (non-Javadoc) * @see IPartitionKeyRangeCache#tryGetPartitionKeyRangeByIdAsync(java.lang.STRING, java.lang.STRING, boolean) */ @Override - public Mono tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, - boolean forceRefresh, Map properties) { + public Mono> tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, + boolean forceRefresh, Map properties) { - Mono routingMapObs = tryLookupAsync(collectionResourceId, null, properties); + Mono> routingMapObs = tryLookupAsync(collectionResourceId, null, properties); - return routingMapObs.flatMap(routingMap -> { - if (forceRefresh && routingMap != null) { - return tryLookupAsync(collectionResourceId, routingMap, properties); + return routingMapObs.flatMap(routingMapValueHolder -> { + if (forceRefresh && routingMapValueHolder.v != null) { + return tryLookupAsync(collectionResourceId, routingMapValueHolder.v, properties); } - return Mono.justOrEmpty(routingMap); - - }).switchIfEmpty(Mono.defer(Mono::empty)).map(routingMap -> routingMap.getRangeByPartitionKeyRangeId(partitionKeyRangeId)).switchIfEmpty(Mono.defer(() -> { - logger.debug("Routing Map Null for collection: {}, PartitionKeyRangeId: {}, forceRefresh:{}", collectionResourceId, partitionKeyRangeId, forceRefresh); - return null; - })); + return Mono.just(routingMapValueHolder); + + }).map(routingMapValueHolder -> { + if (routingMapValueHolder.v != null) { + return new Utils.ValueHolder<>(routingMapValueHolder.v.getRangeByPartitionKeyRangeId(partitionKeyRangeId)); + } else { + logger.debug("Routing Map Null for collection: {}, PartitionKeyRangeId: {}, forceRefresh:{}", collectionResourceId, partitionKeyRangeId, forceRefresh); + return null; + } + }); } /* (non-Javadoc) * @see IPartitionKeyRangeCache#tryGetRangeByPartitionKeyRangeId(java.lang.STRING, java.lang.STRING) */ @Override - public Mono tryGetRangeByPartitionKeyRangeId(String collectionRid, String partitionKeyRangeId, Map properties) { - Mono routingMapObs = routingMapCache.getAsync( + public Mono> tryGetRangeByPartitionKeyRangeId(String collectionRid, String partitionKeyRangeId, Map properties) { + Mono> routingMapObs = routingMapCache.getAsync( collectionRid, null, - () -> getRoutingMapForCollectionAsync(collectionRid, null, properties)); + () -> getRoutingMapForCollectionAsync(collectionRid, null, properties)).map(Utils.ValueHolder::new); - return routingMapObs.map(routingMap -> routingMap.getRangeByPartitionKeyRangeId(partitionKeyRangeId)) + return routingMapObs.map(routingMapValueHolder -> new Utils.ValueHolder<>(routingMapValueHolder.v.getRangeByPartitionKeyRangeId(partitionKeyRangeId))) .onErrorResume(err -> { CosmosClientException dce = Utils.as(err, CosmosClientException.class); logger.debug("tryGetRangeByPartitionKeyRangeId on collectionRid {} and partitionKeyRangeId {} encountered failure", collectionRid, partitionKeyRangeId, err); if (dce != null && Exceptions.isStatusCode(dce, HttpConstants.StatusCodes.NOTFOUND)) { - return Mono.empty(); + return Mono.just(new Utils.ValueHolder<>(null)); } return Mono.error(dce); @@ -193,7 +205,8 @@ private Mono> getPartitionKeyRange(String collectionRid, ); //this request doesn't actually go to server request.requestContext.resolvedCollectionRid = collectionRid; - Mono collectionObs = collectionCache.resolveCollectionAsync(request); + Mono collectionObs = collectionCache.resolveCollectionAsync(request) + .map(collectionValueHolder -> collectionValueHolder.v); return collectionObs.flatMap(coll -> { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/AddressResolver.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/AddressResolver.java index 36eac71d83cd..c8f48eaa6a3e 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/AddressResolver.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/AddressResolver.java @@ -20,6 +20,7 @@ import com.azure.cosmos.implementation.ResourceType; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.Strings; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.caches.RxCollectionCache; import com.azure.cosmos.implementation.routing.CollectionRoutingMap; import com.azure.cosmos.implementation.routing.PartitionKeyInternal; @@ -180,7 +181,7 @@ private static void ensureRoutingMapPresent( } } - private Mono tryResolveServerPartitionAsync( + private Mono> tryResolveServerPartitionAsync( RxDocumentServiceRequest request, DocumentCollection collection, CollectionRoutingMap routingMap, @@ -232,20 +233,25 @@ private Mono tryResolveServerPartitionAsync( // upper logic will refresh cache and retry. logger.debug("Collection cache or routing map cache is potentially outdated." + " Returning null. Upper logic will refresh cache and retry."); - return Mono.empty(); + return Mono.just(new Utils.ValueHolder<>(null)); } - Mono addressesObs = this.addressCache.tryGetAddresses( + Mono> addressesObs = this.addressCache.tryGetAddresses( request, new PartitionKeyRangeIdentity(collection.getResourceId(), range.getId()), forceRefreshPartitionAddresses); - return addressesObs.flatMap(addresses -> Mono.just(new ResolutionResult(range, addresses))).switchIfEmpty(Mono.defer(() -> { - logger.info( + return addressesObs.flatMap(addressesValueHolder -> { + + if (addressesValueHolder.v == null) { + logger.info( "Could not resolve addresses for identity {}/{}. Potentially collection cache or routing map cache is outdated. Return empty - upper logic will refresh and retry. ", new PartitionKeyRangeIdentity(collection.getResourceId(), range.getId())); - return Mono.empty(); - })); + return Mono.just(new Utils.ValueHolder<>(null)); + } + + return Mono.just(new Utils.ValueHolder<>(new ResolutionResult(range, addressesValueHolder.v))); + }); } catch (Exception e) { return Mono.error(e); @@ -287,21 +293,23 @@ private Mono resolveMasterResourceAddress(RxDocumentServiceReq && request.getPartitionKeyRangeIdentity() == null; // ServiceIdentity serviceIdentity = this.masterServiceIdentity; - Mono addressesObs = this.addressCache.tryGetAddresses(request, + Mono> addressesObs = this.addressCache.tryGetAddresses(request, masterPartitionKeyRangeIdentity,forceRefreshPartitionAddresses); - return addressesObs.flatMap(addresses -> { + return addressesObs.flatMap(addressesValueHolder -> { + if (addressesValueHolder.v == null) { + logger.warn("Could not get addresses for master partition"); + + // return Observable.getError() + NotFoundException e = new NotFoundException(); + BridgeInternal.setResourceAddress(e, request.getResourceAddress()); + return Mono.error(e); + } + PartitionKeyRange partitionKeyRange = new PartitionKeyRange(); partitionKeyRange.setId(PartitionKeyRange.MASTER_PARTITION_KEY_RANGE_ID); - return Mono.just(new ResolutionResult(partitionKeyRange, addresses)); - }).switchIfEmpty(Mono.defer(() -> { - logger.warn("Could not get addresses for master partition"); - - // return Observable.getError() - NotFoundException e = new NotFoundException(); - BridgeInternal.setResourceAddress(e, request.getResourceAddress()); - return Mono.error(e); - })); + return Mono.just(new ResolutionResult(partitionKeyRange, addressesValueHolder.v)); + }); } private class RefreshState { @@ -321,36 +329,30 @@ private Mono getOrRefreshRoutingMap(RxDocumentServiceRequest reque (request.getPartitionKeyRangeIdentity() != null && request.getPartitionKeyRangeIdentity().getCollectionRid() != null); state.collectionRoutingMapCacheIsUptoDate = false; - Mono collectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> collectionObs = this.collectionCache.resolveCollectionAsync(request); - Mono stateObs = collectionObs.flatMap(collection -> { - state.collection = collection; - Mono routingMapObs = - this.collectionRoutingMapCache.tryLookupAsync(collection.getResourceId(), null, request.forceCollectionRoutingMapRefresh, request.properties); - final DocumentCollection underlyingCollection = collection; - return routingMapObs.flatMap(routingMap -> { - state.routingMap = routingMap; + Mono stateObs = collectionObs.flatMap(collectionValueHolder -> { + state.collection = collectionValueHolder.v; + Mono> routingMapObs = + this.collectionRoutingMapCache.tryLookupAsync(collectionValueHolder.v.getResourceId(), null, request.forceCollectionRoutingMapRefresh, request.properties); + final Utils.ValueHolder underlyingCollection = collectionValueHolder; + return routingMapObs.flatMap(routingMapValueHolder -> { + state.routingMap = routingMapValueHolder.v; if (request.forcePartitionKeyRangeRefresh) { state.collectionRoutingMapCacheIsUptoDate = true; request.forcePartitionKeyRangeRefresh = false; - if (routingMap != null) { - return this.collectionRoutingMapCache.tryLookupAsync(underlyingCollection.getResourceId(), routingMap, request.properties) - .map(newRoutingMap -> { - state.routingMap = newRoutingMap; + if (routingMapValueHolder.v != null) { + return this.collectionRoutingMapCache.tryLookupAsync(underlyingCollection.v.getResourceId(), routingMapValueHolder.v, request.properties) + .map(newRoutingMapValueHolder -> { + state.routingMap = newRoutingMapValueHolder.v; return state; }); } } return Mono.just(state); - }).switchIfEmpty(Mono.defer(() -> { - if (request.forcePartitionKeyRangeRefresh) { - state.collectionRoutingMapCacheIsUptoDate = true; - request.forcePartitionKeyRangeRefresh = false; - } - return Mono.just(state); - })); + }); }); return stateObs.flatMap(newState -> { @@ -362,17 +364,17 @@ private Mono getOrRefreshRoutingMap(RxDocumentServiceRequest reque newState.collectionCacheIsUptoDate = true; newState.collectionRoutingMapCacheIsUptoDate = false; - Mono newCollectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono> newCollectionObs = this.collectionCache.resolveCollectionAsync(request); - return newCollectionObs.flatMap(collection -> { - newState.collection = collection; - Mono newRoutingMapObs = this.collectionRoutingMapCache.tryLookupAsync( - collection.getResourceId(), + return newCollectionObs.flatMap(collectionValueHolder -> { + newState.collection = collectionValueHolder.v; + Mono> newRoutingMapObs = this.collectionRoutingMapCache.tryLookupAsync( + collectionValueHolder.v.getResourceId(), null, request.properties); - return newRoutingMapObs.map(routingMap -> { - newState.routingMap = routingMap; + return newRoutingMapObs.map(routingMapValueHolder -> { + newState.routingMap = routingMapValueHolder.v; return newState; }); } @@ -384,14 +386,11 @@ private Mono getOrRefreshRoutingMap(RxDocumentServiceRequest reque }); } - private Mono getStateWithNewRoutingMap(RefreshState state, Mono routingMapSingle) { - return routingMapSingle.map(r -> { - state.routingMap = r; - return state; - }).switchIfEmpty(Mono.fromSupplier(() -> { - state.routingMap = null; + private Mono getStateWithNewRoutingMap(RefreshState state, Mono> routingMapSingle) { + return routingMapSingle.map(routingMapValueHolder -> { + state.routingMap = routingMapValueHolder.v; return state; - })); + }); } /** @@ -422,7 +421,7 @@ private Mono resolveAddressesAndIdentityAsync( } // At this point we have both collection and routingMap. - Mono resultObs = this.tryResolveServerPartitionAsync( + Mono> resultObs = this.tryResolveServerPartitionAsync( request, state.collection, state.routingMap, @@ -446,16 +445,22 @@ private Mono resolveAddressesAndIdentityAsync( return Mono.just(funcResolutionResult); }; - return resultObs.flatMap(addCollectionRidIfNameBased).switchIfEmpty(Mono.defer(() -> { + return resultObs.flatMap(resolutionResultValueHolder -> { + if (resolutionResultValueHolder.v != null) { + return addCollectionRidIfNameBased.apply(resolutionResultValueHolder.v); + } // result is empty + // result is null: + assert resolutionResultValueHolder.v == null; + Function> ensureCollectionRoutingMapCacheIsUptoDateFunc = funcState -> { if (!funcState.collectionRoutingMapCacheIsUptoDate) { funcState.collectionRoutingMapCacheIsUptoDate = true; - Mono newRoutingMapObs = this.collectionRoutingMapCache.tryLookupAsync( - funcState.collection.getResourceId(), - funcState.routingMap, - request.properties); + Mono> newRoutingMapObs = this.collectionRoutingMapCache.tryLookupAsync( + funcState.collection.getResourceId(), + funcState.routingMap, + request.properties); return getStateWithNewRoutingMap(funcState, newRoutingMapObs); } else { @@ -463,7 +468,7 @@ private Mono resolveAddressesAndIdentityAsync( } }; - Function> resolveServerPartition = funcState -> { + Function>> resolveServerPartition = funcState -> { try { AddressResolver.ensureRoutingMapPresent(request, funcState.routingMap, funcState.collection); @@ -472,16 +477,16 @@ private Mono resolveAddressesAndIdentityAsync( } return this.tryResolveServerPartitionAsync( - request, - funcState.collection, - funcState.routingMap, - true, - true, - forceRefreshPartitionAddresses); + request, + funcState.collection, + funcState.routingMap, + true, + true, + forceRefreshPartitionAddresses); }; - Function> onNullThrowNotFound = funcResolutionResult -> { - if (funcResolutionResult == null) { + Function, Mono> onNullThrowNotFound = funcResolutionResult -> { + if (funcResolutionResult.v == null) { logger.debug("Couldn't route partitionkeyrange-oblivious request after retry/cache refresh. Collection doesn't exist."); // At this point collection cache and routing map caches are refreshed. @@ -491,7 +496,7 @@ private Mono resolveAddressesAndIdentityAsync( return Mono.error(BridgeInternal.setResourceAddress(new NotFoundException(), request.getResourceAddress())); } - return Mono.just(funcResolutionResult); + return Mono.just(funcResolutionResult.v); }; // Couldn't resolve server partition or its addresses. @@ -500,18 +505,18 @@ private Mono resolveAddressesAndIdentityAsync( request.forceNameCacheRefresh = true; state.collectionCacheIsUptoDate = true; - Mono newCollectionObs = this.collectionCache.resolveCollectionAsync(request); - Mono newRefreshStateObs = newCollectionObs.flatMap(collection -> { - state.collection = collection; + Mono> newCollectionObs = this.collectionCache.resolveCollectionAsync(request); + Mono newRefreshStateObs = newCollectionObs.flatMap(collectionValueHolder -> { + state.collection = collectionValueHolder.v; - if (collection.getResourceId() != state.routingMap.getCollectionUniqueId()) { + if (collectionValueHolder.v.getResourceId() != state.routingMap.getCollectionUniqueId()) { // Collection cache was stale. We resolved to new Rid. routing map cache is potentially stale // for this new collection rid. Mark it as such. state.collectionRoutingMapCacheIsUptoDate = false; - Mono newRoutingMap = this.collectionRoutingMapCache.tryLookupAsync( - collection.getResourceId(), - null, - request.properties); + Mono> newRoutingMap = this.collectionRoutingMapCache.tryLookupAsync( + collectionValueHolder.v.getResourceId(), + null, + request.properties); return getStateWithNewRoutingMap(state, newRoutingMap); } @@ -519,18 +524,18 @@ private Mono resolveAddressesAndIdentityAsync( return Mono.just(state); }); - Mono newResultObs = newRefreshStateObs.flatMap(ensureCollectionRoutingMapCacheIsUptoDateFunc) - .flatMap(resolveServerPartition); + Mono> newResultObs = newRefreshStateObs.flatMap(ensureCollectionRoutingMapCacheIsUptoDateFunc) + .flatMap(resolveServerPartition); return newResultObs.flatMap(onNullThrowNotFound).flatMap(addCollectionRidIfNameBased); } else { return ensureCollectionRoutingMapCacheIsUptoDateFunc.apply(state) - .flatMap(resolveServerPartition) - .flatMap(onNullThrowNotFound) - .flatMap(addCollectionRidIfNameBased); + .flatMap(resolveServerPartition) + .flatMap(onNullThrowNotFound) + .flatMap(addCollectionRidIfNameBased); } - })); + }); } ); } @@ -556,13 +561,13 @@ private ResolutionResult handleRangeAddressResolutionFailure( private Mono returnOrError(Callable function) { try { - return Mono.justOrEmpty(function.call()); + return Mono.just(function.call()); } catch (Exception e) { return Mono.error(e); } } - private Mono tryResolveServerPartitionByPartitionKeyRangeIdAsync( + private Mono> tryResolveServerPartitionByPartitionKeyRangeIdAsync( RxDocumentServiceRequest request, DocumentCollection collection, CollectionRoutingMap routingMap, @@ -573,23 +578,26 @@ private Mono tryResolveServerPartitionByPartitionKeyRangeIdAsy PartitionKeyRange partitionKeyRange = routingMap.getRangeByPartitionKeyRangeId(request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()); if (partitionKeyRange == null) { logger.debug("Cannot resolve range '{}'", request.getPartitionKeyRangeIdentity().toHeader()); - return returnOrError(() -> this.handleRangeAddressResolutionFailure(request, collectionCacheIsUpToDate, routingMapCacheIsUpToDate, routingMap)); + return returnOrError(() -> new Utils.ValueHolder<>(this.handleRangeAddressResolutionFailure(request, collectionCacheIsUpToDate, routingMapCacheIsUpToDate, routingMap))); } - Mono addressesObs = this.addressCache.tryGetAddresses( + Mono> addressesObs = this.addressCache.tryGetAddresses( request, new PartitionKeyRangeIdentity(collection.getResourceId(), request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()), forceRefreshPartitionAddresses); - return addressesObs.flatMap(addresses -> Mono.just(new ResolutionResult(partitionKeyRange, addresses))).switchIfEmpty(Mono.defer(() -> { - logger.debug("Cannot resolve addresses for range '{}'", request.getPartitionKeyRangeIdentity().toHeader()); + return addressesObs.flatMap(addressesValueHolder -> { + if (addressesValueHolder.v == null) { + logger.debug("Cannot resolve addresses for range '{}'", request.getPartitionKeyRangeIdentity().toHeader()); - try { - return Mono.justOrEmpty(this.handleRangeAddressResolutionFailure(request, collectionCacheIsUpToDate, routingMapCacheIsUpToDate, routingMap)); - } catch (CosmosClientException e) { - return Mono.error(e); + try { + return Mono.just(new Utils.ValueHolder<>(this.handleRangeAddressResolutionFailure(request, collectionCacheIsUpToDate, routingMapCacheIsUpToDate, routingMap))); + } catch (CosmosClientException e) { + return Mono.error(e); + } } - })); + return Mono.just(new Utils.ValueHolder<>(new ResolutionResult(partitionKeyRange, addressesValueHolder.v))); + }); } private PartitionKeyRange tryResolveServerPartitionByPartitionKey( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java index 49e65b5f9f1e..e056de1f74ff 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java @@ -134,9 +134,9 @@ private URL getServiceEndpoint() { } @Override - public Mono tryGetAddresses(RxDocumentServiceRequest request, - PartitionKeyRangeIdentity partitionKeyRangeIdentity, - boolean forceRefreshPartitionAddresses) { + public Mono> tryGetAddresses(RxDocumentServiceRequest request, + PartitionKeyRangeIdentity partitionKeyRangeIdentity, + boolean forceRefreshPartitionAddresses) { Utils.checkNotNullOrThrow(request, "request", ""); Utils.checkNotNullOrThrow(partitionKeyRangeIdentity, "partitionKeyRangeIdentity", ""); @@ -148,7 +148,8 @@ public Mono tryGetAddresses(RxDocumentServiceRequest reque PartitionKeyRange.MASTER_PARTITION_KEY_RANGE_ID)) { // if that's master partition return master partition address! - return this.resolveMasterAsync(request, forceRefreshPartitionAddresses, request.properties).map(Pair::getRight); + return this.resolveMasterAsync(request, forceRefreshPartitionAddresses, request.properties) + .map(partitionKeyRangeIdentityPair -> new Utils.ValueHolder<>(partitionKeyRangeIdentityPair.getRight())); } Instant suboptimalServerPartitionTimestamp = this.suboptimalServerPartitionTimestamps.get(partitionKeyRangeIdentity); @@ -194,25 +195,25 @@ public Mono tryGetAddresses(RxDocumentServiceRequest reque this.suboptimalServerPartitionTimestamps.remove(partitionKeyRangeIdentity); } - Mono addressesObs = this.serverPartitionAddressCache.getAsync( + Mono> addressesObs = this.serverPartitionAddressCache.getAsync( partitionKeyRangeIdentity, null, () -> this.getAddressesForRangeId( request, partitionKeyRangeIdentity.getCollectionRid(), partitionKeyRangeIdentity.getPartitionKeyRangeId(), - false)); + false)).map(Utils.ValueHolder::new); return addressesObs.map( - addresses -> { - if (notAllReplicasAvailable(addresses)) { + addressesValueHolder -> { + if (notAllReplicasAvailable(addressesValueHolder.v)) { if (logger.isDebugEnabled()) { - logger.debug("not all replicas available {}", JavaStreamUtils.info(addresses)); + logger.debug("not all replicas available {}", JavaStreamUtils.info(addressesValueHolder.v)); } this.suboptimalServerPartitionTimestamps.putIfAbsent(partitionKeyRangeIdentity, Instant.now()); } - return addresses; + return addressesValueHolder; }).onErrorResume(ex -> { Throwable unwrappedException = reactor.core.Exceptions.unwrap(ex); CosmosClientException dce = Utils.as(unwrappedException, CosmosClientException.class); @@ -230,7 +231,7 @@ public Mono tryGetAddresses(RxDocumentServiceRequest reque //remove from suboptimal cache in case the collection+pKeyRangeId combo is gone. this.suboptimalServerPartitionTimestamps.remove(partitionKeyRangeIdentity); logger.debug("tryGetAddresses: inner onErrorResumeNext return null", dce); - return Mono.empty(); + return Mono.just(new Utils.ValueHolder<>(null)); } return Mono.error(unwrappedException); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java index cde73be67088..d5cd1386fdcf 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java @@ -8,15 +8,17 @@ import com.azure.cosmos.implementation.DocumentCollection; import com.azure.cosmos.implementation.GlobalEndpointManager; import com.azure.cosmos.implementation.IAuthorizationTokenProvider; -import com.azure.cosmos.implementation.PartitionKeyRange; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.UserAgentContainer; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.caches.RxCollectionCache; import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache; import com.azure.cosmos.implementation.http.HttpClient; import com.azure.cosmos.implementation.routing.CollectionRoutingMap; import com.azure.cosmos.implementation.routing.PartitionKeyRangeIdentity; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.util.concurrent.Queues; import java.net.URL; import java.util.ArrayList; @@ -27,8 +29,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -; - public class GlobalAddressResolver implements IAddressResolver { private final static int MaxBackupReadRegions = 3; private final GlobalEndpointManager endpointManager; @@ -78,18 +78,22 @@ public GlobalAddressResolver( } Mono openAsync(DocumentCollection collection) { - Mono routingMap = this.routingMapProvider.tryLookupAsync(collection.getId(), null, null); + Mono> routingMap = this.routingMapProvider.tryLookupAsync(collection.getId(), null, null); return routingMap.flatMap(collectionRoutingMap -> { - List ranges = ((List)collectionRoutingMap.getOrderedPartitionKeyRanges()).stream().map(range -> + if ( collectionRoutingMap.v == null) { + return Mono.empty(); + } + + List ranges = collectionRoutingMap.v.getOrderedPartitionKeyRanges().stream().map(range -> new PartitionKeyRangeIdentity(collection.getResourceId(), range.getId())).collect(Collectors.toList()); List> tasks = new ArrayList<>(); + Mono[] array = new Mono[this.addressCacheByEndpoint.values().size()]; for (EndpointCache endpointCache : this.addressCacheByEndpoint.values()) { tasks.add(endpointCache.addressCache.openAsync(collection, ranges)); } - // TODO: Not sure if this will work. - return Mono.whenDelayError(tasks); - }).switchIfEmpty(Mono.defer(Mono::empty)); + return Flux.mergeDelayError(Queues.SMALL_BUFFER_SIZE, tasks.toArray(array)).then(); + }); } @Override diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/IAddressCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/IAddressCache.java index f6f51e78cccf..5b01ff483050 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/IAddressCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/IAddressCache.java @@ -4,6 +4,7 @@ package com.azure.cosmos.implementation.directconnectivity; import com.azure.cosmos.implementation.RxDocumentServiceRequest; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.routing.PartitionKeyRangeIdentity; import reactor.core.publisher.Mono; @@ -19,7 +20,7 @@ public interface IAddressCache { * @param forceRefreshPartitionAddresses Whether addresses need to be refreshed as previously resolved addresses were determined to be outdated. * @return Physical addresses. */ - Mono tryGetAddresses( + Mono> tryGetAddresses( RxDocumentServiceRequest request, PartitionKeyRangeIdentity partitionKeyRangeIdentity, boolean forceRefreshPartitionAddresses); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java index 6b4154248222..78f2a05d39f7 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java @@ -29,8 +29,8 @@ public class DocumentQueryExecutionContextFactory { private final static int PageSizeFactorForTop = 5; - private static Mono resolveCollection(IDocumentQueryClient client, SqlQuerySpec query, - ResourceType resourceTypeEnum, String resourceLink) { + private static Mono> resolveCollection(IDocumentQueryClient client, SqlQuerySpec query, + ResourceType resourceTypeEnum, String resourceLink) { RxCollectionCache collectionCache = client.getCollectionCache(); @@ -54,7 +54,7 @@ public static Flux collectionObs = Flux.empty(); + Flux> collectionObs = Flux.empty(); if (resourceTypeEnum.isCollectionChild()) { collectionObs = resolveCollection(client, query, resourceTypeEnum, resourceLink).flux(); @@ -65,9 +65,10 @@ public static Flux> proxyQueryExecutionContext = - collectionObs.flatMap(collection -> { - if (feedOptions != null && feedOptions.partitionKey() != null && feedOptions.partitionKey().equals(PartitionKey.None)) { - feedOptions.partitionKey(BridgeInternal.getPartitionKey(BridgeInternal.getNonePartitionKey(collection.getPartitionKey()))); + collectionObs.flatMap(collectionValueHolder -> { + + if (collectionValueHolder.v != null && feedOptions != null && feedOptions.partitionKey() != null && feedOptions.partitionKey().equals(PartitionKey.None)) { + feedOptions.partitionKey(BridgeInternal.getPartitionKey(BridgeInternal.getNonePartitionKey(collectionValueHolder.v.getPartitionKey()))); } return ProxyDocumentQueryExecutionContext.createAsync( client, @@ -76,19 +77,10 @@ public static Flux(documentCollection))); Mono singleShouldRetry = renameCollectionAwareClientRetryPolicy .shouldRetry(notFoundException); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/AddressResolverTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/AddressResolverTest.java index f2b7bf4964ea..1432d6c55008 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/AddressResolverTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/AddressResolverTest.java @@ -16,6 +16,7 @@ import com.azure.cosmos.implementation.PartitionKeyRange; import com.azure.cosmos.implementation.ResourceType; import com.azure.cosmos.implementation.RxDocumentServiceRequest; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.caches.RxCollectionCache; import com.azure.cosmos.implementation.routing.CollectionRoutingMap; import com.azure.cosmos.implementation.routing.IServerIdentity; @@ -319,7 +320,7 @@ private void initializeMocks( currentCollection.setValue(collectionAfterRefresh); AddressResolverTest.this.collectionCacheRefreshedCount++; request.forceNameCacheRefresh = false; - return Mono.just(currentCollection.getValue()); + return Mono.just(new Utils.ValueHolder<>(currentCollection.getValue())); } if (request.forceNameCacheRefresh && collectionAfterRefresh == null) { @@ -335,10 +336,10 @@ private void initializeMocks( } if (!request.forceNameCacheRefresh && currentCollection.getValue() != null) { - return Mono.just(currentCollection.getValue()); + return Mono.just(new Utils.ValueHolder<>(currentCollection.getValue())); } - return Mono.empty(); + return new Utils.ValueHolder<>(null); }).when(this.collectionCache).resolveCollectionAsync(Mockito.any(RxDocumentServiceRequest.class)); // Routing map cache @@ -359,7 +360,7 @@ private void initializeMocks( CollectionRoutingMap previousValue = invocationOnMock.getArgumentAt(1, CollectionRoutingMap.class); if (previousValue == null) { - return Mono.justOrEmpty(currentRoutingMap.get(collectionRid)); + return Mono.just(new Utils.ValueHolder<>(currentRoutingMap.get(collectionRid))); } if (previousValue != null && currentRoutingMap.containsKey(previousValue.getCollectionUniqueId()) && @@ -383,7 +384,7 @@ private void initializeMocks( } - return Mono.justOrEmpty(currentRoutingMap.get(collectionRid)); + return Mono.just(new Utils.ValueHolder<>(currentRoutingMap.get(collectionRid))); } return Mono.error(new NotImplementedException("not mocked")); @@ -403,7 +404,7 @@ private void initializeMocks( Boolean forceRefresh = invocationOnMock.getArgumentAt(2, Boolean.class); if (!forceRefresh) { - return Mono.justOrEmpty(currentAddresses.get(findMatchingServiceIdentity(currentAddresses, pkri))); + return Mono.just(new Utils.ValueHolder<>(currentAddresses.get(findMatchingServiceIdentity(currentAddresses, pkri)))); } else { ServiceIdentity si; @@ -426,8 +427,7 @@ private void initializeMocks( addressesRefreshCount.put(si, addressesRefreshCount.get(si) + 1); } - // TODO: what to return in this case if it is null!! - return Mono.justOrEmpty(currentAddresses.get(si)); + return Mono.just(new Utils.ValueHolder<>(currentAddresses.get(si))); } }).when(fabricAddressCache).tryGetAddresses(Mockito.any(RxDocumentServiceRequest.class), Mockito.any(PartitionKeyRangeIdentity.class), Mockito.anyBoolean()); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java index 0d4da1ad8ff0..15d108fa0c68 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java @@ -19,6 +19,7 @@ import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.TestConfigurations; import com.azure.cosmos.implementation.TestSuiteBase; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.http.HttpClient; import com.azure.cosmos.implementation.http.HttpClientConfig; import com.azure.cosmos.implementation.routing.PartitionKeyRangeIdentity; @@ -186,9 +187,10 @@ public void tryGetAddresses_ForDataPartitions(String partitionKeyRangeId, String PartitionKeyRangeIdentity partitionKeyRangeIdentity = new PartitionKeyRangeIdentity(collectionRid, partitionKeyRangeId); boolean forceRefreshPartitionAddresses = false; - Mono addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); + Mono> addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); - ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT)); + ArrayList addressInfosFromCache = + Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT).v); Mono> masterAddressFromGatewayObs = cache.getServerAddressesViaGatewayAsync(req, collectionRid, ImmutableList.of(partitionKeyRangeId), false); @@ -242,8 +244,8 @@ public void tryGetAddresses_ForDataPartitions_AddressCachedByOpenAsync_NoHttpReq PartitionKeyRangeIdentity partitionKeyRangeIdentity = new PartitionKeyRangeIdentity(collectionRid, partitionKeyRangeId); boolean forceRefreshPartitionAddresses = false; - Mono addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); - ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT)); + Mono> addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); + ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT).v); // no new request is made assertThat(httpClientWrapper.capturedRequests) @@ -296,8 +298,8 @@ public void tryGetAddresses_ForDataPartitions_ForceRefresh( new Database(), new HashMap<>()); PartitionKeyRangeIdentity partitionKeyRangeIdentity = new PartitionKeyRangeIdentity(collectionRid, partitionKeyRangeId); - Mono addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, true); - ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT)); + Mono> addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, true); + ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT).v); // no new request is made assertThat(httpClientWrapper.capturedRequests) @@ -353,8 +355,8 @@ public void tryGetAddresses_ForDataPartitions_Suboptimal_Refresh( new Database(), new HashMap<>()); PartitionKeyRangeIdentity partitionKeyRangeIdentity = new PartitionKeyRangeIdentity(collectionRid, partitionKeyRangeId); - Mono addressesInfosFromCacheObs = origCache.tryGetAddresses(req, partitionKeyRangeIdentity, true); - ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT)); + Mono> addressesInfosFromCacheObs = origCache.tryGetAddresses(req, partitionKeyRangeIdentity, true); + ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT).v); // no new request is made assertThat(httpClientWrapper.capturedRequests) @@ -397,15 +399,15 @@ public Mono> answer(InvocationOnMock invocationOnMock) throws Thro // force refresh to replace existing with sub-optimal addresses addressesInfosFromCacheObs = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, true); - AddressInformation[] suboptimalAddresses = getSuccessResult(addressesInfosFromCacheObs, TIMEOUT); + Utils.ValueHolder suboptimalAddresses = getSuccessResult(addressesInfosFromCacheObs, TIMEOUT); assertThat(httpClientWrapper.capturedRequests) .describedAs("getServerAddressesViaGatewayAsync will read addresses from gateway") .asList().hasSize(1); httpClientWrapper.capturedRequests.clear(); // relaxes one replica being down - assertThat(suboptimalAddresses.length).isLessThanOrEqualTo((ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 1)); - assertThat(suboptimalAddresses.length).isGreaterThanOrEqualTo(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 2); + assertThat(suboptimalAddresses.v.length).isLessThanOrEqualTo((ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 1)); + assertThat(suboptimalAddresses.v.length).isGreaterThanOrEqualTo(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 2); assertThat(fetchCounter.get()).isEqualTo(1); // no refresh, use cache @@ -414,15 +416,15 @@ public Mono> answer(InvocationOnMock invocationOnMock) throws Thro assertThat(httpClientWrapper.capturedRequests) .describedAs("getServerAddressesViaGatewayAsync will read addresses from gateway") .asList().hasSize(0); - AssertionsForClassTypes.assertThat(suboptimalAddresses).hasSize(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 1); + AssertionsForClassTypes.assertThat(suboptimalAddresses.v).hasSize(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 1); assertThat(fetchCounter.get()).isEqualTo(1); // wait for refresh time TimeUnit.SECONDS.sleep(suboptimalRefreshTime + 1); addressesInfosFromCacheObs = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, false); - AddressInformation[] addresses = getSuccessResult(addressesInfosFromCacheObs, TIMEOUT); - AssertionsForClassTypes.assertThat(addresses).hasSize(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize); + Utils.ValueHolder addresses = getSuccessResult(addressesInfosFromCacheObs, TIMEOUT); + AssertionsForClassTypes.assertThat(addresses.v).hasSize(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize); assertThat(httpClientWrapper.capturedRequests) .describedAs("getServerAddressesViaGatewayAsync will read addresses from gateway") .asList().hasSize(1); @@ -448,9 +450,9 @@ public void tryGetAddresses_ForMasterPartition(Protocol protocol) throws Excepti PartitionKeyRangeIdentity partitionKeyRangeIdentity = new PartitionKeyRangeIdentity("M"); boolean forceRefreshPartitionAddresses = false; - Mono addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); + Mono> addressesInfosFromCacheObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); - ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT)); + ArrayList addressInfosFromCache = Lists.newArrayList(getSuccessResult(addressesInfosFromCacheObs, TIMEOUT).v); Mono> masterAddressFromGatewayObs = cache.getMasterAddressesViaGatewayAsync(req, ResourceType.Database, null, "/dbs/", false, false, null); @@ -498,8 +500,7 @@ public void tryGetAddresses_ForMasterPartition_MasterPartitionAddressAlreadyCach // request master partition info to ensure it is cached. AddressInformation[] expectedAddresses = cache.tryGetAddresses(req, partitionKeyRangeIdentity, - forceRefreshPartitionAddresses) - .block(); + forceRefreshPartitionAddresses).block().v; assertThat(clientWrapper.capturedRequests).asList().hasSize(1); clientWrapper.capturedRequests.clear(); @@ -507,11 +508,11 @@ public void tryGetAddresses_ForMasterPartition_MasterPartitionAddressAlreadyCach TimeUnit.SECONDS.sleep(waitTimeInBetweenAttemptsInSeconds); - Mono addressesObs = cache.tryGetAddresses(req, + Mono> addressesObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, forceRefreshPartitionAddresses); - AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT); + AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT).v; assertExactlyEqual(actualAddresses, expectedAddresses); @@ -546,16 +547,16 @@ public void tryGetAddresses_ForMasterPartition_ForceRefresh() throws Exception { AddressInformation[] expectedAddresses = cache.tryGetAddresses(req, partitionKeyRangeIdentity, false) - .block(); + .block().v; assertThat(clientWrapper.capturedRequests).asList().hasSize(1); clientWrapper.capturedRequests.clear(); - Mono addressesObs = cache.tryGetAddresses(req, + Mono> addressesObs = cache.tryGetAddresses(req, partitionKeyRangeIdentity, true); - AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT); + AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT).v; assertExactlyEqual(actualAddresses, expectedAddresses); @@ -639,16 +640,16 @@ public Mono> answer(InvocationOnMock invocationOnMock) throws Thro AddressInformation[] expectedAddresses = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, false) - .block(); + .block().v; assertThat(clientWrapper.capturedRequests).asList().hasSize(1); clientWrapper.capturedRequests.clear(); - Mono addressesObs = spyCache.tryGetAddresses(req, + Mono> addressesObs = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, false); - AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT); + AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT).v; assertExactlyEqual(actualAddresses, expectedAddresses); @@ -730,7 +731,7 @@ public Mono> answer(InvocationOnMock invocationOnMock) throws Thro AddressInformation[] subOptimalAddresses = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, false) - .block(); + .block().v; assertThat(getMasterAddressesViaGatewayAsyncInvocation.get()).isEqualTo(1); AssertionsForClassTypes.assertThat(subOptimalAddresses).hasSize(ServiceConfig.SystemReplicationPolicy.MaxReplicaSetSize - 1); @@ -743,12 +744,12 @@ public Mono> answer(InvocationOnMock invocationOnMock) throws Thro assertThat(clientWrapper.capturedRequests).asList().hasSize(1); clientWrapper.capturedRequests.clear(); - Mono addressesObs = spyCache.tryGetAddresses(req, + Mono> addressesObs = spyCache.tryGetAddresses(req, partitionKeyRangeIdentity, false); - AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT); + AddressInformation[] actualAddresses = getSuccessResult(addressesObs, TIMEOUT).v; // the cache address is used. no new http request is sent assertThat(clientWrapper.capturedRequests).asList().hasSize(1); assertThat(getMasterAddressesViaGatewayAsyncInvocation.get()).isEqualTo(2); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolverTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolverTest.java index 309643836db6..b4bc1aefa9eb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolverTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolverTest.java @@ -13,6 +13,7 @@ import com.azure.cosmos.implementation.ResourceType; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.UserAgentContainer; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.caches.RxCollectionCache; import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache; import com.azure.cosmos.implementation.http.HttpClient; @@ -37,8 +38,6 @@ import static org.assertj.core.api.Assertions.assertThat; -; - public class GlobalAddressResolverTest { private HttpClient httpClient; @@ -91,7 +90,7 @@ public void setup() throws Exception { DocumentCollection collectionDefinition = new DocumentCollection(); collectionDefinition.setId(UUID.randomUUID().toString()); collectionCache = Mockito.mock(RxCollectionCache.class); - Mockito.when(collectionCache.resolveCollectionAsync(Matchers.any(RxDocumentServiceRequest.class))).thenReturn(Mono.just(collectionDefinition)); + Mockito.when(collectionCache.resolveCollectionAsync(Matchers.any(RxDocumentServiceRequest.class))).thenReturn(Mono.just(new Utils.ValueHolder<>(collectionDefinition))); routingMapProvider = Mockito.mock(RxPartitionKeyRangeCache.class); userAgentContainer = Mockito.mock(UserAgentContainer.class); serviceConfigReader = Mockito.mock(GatewayServiceConfigurationReader.class); @@ -148,7 +147,7 @@ public void openAsync() throws Exception { List partitionKeyRanges = new ArrayList<>(); partitionKeyRanges.add(range); Mockito.when(collectionRoutingMap.getOrderedPartitionKeyRanges()).thenReturn(partitionKeyRanges); - Mono collectionRoutingMapSingle = Mono.just(collectionRoutingMap); + Mono> collectionRoutingMapSingle = Mono.just(new Utils.ValueHolder<>(collectionRoutingMap)); Mockito.when(routingMapProvider.tryLookupAsync(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(collectionRoutingMapSingle); List ranges = new ArrayList<>(); From e02739db265689a9846c123ced1d96f631039e8c Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Wed, 13 Nov 2019 10:10:26 -0800 Subject: [PATCH 13/32] Fixed query test issues --- .../implementation/IRoutingMapProvider.java | 4 ++-- .../caches/IPartitionKeyRangeCache.java | 4 ++-- .../caches/RxPartitionKeyRangeCache.java | 10 +++++----- .../DefaultDocumentQueryExecutionContext.java | 12 ++++++------ .../implementation/query/DocumentProducer.java | 16 ++++++++-------- .../DocumentQueryExecutionContextFactory.java | 2 +- .../ProxyDocumentQueryExecutionContext.java | 12 ++++++------ 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java index 1c631b9785b6..6f7651773a51 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/IRoutingMapProvider.java @@ -22,8 +22,8 @@ public interface IRoutingMapProvider { /// This method will return all ranges which overlap this range. /// Whether forcefully refreshing the routing map is necessary /// List of effective partition key ranges for a collection or null if collection doesn't exist. - Mono> tryGetOverlappingRangesAsync(String collectionResourceId, Range range, - boolean forceRefresh /* = false */, Map properties); + Mono>> tryGetOverlappingRangesAsync(String collectionResourceId, Range range, + boolean forceRefresh /* = false */, Map properties); Mono> tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, boolean forceRefresh /* = false */, Map properties); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java index e9c1cf74870d..6797b3ad9102 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/IPartitionKeyRangeCache.java @@ -20,8 +20,8 @@ public interface IPartitionKeyRangeCache extends IRoutingMapProvider, ICollectio Mono> tryLookupAsync(String collectionRid, CollectionRoutingMap previousValue, Map properties); - Mono> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, - Map properties); + Mono>> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, + Map properties); Mono> tryGetPartitionKeyRangeByIdAsync(String collectionResourceId, String partitionKeyRangeId, boolean forceRefresh, Map properties); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java index 462f84472c70..536512009837 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxPartitionKeyRangeCache.java @@ -80,8 +80,8 @@ public Mono> tryLookupAsync(String colle * @see IPartitionKeyRangeCache#tryGetOverlappingRangesAsync(java.lang.STRING, com.azure.cosmos.internal.routing.RANGE, boolean) */ @Override - public Mono> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, - Map properties) { + public Mono>> tryGetOverlappingRangesAsync(String collectionRid, Range range, boolean forceRefresh, + Map properties) { Mono> routingMapObs = tryLookupAsync(collectionRid, null, properties); @@ -96,10 +96,10 @@ public Mono> tryGetOverlappingRangesAsync(String collect if (routingMapValueHolder.v != null) { // TODO: the routingMap.getOverlappingRanges(range) returns Collection // maybe we should consider changing to ArrayList to avoid conversion - return new ArrayList<>(routingMapValueHolder.v.getOverlappingRanges(range)); + return new Utils.ValueHolder<>(new ArrayList<>(routingMapValueHolder.v.getOverlappingRanges(range))); } else { logger.debug("Routing Map Null for collection: {} for range: {}, forceRefresh:{}", collectionRid, range.toString(), forceRefresh); - return null; + return new Utils.ValueHolder<>(null); } }); } @@ -124,7 +124,7 @@ public Mono> tryGetPartitionKeyRangeByIdAsy return new Utils.ValueHolder<>(routingMapValueHolder.v.getRangeByPartitionKeyRangeId(partitionKeyRangeId)); } else { logger.debug("Routing Map Null for collection: {}, PartitionKeyRangeId: {}, forceRefresh:{}", collectionResourceId, partitionKeyRangeId, forceRefresh); - return null; + return new Utils.ValueHolder<>(null); } }); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java index eb1816555bd9..c488b60feacb 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java @@ -85,16 +85,16 @@ public Flux> executeAsync() { if (feedOptions == null) { feedOptions = new FeedOptions(); } - + FeedOptions newFeedOptions = new FeedOptions(feedOptions); - + // We can not go to backend with the composite continuation token, // but we still need the gateway for the query plan. // The workaround is to try and parse the continuation token as a composite continuation token. // If it is, then we send the query to the gateway with max degree of parallelism to force getting back the query plan - + String originalContinuation = newFeedOptions.requestContinuation(); - + if (isClientSideContinuationToken(originalContinuation)) { // At this point we know we want back a query plan newFeedOptions.requestContinuation(null); @@ -112,7 +112,7 @@ public Flux> executeAsync() { .getPaginatedQueryResultAsObservable(newFeedOptions, createRequestFunc, executeFunc, resourceType, maxPageSize); } - public Mono> getTargetPartitionKeyRanges(String resourceId, List> queryRanges) { + public Mono>> getTargetPartitionKeyRanges(String resourceId, List> queryRanges) { // TODO: FIXME this needs to be revisited Range r = new Range<>("", "FF", true, false); @@ -222,7 +222,7 @@ public RxDocumentServiceRequest createRequestAsync(String continuationToken, Int return request; } - + private static boolean isClientSideContinuationToken(String continuationToken) { if (continuationToken != null) { ValueHolder outCompositeContinuationToken = new ValueHolder(); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java index c114945ddf6f..6aa362813e5a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java @@ -161,9 +161,9 @@ public Flux produceAsync() { .getPaginatedQueryResultAsObservable( feedOptions.requestContinuation(), sourcePartitionCreateRequestFunc, - executeRequestFuncWithRetries, - resourceType, - top, + executeRequestFuncWithRetries, + resourceType, + top, pageSize) .map(rsp -> { lastResponseContinuationToken = rsp.getContinuationToken(); @@ -186,7 +186,7 @@ private Flux splitProof(Flux> replacementRangesObs = getReplacementRanges(targetRange.toRange()); + Mono>> replacementRangesObs = getReplacementRanges(targetRange.toRange()); // Since new DocumentProducers are instantiated for the new replacement ranges, if for the new // replacement partitions split happens the corresponding DocumentProducer can recursively handle splits. @@ -197,11 +197,11 @@ private Flux splitProof(Flux> createReplacingDocumentProducersOnSplit(List

    createChildDocumentProducerOnSplit( PartitionKeyRange targetRange, String initialContinuationToken) { @@ -241,7 +241,7 @@ protected DocumentProducer createChildDocumentProducerOnSplit( top); } - private Mono> getReplacementRanges(Range range) { + private Mono>> getReplacementRanges(Range range) { return client.getPartitionKeyRangeCache().tryGetOverlappingRangesAsync(collectionRid, range, true, feedOptions.properties()); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java index 78f2a05d39f7..ad6b763158c2 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java @@ -54,7 +54,7 @@ public static Flux> collectionObs = Flux.empty(); + Flux> collectionObs = Flux.just(new Utils.ValueHolder<>(null)); if (resourceTypeEnum.isCollectionChild()) { collectionObs = resolveCollection(client, query, resourceTypeEnum, resourceLink).flux(); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ProxyDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ProxyDocumentQueryExecutionContext.java index ade8435e3c40..a2567ee7caa0 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ProxyDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ProxyDocumentQueryExecutionContext.java @@ -26,7 +26,7 @@ /** * While this class is public, but it is not part of our published public APIs. * This is meant to be internally used only by our sdk. - * + * * This class is used as a proxy to wrap the * DefaultDocumentQueryExecutionContext which is needed for sending the query to * GATEWAY first and then uses PipelinedDocumentQueryExecutionContext after it @@ -83,7 +83,7 @@ public Flux> executeAsync() { logger.error("Unexpected failure", unwrappedException); return Flux.error(unwrappedException); } - + if (!isCrossPartitionQuery((Exception) unwrappedException)) { // If this is not a cross partition query then propagate error logger.debug("Failure from gateway", unwrappedException); @@ -104,11 +104,11 @@ public Flux> executeAsync() { DefaultDocumentQueryExecutionContext queryExecutionContext = (DefaultDocumentQueryExecutionContext) this.innerExecutionContext; - Mono> partitionKeyRanges = queryExecutionContext.getTargetPartitionKeyRanges(collection.getResourceId(), + Mono>> partitionKeyRanges = queryExecutionContext.getTargetPartitionKeyRanges(collection.getResourceId(), partitionedQueryExecutionInfo.getQueryRanges()); Flux> exContext = partitionKeyRanges.flux() - .flatMap(pkranges -> DocumentQueryExecutionContextFactory.createSpecializedDocumentQueryExecutionContextAsync( + .flatMap(pkrangesValueHolder -> DocumentQueryExecutionContextFactory.createSpecializedDocumentQueryExecutionContextAsync( this.client, this.resourceTypeEnum, this.resourceType, @@ -117,7 +117,7 @@ public Flux> executeAsync() { this.resourceLink, isContinuationExpected, partitionedQueryExecutionInfo, - pkranges, + pkrangesValueHolder.v, this.collection.getResourceId(), this.correlatedActivityId)); @@ -163,6 +163,6 @@ public static Flux> c resourceLink, collection, isContinuationExpected, - correlatedActivityId)); + correlatedActivityId)); } } From 1306222fbe23c80dd1de37c426366fe41c7ee526 Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Wed, 13 Nov 2019 10:19:23 -0800 Subject: [PATCH 14/32] Fixed emulator breaking change --- .../azure/cosmos/rx/CollectionCrudTest.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java index e808cf0d139b..bbdafce476f1 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java @@ -35,6 +35,7 @@ import reactor.core.publisher.Mono; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -83,7 +84,7 @@ private CosmosContainerProperties getCollectionDefinition(String collectionName) @Test(groups = { "emulator" }, timeOut = TIMEOUT, dataProvider = "collectionCrudArgProvider") public void createCollection(String collectionName) throws InterruptedException { CosmosContainerProperties collectionDefinition = getCollectionDefinition(collectionName); - + Mono createObservable = database .createContainer(collectionDefinition); @@ -146,14 +147,12 @@ public void createCollectionWithCompositeIndexAndSpatialSpec() throws Interrupte }; List spatialIndexes = new ArrayList(); for (int index = 0; index < 2; index++) { - List collectionOfSpatialTypes = new ArrayList(); SpatialSpec spec = new SpatialSpec(); spec.setPath("/path" + index + "/*"); - for (int i = index; i < index + 3; i++) { - collectionOfSpatialTypes.add(spatialTypes[i]); - } + List collectionOfSpatialTypes = + new ArrayList(Arrays.asList(spatialTypes).subList(0, index + 3)); spec.setSpatialTypes(collectionOfSpatialTypes); spatialIndexes.add(spec); } @@ -161,7 +160,7 @@ public void createCollectionWithCompositeIndexAndSpatialSpec() throws Interrupte indexingPolicy.setSpatialIndexes(spatialIndexes); collection.setIndexingPolicy(indexingPolicy); - + Mono createObservable = database .createContainer(collection, new CosmosContainerRequestOptions()); @@ -178,7 +177,7 @@ public void createCollectionWithCompositeIndexAndSpatialSpec() throws Interrupte @Test(groups = { "emulator" }, timeOut = TIMEOUT, dataProvider = "collectionCrudArgProvider") public void readCollection(String collectionName) throws InterruptedException { CosmosContainerProperties collectionDefinition = getCollectionDefinition(collectionName); - + Mono createObservable = database.createContainer(collectionDefinition); CosmosAsyncContainer collection = createObservable.block().getContainer(); @@ -203,7 +202,7 @@ public void readCollection_DoesntExist(String collectionName) throws Exception { @Test(groups = { "emulator" }, timeOut = TIMEOUT, dataProvider = "collectionCrudArgProvider") public void deleteCollection(String collectionName) throws InterruptedException { CosmosContainerProperties collectionDefinition = getCollectionDefinition(collectionName); - + Mono createObservable = database.createContainer(collectionDefinition); CosmosAsyncContainer collection = createObservable.block().getContainer(); @@ -223,13 +222,13 @@ public void replaceCollection(String collectionName) throws InterruptedException CosmosContainerProperties collectionSettings = collection.read().block().getProperties(); // sanity check assertThat(collectionSettings.getIndexingPolicy().getIndexingMode()).isEqualTo(IndexingMode.CONSISTENT); - + // replace indexing getMode IndexingPolicy indexingMode = new IndexingPolicy(); indexingMode.setIndexingMode(IndexingMode.LAZY); collectionSettings.setIndexingPolicy(indexingMode); Mono readObservable = collection.replace(collectionSettings, new CosmosContainerRequestOptions()); - + // validate CosmosResponseValidator validator = new CosmosResponseValidator.Builder() .indexingMode(IndexingMode.LAZY).build(); From 30b5d05c5de28623c64584d339b20a2a8c86d48a Mon Sep 17 00:00:00 2001 From: David Noble Date: Wed, 13 Nov 2019 10:27:37 -0800 Subject: [PATCH 15/32] Attempt to fix CosmosPartitionKeyTests::testNonPartitionedCollectionOperations test failure which resulted from an incorrectly formed expected result string. Also: Removed unnecessary Ignore annotation imports. --- .../test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java | 1 - .../java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java | 1 - .../com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java | 1 - .../src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java | 2 +- .../java/com/azure/cosmos/implementation/ConsistencyTests1.java | 1 - 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java index 07d444ffeab9..6b53b3c7fc38 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java @@ -17,7 +17,6 @@ import com.azure.cosmos.implementation.HttpConstants; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java index 6f32cdcc6bea..e140f8c09936 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java @@ -17,7 +17,6 @@ import com.azure.cosmos.SqlQuerySpec; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.GroupedFlux; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java index 864e0b48a3e3..0a2163db18f5 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java @@ -21,7 +21,6 @@ import org.hamcrest.Matchers; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java index bf5f3d721a50..cd8efd55988e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java @@ -98,7 +98,7 @@ private void createContainerWithoutPk() throws URISyntaxException, IOException { HttpRequest httpRequest = new HttpRequest(HttpMethod.POST, uri, uri.getPort(), new HttpHeaders(headers)); httpRequest.withBody(request.getContent()); String body = httpClient.send(httpRequest).block().bodyAsString().block(); - assertThat(body).contains("\"getId\":\"" + NON_PARTITIONED_CONTAINER_ID + "\""); + assertThat(body).contains("\"id\":\"" + NON_PARTITIONED_CONTAINER_ID + "\""); // CREATE a document in the non partitioned collection using the rest API and older getVersion resourceId = Paths.DATABASES_PATH_SEGMENT + "/" + createdDatabase.getId() + "/" + Paths.COLLECTIONS_PATH_SEGMENT + "/" + collection.getId(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java index d7da88a665e8..a02888841fe0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java @@ -10,7 +10,6 @@ import com.azure.cosmos.PartitionKeyDefinition; import com.azure.cosmos.PartitionKind; import org.testng.SkipException; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; From 2c0455a74fb6baebc9f3aa5fc0edc665e4ae8f09 Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Wed, 13 Nov 2019 10:45:23 -0800 Subject: [PATCH 16/32] Fixed DocumentProducerTest --- .../azure/cosmos/implementation/query/DocumentProducer.java | 6 +++--- .../cosmos/implementation/query/DocumentProducerTest.java | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java index 6aa362813e5a..e2bb45f37afa 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java @@ -192,16 +192,16 @@ private Flux splitProof(Flux> replacementProducers = replacementRangesObs.flux().flatMap( - partitionKeyRanges -> { + partitionKeyRangesValueHolder -> { if (logger.isDebugEnabled()) { logger.info("Cross Partition Query Execution detected partition [{}] split into [{}] partitions," + " last continuation token is [{}].", targetRange.toJson(), - partitionKeyRanges.v.stream() + partitionKeyRangesValueHolder.v.stream() .map(JsonSerializable::toJson).collect(Collectors.joining(", ")), lastResponseContinuationToken); } - return Flux.fromIterable(createReplacingDocumentProducersOnSplit(partitionKeyRanges.v)); + return Flux.fromIterable(createReplacingDocumentProducersOnSplit(partitionKeyRangesValueHolder.v)); }); return produceOnSplit(replacementProducers); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/query/DocumentProducerTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/query/DocumentProducerTest.java index f9062b026619..2ecd0d45cf7b 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/query/DocumentProducerTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/query/DocumentProducerTest.java @@ -14,6 +14,7 @@ import com.azure.cosmos.implementation.PartitionKeyRange; import com.azure.cosmos.implementation.RetryPolicy; import com.azure.cosmos.implementation.RxDocumentServiceRequest; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache; import com.azure.cosmos.implementation.query.orderbyquery.OrderByRowResult; import com.azure.cosmos.implementation.query.orderbyquery.OrderbyRowComparer; @@ -519,7 +520,7 @@ private IDocumentQueryClient mockQueryClient(List replacement IDocumentQueryClient client = Mockito.mock(IDocumentQueryClient.class); RxPartitionKeyRangeCache cache = Mockito.mock(RxPartitionKeyRangeCache.class); doReturn(cache).when(client).getPartitionKeyRangeCache(); - doReturn(Mono.just(replacementRanges)).when(cache). + doReturn(Mono.just(new Utils.ValueHolder<>(replacementRanges))).when(cache). tryGetOverlappingRangesAsync(anyString(), any(Range.class), anyBoolean(), Matchers.anyMap()); return client; } From 3564497f409dbd368ab96536a5c37b8ba51d55da Mon Sep 17 00:00:00 2001 From: David Noble Date: Wed, 13 Nov 2019 22:08:47 -0800 Subject: [PATCH 17/32] Tweaked code comments --- .../directconnectivity/rntbd/RntbdRequestTimer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java index d04ae3af2716..6b3c10ee5aad 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdRequestTimer.java @@ -17,15 +17,14 @@ public final class RntbdRequestTimer implements AutoCloseable { - private static final long TIMER_RESOLUTION_IN_NANOS = 100_000_000L; // 100 ms // 5_000_000L; + private static final long TIMER_RESOLUTION_IN_NANOS = 100_000_000L; // 100 ms private static final Logger logger = LoggerFactory.getLogger(RntbdRequestTimer.class); private final long requestTimeout; private final Timer timer; public RntbdRequestTimer(final long requestTimeout) { - // Inspection of the HashedWheelTimer code shows that expiration of a timeout task takes two timer resolution - // units to complete + // HashedWheelTimer code inspection shows that timeout tasks expire within two timer resolution units this.timer = new HashedWheelTimer(TIMER_RESOLUTION_IN_NANOS, TimeUnit.NANOSECONDS); this.requestTimeout = requestTimeout; } From 8002aa657692c0b9190b7284ccd388152fee08d5 Mon Sep 17 00:00:00 2001 From: David Noble Date: Wed, 13 Nov 2019 22:39:50 -0800 Subject: [PATCH 18/32] Renamed beforeMethods for easier interpretation of the TestNG logs. We might or might not keep the renames. --- .../cosmos/implementation/RetryCreateDocumentTest.java | 6 +++--- .../java/com/azure/cosmos/implementation/TimeTokenTest.java | 4 ++-- .../directconnectivity/DCDocumentCrudTest.java | 2 +- .../java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java | 2 +- .../java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java | 2 +- .../src/test/java/com/azure/cosmos/rx/LogLevelTest.java | 2 +- .../java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java | 2 +- .../src/test/java/com/azure/cosmos/rx/ProxyHostTest.java | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java index 1b6958f720b8..a7cffeb983d1 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java @@ -141,15 +141,15 @@ public void createDocument_failImmediatelyOnNonRetriable() throws Exception { FailureValidator validator = new FailureValidator.Builder().statusCode(1).subStatusCode(2).build(); validateFailure(createObservable.timeout(Duration.ofMillis(100)), validator); } - + @BeforeMethod(groups = { "simple" }) - public void beforeMethod(Method method) { + public void before_RetryCreateDocumentTest(Method method) { Mockito.reset(client.getSpyGatewayStoreModel()); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) public void beforeClass() { - // set up the client + // set up the client client = SpyClientUnderTestFactory.createClientWithGatewaySpy(clientBuilder()); database = SHARED_DATABASE; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java index b662d8b90ddc..069a6e972853 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java @@ -15,14 +15,14 @@ public class TimeTokenTest { private Locale defaultLocale; @BeforeTest(groups = { "unit" }) - public void beforeMethod() { + public void before_TimeTokenTest() { defaultLocale = Locale.getDefault(); } @Test(groups = { "unit" }) public void nonLocaleUS() { Locale.setDefault(Locale.ITALIAN); - DateTimeFormatter RFC_1123_DATE_TIME = + DateTimeFormatter RFC_1123_DATE_TIME = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); String time = Utils.nowAsRFC1123(); Locale.setDefault(Locale.US); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java index 085dbdb8632e..50684e55830b 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java @@ -302,7 +302,7 @@ public void afterClass() { } @BeforeMethod(groups = { "direct" }) - public void beforeMethod(Method method) { + public void before_DCDocumentCrudTest(Method method) { client.getCapturedRequests().clear(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java index 098bc9542f7d..5ea3efc30b03 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java @@ -330,7 +330,7 @@ public void staledLeaseAcquiring() { } @BeforeMethod(groups = { "emulator" }, timeOut = 2 * SETUP_TIMEOUT, alwaysRun = true) - public void beforeMethod() { + public void before_ChangeFeedProcessorTest() { createdFeedCollection = createFeedCollection(); createdLeaseCollection = createLeaseCollection(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java index e0298296de20..9c1e593216da 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java @@ -71,7 +71,7 @@ public void afterClass() { } @BeforeMethod(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeMethod() { + public void before_CosmosAsyncConflictTest() { safeClose(client); client = clientBuilder().buildAsyncClient(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java index 90d6f8de9cfe..310ac9045462 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java @@ -260,7 +260,7 @@ private CosmosItemProperties getDocumentDefinition() { } @BeforeMethod(groups = { "simple" }) - public void beforeMethod(Method method) { + public void before_LogLevelTest(Method method) { LogManager.resetConfiguration(); PropertyConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.properties")); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java index f5ad31c384cd..6264388fde02 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java @@ -404,7 +404,7 @@ public List bulkInsert(CosmosAsyncContainer cosmosContaine } @BeforeMethod(groups = { "simple" }) - public void beforeMethod() throws Exception { + public void before_OrderbyDocumentQueryTest() throws Exception { // add a cool off time TimeUnit.SECONDS.sleep(10); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java index 694eb81a6beb..079af125f8b0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java @@ -142,7 +142,7 @@ public void afterClass() throws Exception { } @BeforeMethod(groups = { "simple"}) - public void beforeMethod() { + public void before_ProxyHostTest() { LogManager.resetConfiguration(); PropertyConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.properties")); } From c40b5226d4dca1dd4fcbee03c2e8c4081700da1a Mon Sep 17 00:00:00 2001 From: David Noble Date: Thu, 14 Nov 2019 01:28:15 -0800 Subject: [PATCH 19/32] Renamed beforeClass methods for easier interpretation of the TestNG logs. We might or might not keep the renames. --- .../com/azure/cosmos/CosmosContainerTest.java | 2 +- .../com/azure/cosmos/CosmosDatabaseTest.java | 2 +- .../java/com/azure/cosmos/CosmosItemTest.java | 12 +++---- .../azure/cosmos/CosmosKeyCredentialTest.java | 2 +- .../azure/cosmos/CosmosPartitionKeyTests.java | 2 +- .../cosmos/CosmosSyncStoredProcTest.java | 2 +- .../com/azure/cosmos/CosmosSyncUDFTest.java | 2 +- .../com/azure/cosmos/CosmosTriggerTest.java | 2 +- .../java/com/azure/cosmos/CosmosUserTest.java | 10 +++--- .../DocumentQuerySpyWireContentTest.java | 6 ++-- .../RetryCreateDocumentTest.java | 4 +-- .../cosmos/implementation/TimeTokenTest.java | 2 +- .../DCDocumentCrudTest.java | 4 +-- .../GatewayAddressCacheTest.java | 2 +- .../azure/cosmos/rx/AggregateQueryTests.java | 2 +- .../rx/BackPressureCrossPartitionTest.java | 2 +- .../com/azure/cosmos/rx/BackPressureTest.java | 2 +- .../cosmos/rx/ChangeFeedProcessorTest.java | 4 +-- .../com/azure/cosmos/rx/ChangeFeedTest.java | 14 ++++---- .../azure/cosmos/rx/CollectionCrudTest.java | 2 +- .../azure/cosmos/rx/CollectionQueryTest.java | 6 ++-- .../cosmos/rx/CosmosAsyncConflictTest.java | 4 +-- .../com/azure/cosmos/rx/DatabaseCrudTest.java | 2 +- .../azure/cosmos/rx/DatabaseQueryTest.java | 6 ++-- .../rx/DocumentClientResourceLeakTest.java | 2 +- .../com/azure/cosmos/rx/DocumentCrudTest.java | 2 +- .../com/azure/cosmos/rx/LogLevelTest.java | 4 +-- .../rx/MultiMasterConflictResolutionTest.java | 2 +- .../cosmos/rx/MultiOrderByQueryTests.java | 16 ++++----- .../com/azure/cosmos/rx/OfferQueryTest.java | 12 +++---- .../azure/cosmos/rx/OfferReadReplaceTest.java | 8 ++--- .../cosmos/rx/OrderbyDocumentQueryTest.java | 4 +-- .../cosmos/rx/ParallelDocumentQueryTest.java | 2 +- .../azure/cosmos/rx/PermissionCrudTest.java | 36 +++++++++---------- .../azure/cosmos/rx/PermissionQueryTest.java | 2 +- .../com/azure/cosmos/rx/ProxyHostTest.java | 4 +-- .../cosmos/rx/ReadFeedCollectionsTest.java | 2 +- .../cosmos/rx/ReadFeedDatabasesTest.java | 2 +- .../cosmos/rx/ReadFeedDocumentsTest.java | 2 +- 39 files changed, 99 insertions(+), 99 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosContainerTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosContainerTest.java index 9f7a71bb703b..92ce24ee20c4 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosContainerTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosContainerTest.java @@ -33,7 +33,7 @@ public CosmosContainerTest(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = {"emulator"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosContainerTest() { client = clientBuilder().buildClient(); createdDatabase = createSyncDatabase(client, preExistingDatabaseId); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDatabaseTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDatabaseTest.java index 91b1a4a9d8a4..5a405b172b34 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDatabaseTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDatabaseTest.java @@ -31,7 +31,7 @@ public CosmosDatabaseTest(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = {"emulator"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosDatabaseTest() { client = clientBuilder().buildClient(); createdDatabase = createSyncDatabase(client, preExistingDatabaseId); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosItemTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosItemTest.java index 4631d2792ede..9969ff0092d3 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosItemTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosItemTest.java @@ -34,7 +34,7 @@ public CosmosItemTest(CosmosClientBuilder clientBuilder) { @BeforeClass(groups = {"simple"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosItemTest() { assertThat(this.client).isNull(); this.client = clientBuilder().buildClient(); CosmosAsyncContainer asyncContainer = getSharedMultiPartitionCosmosContainer(this.client.asyncClient()); @@ -88,14 +88,14 @@ public void readItem() throws Exception { .read(new CosmosItemRequestOptions() .setPartitionKey(new PartitionKey(properties.get("mypk")))); validateItemResponse(properties, readResponse1); - + } @Test(groups = { "simple" }, timeOut = TIMEOUT) public void replaceItem() throws Exception{ CosmosItemProperties properties = getDocumentDefinition(UUID.randomUUID().toString()); CosmosItemResponse itemResponse = container.createItem(properties); - + validateItemResponse(properties, itemResponse); String newPropValue = UUID.randomUUID().toString(); BridgeInternal.setProperty(properties, "newProp", newPropValue); @@ -115,10 +115,10 @@ public void deleteItem() throws Exception { CosmosItemResponse deleteResponse = itemResponse.getItem().delete(options); assertThat(deleteResponse.getItem()).isNull(); - + } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void readAllItems() throws Exception{ CosmosItemProperties properties = getDocumentDefinition(UUID.randomUUID().toString()); @@ -150,7 +150,7 @@ public void queryItems() throws Exception{ container.queryItems(querySpec, feedOptions); assertThat(feedResponseIterator3.hasNext()).isTrue(); } - + private CosmosItemProperties getDocumentDefinition(String documentId) { final String uuid = UUID.randomUUID().toString(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosKeyCredentialTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosKeyCredentialTest.java index b6feaf773a6f..52084a15acf6 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosKeyCredentialTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosKeyCredentialTest.java @@ -327,7 +327,7 @@ public void afterMethod() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosKeyCredentialTest() { client = clientBuilder().buildAsyncClient(); database = createDatabase(client, databaseId); container = getSharedMultiPartitionCosmosContainer(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java index cd8efd55988e..544c7065101d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java @@ -53,7 +53,7 @@ public CosmosPartitionKeyTests(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws URISyntaxException, IOException { + public void before_CosmosPartitionKeyTests() throws URISyntaxException, IOException { assertThat(this.client).isNull(); client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java index 437d3896ae67..a71af5a0d525 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java @@ -30,7 +30,7 @@ public CosmosSyncStoredProcTest(CosmosClientBuilder clientBuilder) { @BeforeClass(groups = {"simple"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosSyncStoredProcTest() { assertThat(this.client).isNull(); this.client = clientBuilder().buildClient(); CosmosAsyncContainer asyncContainer = getSharedMultiPartitionCosmosContainer(this.client.asyncClient()); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncUDFTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncUDFTest.java index 3aa1c716bdaa..09dd78937963 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncUDFTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncUDFTest.java @@ -26,7 +26,7 @@ public CosmosSyncUDFTest(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = {"simple"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosSyncUDFTest() { assertThat(this.client).isNull(); this.client = clientBuilder().buildClient(); CosmosAsyncContainer asyncContainer = getSharedMultiPartitionCosmosContainer(this.client.asyncClient()); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosTriggerTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosTriggerTest.java index 60e8d4dfa9ba..08566de78ba0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosTriggerTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosTriggerTest.java @@ -25,7 +25,7 @@ public CosmosTriggerTest(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = {"simple"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosTriggerTest() { assertThat(this.client).isNull(); this.client = clientBuilder().buildClient(); CosmosAsyncContainer asyncContainer = getSharedMultiPartitionCosmosContainer(this.client.asyncClient()); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosUserTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosUserTest.java index c0f6b52ddde6..abbd37ac8078 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosUserTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosUserTest.java @@ -30,7 +30,7 @@ public CosmosUserTest(CosmosClientBuilder clientBuilder) { } @BeforeClass(groups = {"simple"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosUserTest() { client = clientBuilder().buildClient(); createdDatabase = createSyncDatabase(client, preExistingDatabaseId); } @@ -43,13 +43,13 @@ public void afterClass() { } safeCloseSyncClient(client); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createUser() throws Exception { CosmosUserProperties user = getUserProperties(); CosmosUserResponse response = createdDatabase.createUser(user); - + validateResponse(user, response); } @@ -80,7 +80,7 @@ public void deleteUser() throws Exception { } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void readAllUsers() throws Exception{ @@ -112,7 +112,7 @@ public void queryUsers() throws Exception{ Iterator> feedResponseIterator2 = createdDatabase.queryUsers(query, feedOptions); assertThat(feedResponseIterator2.hasNext()).isTrue(); - + } private void validateResponse(CosmosUserProperties properties, diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/DocumentQuerySpyWireContentTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/DocumentQuerySpyWireContentTest.java index 829cac84d45f..9688c30d0d86 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/DocumentQuerySpyWireContentTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/DocumentQuerySpyWireContentTest.java @@ -101,7 +101,7 @@ public void queryWithContinuationTokenLimit(FeedOptions options, String query, b .collectList().block(); assertThat(results.size()).describedAs("total results").isGreaterThanOrEqualTo(1); - + List requests = client.getCapturedRequests(); for(HttpRequest req: requests) { @@ -133,7 +133,7 @@ public Document createDocument(AsyncDocumentClient client, String collectionLink } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_DocumentQuerySpyWireContentTest() throws Exception { client = new SpyClientBuilder(this.clientBuilder()).build(); @@ -159,7 +159,7 @@ public void beforeClass() throws Exception { FeedOptions options = new FeedOptions(); options.setEnableCrossPartitionQuery(true); - + // do the query once to ensure the collection is cached. client.queryDocuments(getMultiPartitionCollectionLink(), "select * from root", options) .then().block(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java index a7cffeb983d1..9c0e8ddbb25d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/RetryCreateDocumentTest.java @@ -143,12 +143,12 @@ public void createDocument_failImmediatelyOnNonRetriable() throws Exception { } @BeforeMethod(groups = { "simple" }) - public void before_RetryCreateDocumentTest(Method method) { + public void beforeMethod(Method method) { Mockito.reset(client.getSpyGatewayStoreModel()); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_RetryCreateDocumentTest() { // set up the client client = SpyClientUnderTestFactory.createClientWithGatewaySpy(clientBuilder()); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java index 069a6e972853..43a7079e5ee3 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TimeTokenTest.java @@ -15,7 +15,7 @@ public class TimeTokenTest { private Locale defaultLocale; @BeforeTest(groups = { "unit" }) - public void before_TimeTokenTest() { + public void beforeTest() { defaultLocale = Locale.getDefault(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java index 50684e55830b..e84c24981d3e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java @@ -285,7 +285,7 @@ private void validateNoDocumentQueryOperationThroughGateway() { } @BeforeClass(groups = { "direct" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_DCDocumentCrudTest() { RequestOptions options = new RequestOptions(); options.setOfferThroughput(10100); @@ -302,7 +302,7 @@ public void afterClass() { } @BeforeMethod(groups = { "direct" }) - public void before_DCDocumentCrudTest(Method method) { + public void beforeMethod(Method method) { client.getCapturedRequests().clear(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java index 47d080aad90d..714b5a23e902 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java @@ -813,7 +813,7 @@ public static void validateSuccess(Mono> observable, } @BeforeClass(groups = { "direct" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_GatewayAddressCacheTest() { client = clientBuilder().build(); createdDatabase = SHARED_DATABASE; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java index ac6db6a971df..5334a9e9947d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java @@ -181,7 +181,7 @@ public void afterClass() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT * 2) - public void beforeClass() throws Exception { + public void before_AggregateQueryTests() throws Exception { client = this.clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); truncateCollection(createdCollection); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java index b523d362cb34..91451dcd67f2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java @@ -164,7 +164,7 @@ public void query(String query, int maxItemCount, int maxExpectedBufferedCountFo } @BeforeClass(groups = { "long" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_BackPressureCrossPartitionTest() { CosmosContainerRequestOptions options = new CosmosContainerRequestOptions(); client = new ClientUnderTestBuilder(clientBuilder()).buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java index 79fd044471ab..869020636a19 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java @@ -144,7 +144,7 @@ public void query() throws Exception { } @BeforeClass(groups = { "long" }, timeOut = 2 * SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_BackPressureTest() throws Exception { CosmosContainerRequestOptions options = new CosmosContainerRequestOptions(); client = new ClientUnderTestBuilder(clientBuilder()).buildAsyncClient(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java index 5ea3efc30b03..2537b5cfd9ac 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedProcessorTest.java @@ -330,13 +330,13 @@ public void staledLeaseAcquiring() { } @BeforeMethod(groups = { "emulator" }, timeOut = 2 * SETUP_TIMEOUT, alwaysRun = true) - public void before_ChangeFeedProcessorTest() { + public void beforeMethod() { createdFeedCollection = createFeedCollection(); createdLeaseCollection = createLeaseCollection(); } @BeforeClass(groups = { "emulator" }, timeOut = SETUP_TIMEOUT, alwaysRun = true) - public void beforeClass() { + public void before_ChangeFeedProcessorTest() { client = clientBuilder().buildAsyncClient(); // try { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedTest.java index 2abf4d370ceb..761abbe09088 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ChangeFeedTest.java @@ -104,18 +104,18 @@ public void changesFromPartitionKeyRangeId_FromBeginning() throws Exception { .map(Resource::getId) .collectList() .block(); - + assertThat(partitionKeyRangeIds.size()).isGreaterThan(1); String pkRangeId = partitionKeyRangeIds.get(0); - + ChangeFeedOptions changeFeedOption = new ChangeFeedOptions(); changeFeedOption.setMaxItemCount(3); partitionKeyRangeIdInternal(changeFeedOption, pkRangeId); changeFeedOption.setStartFromBeginning(true); List> changeFeedResultList = client.queryDocumentChangeFeed(getCollectionLink(), changeFeedOption) .collectList().block(); - + int count = 0; for(int i = 0; i < changeFeedResultList.size(); i++) { FeedResponse changeFeedPage = changeFeedResultList.get(i); @@ -125,7 +125,7 @@ public void changesFromPartitionKeyRangeId_FromBeginning() throws Exception { assertThat(changeFeedPage.getResults().size()) .as("change feed should contain all the previously created documents") .isLessThanOrEqualTo(changeFeedOption.getMaxItemCount()); - + assertThat(changeFeedPage.getContinuationToken()).as("Response continuation should not be null").isNotNull(); assertThat(changeFeedPage.getContinuationToken()).as("Response continuation should not be empty").isNotEmpty(); } @@ -133,7 +133,7 @@ public void changesFromPartitionKeyRangeId_FromBeginning() throws Exception { assertThat(count).as("the number of changes").isGreaterThan(0); assertThat(count).as("the number of changes").isLessThan(partitionKeyToDocuments.size()); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void changeFeed_fromNow() throws Exception { // READ change feed from current. @@ -253,7 +253,7 @@ public void populateDocuments(Method method) { createdCollection = createCollection(client, createdDatabase.getId(), getCollectionDefinition(), options); List docs = new ArrayList<>(); - + for (int i = 0; i < 200; i++) { String partitionKey = UUID.randomUUID().toString(); for(int j = 0; j < 7; j++) { @@ -268,7 +268,7 @@ public void populateDocuments(Method method) { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_ChangeFeedTest() throws Exception { // set up the client client = clientBuilder().build(); createdDatabase = SHARED_DATABASE; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java index bbdafce476f1..ad3c25b255a0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionCrudTest.java @@ -300,7 +300,7 @@ public void sessionTokenConsistencyCollectionDeleteCreateSameName() { } @BeforeClass(groups = { "emulator" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CollectionCrudTest() { client = clientBuilder().buildAsyncClient(); database = createDatabase(client, databaseId); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionQueryTest.java index de1ef317d293..e1437533be9d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CollectionQueryTest.java @@ -42,7 +42,7 @@ public CollectionQueryTest(CosmosClientBuilder clientBuilder) { @Test(groups = { "simple" }, timeOut = TIMEOUT) public void queryCollectionsWithFilter() throws Exception { - + String filterCollectionId = createdCollections.get(0).getId(); String query = String.format("SELECT * from c where c.id = '%s'", filterCollectionId); @@ -110,9 +110,9 @@ public void queryCollections_NoResults() throws Exception { .build(); validateQuerySuccess(queryObservable, validator); } - + @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_CollectionQueryTest() throws Exception { client = clientBuilder().buildAsyncClient(); createdDatabase = createDatabase(client, databaseId); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java index 9c1e593216da..f7ae1b94205a 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/CosmosAsyncConflictTest.java @@ -60,7 +60,7 @@ public void readConflicts_toBlocking_toIterator() { @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_CosmosAsyncConflictTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); } @@ -71,7 +71,7 @@ public void afterClass() { } @BeforeMethod(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void before_CosmosAsyncConflictTest() { + public void beforeMethod() { safeClose(client); client = clientBuilder().buildAsyncClient(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseCrudTest.java index f9a3d44a3cf8..720c5c0a2364 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseCrudTest.java @@ -109,7 +109,7 @@ public void deleteDatabase_DoesntExist() throws Exception { } @BeforeClass(groups = { "emulator" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_DatabaseCrudTest() { client = clientBuilder().buildAsyncClient(); createdDatabase = createDatabase(client, preExistingDatabaseId); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseQueryTest.java index 7008a2bbdc34..27e1c06d02ca 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DatabaseQueryTest.java @@ -32,12 +32,12 @@ public class DatabaseQueryTest extends TestSuiteBase { private List createdDatabases = new ArrayList<>(); private CosmosAsyncClient client; - + @Factory(dataProvider = "clientBuilders") public DatabaseQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void queryDatabaseWithFilter() throws Exception { String query = String.format("SELECT * from c where c.id = '%s'", databaseId1); @@ -110,7 +110,7 @@ public void queryDatabases_NoResults() throws Exception { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_DatabaseQueryTest() throws Exception { client = clientBuilder().buildAsyncClient(); createdDatabases.add(createDatabase(client, databaseId1)); createdDatabases.add(createDatabase(client, databaseId2)); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentClientResourceLeakTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentClientResourceLeakTest.java index 7c0bcb73c09d..0f545bdd64d0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentClientResourceLeakTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentClientResourceLeakTest.java @@ -65,7 +65,7 @@ public void resourceLeak() throws Exception { } @BeforeClass(groups = {"emulator"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_DocumentClientResourceLeakTest() { CosmosAsyncClient client = this.clientBuilder().buildAsyncClient(); try { createdDatabase = getSharedCosmosDatabase(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java index 11b77318abc4..225b2807f8b3 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java @@ -322,7 +322,7 @@ public void upsertDocument_ReplaceDocument(String documentId) throws Throwable { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_DocumentCrudTest() { assertThat(this.client).isNull(); this.client = this.clientBuilder().buildAsyncClient(); this.container = getSharedMultiPartitionCosmosContainer(this.client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java index 310ac9045462..624a6f2d2dfc 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java @@ -45,7 +45,7 @@ public LogLevelTest() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_LogLevelTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); } @@ -260,7 +260,7 @@ private CosmosItemProperties getDocumentDefinition() { } @BeforeMethod(groups = { "simple" }) - public void before_LogLevelTest(Method method) { + public void beforeMethod(Method method) { LogManager.resetConfiguration(); PropertyConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.properties")); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java index 6a5a1e185447..8e0ee45c36c9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java @@ -177,7 +177,7 @@ public void invalidConflictResolutionPolicy_CustomWithPath() throws Exception { } @BeforeClass(groups = {"multi-master"}, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_MultiMasterConflictResolutionTest() { // set up the client client = clientBuilder().buildAsyncClient(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiOrderByQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiOrderByQueryTests.java index d812489d0cf3..cb9f153d6253 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiOrderByQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiOrderByQueryTests.java @@ -60,7 +60,7 @@ class CustomComparator implements Comparator { boolean isStringPath = false; boolean isBooleanPath = false; boolean isNullPath = false; - + public CustomComparator(String path, CompositePathSortOrder order) { this.path = path; this.order = order; @@ -101,7 +101,7 @@ else if (doc1.getBoolean(path) == true && doc2.getBoolean(path) == false) return 0; } else if (isNullPath) { // all nulls are equal - return 0; + return 0; } else { throw new IllegalStateException("data type not handled by comparator!"); } @@ -119,7 +119,7 @@ public void afterClass() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_MultiOrderByQueryTests() throws Exception { client = clientBuilder().buildAsyncClient(); documentCollection = getSharedMultiPartitionCosmosContainerWithCompositeAndSpatialIndexes(client); truncateCollection(documentCollection); @@ -236,15 +236,15 @@ public void queryDocumentsWithMultiOrder() throws CosmosClientException, Interru orderByItemStringBuilder.append(","); } orderByItemStringBuilder.deleteCharAt(orderByItemStringBuilder.length() - 1); - + String topString = hasTop ? "TOP " + topCount : ""; String whereString = hasFilter ? "WHERE root." + NUMBER_FIELD + " % 2 = 0" : ""; - String query = "SELECT " + topString + " [" + selectItemStringBuilder.toString() + "] " + + String query = "SELECT " + topString + " [" + selectItemStringBuilder.toString() + "] " + "FROM root " + whereString + " " + "ORDER BY " + orderByItemStringBuilder.toString(); - + List expectedOrderedList = top(sort(filter(this.documents, hasFilter), compositeIndex, invert), hasTop, topCount) ; - + Flux> queryObservable = documentCollection.queryItems(query, feedOptions); FeedResponseListValidator validator = new FeedResponseListValidator @@ -257,7 +257,7 @@ public void queryDocumentsWithMultiOrder() throws CosmosClientException, Interru } } } - + // CREATE document with numberField not set. // This query would then be invalid. CosmosItemProperties documentWithEmptyField = generateMultiOrderByDocument(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferQueryTest.java index 536c52b7e9c6..e23c373ddda8 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferQueryTest.java @@ -77,9 +77,9 @@ public void queryOffersWithFilter() throws Exception { @Test(groups = { "emulator" }, timeOut = TIMEOUT * 100) public void queryOffersFilterMorePages() throws Exception { - + List collectionResourceIds = createdCollections.stream().map(c -> c.getResourceId()).collect(Collectors.toList()); - String query = String.format("SELECT * from c where c.offerResourceId in (%s)", + String query = String.format("SELECT * from c where c.offerResourceId in (%s)", Strings.join(collectionResourceIds.stream().map(s -> "'" + s + "'").collect(Collectors.toList())).with(",")); FeedOptions options = new FeedOptions(); @@ -124,7 +124,7 @@ public void queryCollections_NoResults() throws Exception { } @BeforeClass(groups = { "emulator" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_OfferQueryTest() throws Exception { client = clientBuilder().build(); Database d1 = new Database(); @@ -134,15 +134,15 @@ public void beforeClass() throws Exception { for(int i = 0; i < 3; i++) { DocumentCollection collection = new DocumentCollection(); collection.setId(UUID.randomUUID().toString()); - + PartitionKeyDefinition partitionKeyDef = new PartitionKeyDefinition(); ArrayList paths = new ArrayList(); paths.add("/mypk"); partitionKeyDef.setPaths(paths); collection.setPartitionKey(partitionKeyDef); - + createdCollections.add(createCollection(client, databaseId, collection)); - } + } } @AfterClass(groups = { "emulator" }, timeOut = SHUTDOWN_TIMEOUT, alwaysRun = true) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferReadReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferReadReplaceTest.java index 073edd641500..d30610ac04b9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferReadReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OfferReadReplaceTest.java @@ -48,7 +48,7 @@ public void readAndReplaceOffer() { Offer rOffer = client.readOffer(offers.get(i).getSelfLink()).single().block().getResource(); int oldThroughput = rOffer.getThroughput(); - + Flux> readObservable = client.readOffer(offers.get(i).getSelfLink()); // validate offer read @@ -69,9 +69,9 @@ public void readAndReplaceOffer() { .withOfferThroughput(newThroughput) .notNullEtag() .build(); - + validateSuccess(replaceObservable, validatorForReplace); - + } catch (Exception e) { e.printStackTrace(); } @@ -80,7 +80,7 @@ public void readAndReplaceOffer() { } @BeforeClass(groups = { "emulator" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_OfferReadReplaceTest() { client = clientBuilder().build(); createdDatabase = createDatabase(client, databaseId); createdCollection = createCollection(client, createdDatabase.getId(), diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java index 6264388fde02..01e709d1a52e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java @@ -404,13 +404,13 @@ public List bulkInsert(CosmosAsyncContainer cosmosContaine } @BeforeMethod(groups = { "simple" }) - public void before_OrderbyDocumentQueryTest() throws Exception { + public void beforeMethod() throws Exception { // add a cool off time TimeUnit.SECONDS.sleep(10); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_OrderbyDocumentQueryTest() throws Exception { client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); createdCollection = getSharedMultiPartitionCosmosContainer(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java index 28a132d844d5..3e9f67f6a615 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java @@ -268,7 +268,7 @@ public void queryDocumentsWithCompositeContinuationTokens() throws Exception { } @BeforeClass(groups = { "simple", "non-emulator" }, timeOut = 2 * SETUP_TIMEOUT) - public void beforeClass() { + public void before_ParallelDocumentQueryTest() { client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); createdCollection = getSharedMultiPartitionCosmosContainer(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionCrudTest.java index 0240828e9be4..a5ad4168571a 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionCrudTest.java @@ -61,7 +61,7 @@ public void createPermission() throws Exception { @Test(groups = { "simple" }, timeOut = TIMEOUT) public void readPermission() throws Exception { createdUser = safeCreateUser(client, createdDatabase.getId(), getUserDefinition()); - + // create permission CosmosPermissionProperties permissionSettings = new CosmosPermissionProperties() .setId(UUID.randomUUID().toString()) @@ -85,16 +85,16 @@ public void readPermission() throws Exception { @Test(groups = { "simple" }, timeOut = TIMEOUT) public void deletePermission() throws Exception { - + createdUser = safeCreateUser(client, createdDatabase.getId(), getUserDefinition()); - + // create getPermission CosmosPermissionProperties permissionSettings = new CosmosPermissionProperties() .setId(UUID.randomUUID().toString()) .setPermissionMode(PermissionMode.READ) .setResourceLink("dbs/AQAAAA==/colls/AQAAAJ0fgTc="); CosmosAsyncPermissionResponse readBackPermission = createdUser.createPermission(permissionSettings, null) - .block(); + .block(); // delete Mono deleteObservable = readBackPermission.getPermission() .delete(null); @@ -116,9 +116,9 @@ public void deletePermission() throws Exception { @Test(groups = { "simple" }, timeOut = TIMEOUT) public void upsertPermission() throws Exception { - + createdUser = safeCreateUser(client, createdDatabase.getId(), getUserDefinition()); - + // create permission CosmosPermissionProperties permissionSettings = new CosmosPermissionProperties() .setId(UUID.randomUUID().toString()) @@ -130,7 +130,7 @@ public void upsertPermission() throws Exception { // read Permission Mono readObservable = readBackPermissionResponse.getPermission() .read( null); - + // validate getPermission creation CosmosResponseValidator validator = new CosmosResponseValidator.Builder() .withId(readBackPermission.getId()) @@ -139,7 +139,7 @@ public void upsertPermission() throws Exception { .notNullEtag() .build(); validateSuccess(readObservable, validator); - + //update getPermission readBackPermission = readBackPermission.setPermissionMode(PermissionMode.ALL); @@ -152,14 +152,14 @@ public void upsertPermission() throws Exception { .withPermissionResourceLink("dbs/AQAAAA==/colls/AQAAAJ0fgTc=") .notNullEtag() .build(); - validateSuccess(updateObservable, validatorForUpdate); + validateSuccess(updateObservable, validatorForUpdate); } - + @Test(groups = { "simple" }, timeOut = TIMEOUT) public void replacePermission() throws Exception { - + createdUser = safeCreateUser(client, createdDatabase.getId(), getUserDefinition()); - + String id = UUID.randomUUID().toString(); // create permission CosmosPermissionProperties permissionSettings = new CosmosPermissionProperties() @@ -167,7 +167,7 @@ public void replacePermission() throws Exception { .setPermissionMode(PermissionMode.READ) .setResourceLink("dbs/AQAAAA==/colls/AQAAAJ0fgTc="); CosmosAsyncPermissionResponse readBackPermissionResponse = createdUser.createPermission(permissionSettings, null) - .block(); + .block(); // read Permission Mono readObservable = readBackPermissionResponse.getPermission() .read(null); @@ -180,11 +180,11 @@ public void replacePermission() throws Exception { .notNullEtag() .build(); validateSuccess(readObservable, validator); - + //update getPermission CosmosPermissionProperties readBackPermission = readBackPermissionResponse.getProperties(); readBackPermission = readBackPermission.setPermissionMode(PermissionMode.ALL); - + CosmosAsyncPermission cosmosPermission = createdUser.getPermission(id); Mono updateObservable = readBackPermissionResponse.getPermission() .replace(readBackPermission, null); @@ -196,11 +196,11 @@ public void replacePermission() throws Exception { .withPermissionResourceLink("dbs/AQAAAA==/colls/AQAAAJ0fgTc=") .notNullEtag() .build(); - validateSuccess(updateObservable, validatorForUpdate); + validateSuccess(updateObservable, validatorForUpdate); } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_PermissionCrudTest() { client = clientBuilder().buildAsyncClient(); createdDatabase = createDatabase(client, databaseId); } @@ -214,5 +214,5 @@ private static CosmosUserProperties getUserDefinition() { return new CosmosUserProperties() .setId(UUID.randomUUID().toString()); } - + } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java index 3621f0e40663..0cf2dda7b121 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java @@ -133,7 +133,7 @@ public void invalidQuerySytax() throws Exception { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_PermissionQueryTest() { client = clientBuilder().build(); Database d = new Database(); d.setId(databaseId); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java index 079af125f8b0..22677895bdfd 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java @@ -55,7 +55,7 @@ public ProxyHostTest() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws Exception { + public void before_ProxyHostTest() throws Exception { client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); createdCollection = getSharedMultiPartitionCosmosContainer(client); @@ -142,7 +142,7 @@ public void afterClass() throws Exception { } @BeforeMethod(groups = { "simple"}) - public void before_ProxyHostTest() { + public void beforeMethod() { LogManager.resetConfiguration(); PropertyConfigurator.configure(this.getClass().getClassLoader().getResource("log4j.properties")); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedCollectionsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedCollectionsTest.java index 221c341e8e84..9d849175b922 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedCollectionsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedCollectionsTest.java @@ -66,7 +66,7 @@ public void readCollections() throws Exception { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + public void before_ReadFeedCollectionsTest() { client = clientBuilder().buildAsyncClient(); createdDatabase = createDatabase(client, databaseId); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDatabasesTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDatabasesTest.java index f325fe1cd7a6..a430ac4e555d 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDatabasesTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDatabasesTest.java @@ -55,7 +55,7 @@ public void readDatabases() throws Exception { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() throws URISyntaxException { + public void before_ReadFeedDatabasesTest() throws URISyntaxException { client = clientBuilder().buildAsyncClient(); allDatabases = client.readAllDatabases(null) .map(frp -> frp.getResults()) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java index 0a63f2026f4a..b31ac5466252 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java @@ -75,7 +75,7 @@ public void readDocuments_withoutEnableCrossPartitionQuery() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT, alwaysRun = true) - public void beforeClass() { + public void before_ReadFeedDocumentsTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); truncateCollection(createdCollection); From 379486bdfba71e408587ced9306e70ab3573d5bf Mon Sep 17 00:00:00 2001 From: David Noble Date: Thu, 14 Nov 2019 12:07:31 -0800 Subject: [PATCH 20/32] Workaround issue #6346 to identify test failures that might lie behind it. --- .../azure/cosmos/rx/AggregateQueryTests.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java index 5334a9e9947d..a184df18f61c 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java @@ -5,21 +5,27 @@ import com.azure.cosmos.BridgeInternal; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosAsyncContainer; +import com.azure.cosmos.CosmosClient; import com.azure.cosmos.CosmosClientBuilder; +import com.azure.cosmos.CosmosClientException; import com.azure.cosmos.CosmosItemProperties; import com.azure.cosmos.FeedOptions; import com.azure.cosmos.FeedResponse; import com.azure.cosmos.implementation.Document; import com.azure.cosmos.implementation.FeedResponseListValidator; +import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Factory; import org.testng.annotations.Test; +import reactor.core.Exceptions; import reactor.core.publisher.Flux; import java.util.ArrayList; import java.util.UUID; +import static com.google.common.base.Strings.lenientFormat; + public class AggregateQueryTests extends TestSuiteBase { public static class QueryConfig { @@ -181,14 +187,22 @@ public void afterClass() { } @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT * 2) - public void before_AggregateQueryTests() throws Exception { + public void before_AggregateQueryTests() throws Throwable { client = this.clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); - truncateCollection(createdCollection); - + try { + truncateCollection(createdCollection); + } catch (Throwable throwable) { + throwable = Exceptions.unwrap(throwable); + if (!(throwable instanceof CosmosClientException)) { + throw new AssertionError(lenientFormat("stopping test due to collection %s truncation failure: ", + createdCollection, + throwable)); + } + logger.error("ignored: collection {} truncation failure: ", createdCollection, throwable); + } bulkInsert(); generateTestConfigs(); - waitIfNeededForReplicasToCatchUp(this.clientBuilder()); } } From 37e3186988644361fe2fa79e4e183793bd5bdbfa Mon Sep 17 00:00:00 2001 From: David Noble Date: Thu, 14 Nov 2019 14:41:55 -0800 Subject: [PATCH 21/32] Workaround issue #6346 to identify test failures that might lie behind it. --- .../src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java index a184df18f61c..755bcf8fe36f 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java @@ -5,7 +5,6 @@ import com.azure.cosmos.BridgeInternal; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosAsyncContainer; -import com.azure.cosmos.CosmosClient; import com.azure.cosmos.CosmosClientBuilder; import com.azure.cosmos.CosmosClientException; import com.azure.cosmos.CosmosItemProperties; @@ -13,7 +12,6 @@ import com.azure.cosmos.FeedResponse; import com.azure.cosmos.implementation.Document; import com.azure.cosmos.implementation.FeedResponseListValidator; -import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Factory; From 824901b431e773991c24333d24e8b580069b4281 Mon Sep 17 00:00:00 2001 From: David Noble Date: Thu, 14 Nov 2019 18:46:46 -0800 Subject: [PATCH 22/32] Attempt to resolve a number of test failures --- .../RntbdClientChannelHealthChecker.java | 54 +++++++++---------- .../rntbd/RntbdClientChannelPool.java | 6 +-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java index c844c3fb1f1a..098e47e99347 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelHealthChecker.java @@ -32,34 +32,34 @@ public final class RntbdClientChannelHealthChecker implements ChannelHealthCheck private static final Logger logger = LoggerFactory.getLogger(RntbdClientChannelHealthChecker.class); // A channel will be declared healthy if a read succeeded recently as defined by this value. - private static final long recentReadWindow = 1_000_000_000L; + private static final long recentReadWindowInNanos = 1_000_000_000L; // A channel should not be declared unhealthy if a write succeeded recently. As such gaps between // Timestamps.lastChannelWrite and Timestamps.lastChannelRead lower than this value are ignored. // Guidance: The grace period should be large enough to accommodate the round trip time of the slowest server // request. Assuming 1s of network RTT, a 2 MB request, a 2 MB response, a connection that can sustain 1 MB/s // both ways, and a 5-second deadline at the server, 10 seconds should be enough. - private static final long readHangGracePeriod = 10L * 1_000_000_000L; + private static final long readHangGracePeriodInNanos = 10L * 1_000_000_000L; // A channel will not be declared unhealthy if a write was attempted recently. As such gaps between // Timestamps.lastChannelWriteAttempt and Timestamps.lastChannelWrite lower than this value are ignored. // Guidance: The grace period should be large enough to accommodate slow writes. For example, a value of 2s requires // that the client can sustain data rates of at least 1 MB/s when writing 2 MB documents. - private static final long writeHangGracePeriod = 2L * 1_000_000_000L; + private static final long writeHangGracePeriodInNanos = 2L * 1_000_000_000L; // A channel is considered idle if: // idleConnectionTimeout > 0L && System.nanoTime() - Timestamps.lastChannelRead() >= idleConnectionTimeout - private final long idleConnectionTimeout; + private final long idleConnectionTimeoutInNanos; // A channel will be declared unhealthy if the gap between Timestamps.lastChannelWrite and Timestamps.lastChannelRead // grows beyond this value. // Constraint: readDelayLimit > readHangGracePeriod - private final long readDelayLimit; + private final long readDelayLimitInNanos; // A channel will be declared unhealthy if the gap between Timestamps.lastChannelWriteAttempt and Timestamps.lastChannelWrite // grows beyond this value. // Constraint: writeDelayLimit > writeHangGracePeriod - private final long writeDelayLimit; + private final long writeDelayLimitInNanos; // endregion @@ -69,29 +69,29 @@ public RntbdClientChannelHealthChecker(final Config config) { checkNotNull(config, "config: null"); - this.idleConnectionTimeout = config.idleConnectionTimeoutInNanos(); + this.idleConnectionTimeoutInNanos = config.idleConnectionTimeoutInNanos(); - this.readDelayLimit = config.receiveHangDetectionTimeInNanos(); - checkArgument(this.readDelayLimit > readHangGracePeriod, "config.receiveHangDetectionTime: %s", this.readDelayLimit); + this.readDelayLimitInNanos = config.receiveHangDetectionTimeInNanos(); + checkArgument(this.readDelayLimitInNanos > readHangGracePeriodInNanos, "config.receiveHangDetectionTime: %s", this.readDelayLimitInNanos); - this.writeDelayLimit = config.sendHangDetectionTimeInNanos(); - checkArgument(this.writeDelayLimit > writeHangGracePeriod, "config.sendHangDetectionTime: %s", this.writeDelayLimit); + this.writeDelayLimitInNanos = config.sendHangDetectionTimeInNanos(); + checkArgument(this.writeDelayLimitInNanos > writeHangGracePeriodInNanos, "config.sendHangDetectionTime: %s", this.writeDelayLimitInNanos); } // endregion // region Methods - public long idleConnectionTimeout() { - return this.idleConnectionTimeout; + public long idleConnectionTimeoutInNanos() { + return this.idleConnectionTimeoutInNanos; } - public long readDelayLimit() { - return this.readDelayLimit; + public long readDelayLimitInNanos() { + return this.readDelayLimitInNanos; } - public long writeDelayLimit() { - return this.writeDelayLimit; + public long writeDelayLimitInNanos() { + return this.writeDelayLimitInNanos; } public Future isHealthy(final Channel channel) { @@ -109,7 +109,7 @@ public Future isHealthy(final Channel channel) { final Timestamps timestamps = requestManager.snapshotTimestamps(); final long currentTime = System.nanoTime(); - if (currentTime - timestamps.lastChannelRead() < recentReadWindow) { + if (currentTime - timestamps.lastChannelRead() < recentReadWindowInNanos) { return promise.setSuccess(Boolean.TRUE); // because we recently received data } @@ -119,7 +119,7 @@ public Future isHealthy(final Channel channel) { final long writeDelay = timestamps.lastChannelWriteAttempt() - timestamps.lastChannelWrite(); - if (writeDelay > this.writeDelayLimit && currentTime - timestamps.lastChannelWriteAttempt() > writeHangGracePeriod) { + if (writeDelay > this.writeDelayLimitInNanos && currentTime - timestamps.lastChannelWriteAttempt() > writeHangGracePeriodInNanos) { final Optional rntbdContext = requestManager.rntbdContext(); final int pendingRequestCount = requestManager.pendingRequestCount(); @@ -127,7 +127,7 @@ public Future isHealthy(final Channel channel) { logger.warn("{} health check failed due to hung write: {lastChannelWriteAttempt: {}, lastChannelWrite: {}, " + "writeDelay: {}, writeDelayLimit: {}, rntbdContext: {}, pendingRequestCount: {}}", channel, timestamps.lastChannelWriteAttempt(), timestamps.lastChannelWrite(), writeDelay, - this.writeDelayLimit, rntbdContext, pendingRequestCount); + this.writeDelayLimitInNanos, rntbdContext, pendingRequestCount); return promise.setSuccess(Boolean.FALSE); } @@ -138,7 +138,7 @@ public Future isHealthy(final Channel channel) { final long readDelay = timestamps.lastChannelWrite() - timestamps.lastChannelRead(); - if (readDelay > this.readDelayLimit && currentTime - timestamps.lastChannelWrite() > readHangGracePeriod) { + if (readDelay > this.readDelayLimitInNanos && currentTime - timestamps.lastChannelWrite() > readHangGracePeriodInNanos) { final Optional rntbdContext = requestManager.rntbdContext(); final int pendingRequestCount = requestManager.pendingRequestCount(); @@ -146,13 +146,13 @@ public Future isHealthy(final Channel channel) { logger.warn("{} health check failed due to hung read: {lastChannelWrite: {}, lastChannelRead: {}, " + "readDelay: {}, readDelayLimit: {}, rntbdContext: {}, pendingRequestCount: {}}", channel, timestamps.lastChannelWrite(), timestamps.lastChannelRead(), readDelay, - this.readDelayLimit, rntbdContext, pendingRequestCount); + this.readDelayLimitInNanos, rntbdContext, pendingRequestCount); return promise.setSuccess(Boolean.FALSE); } - if (this.idleConnectionTimeout > 0L) { - if (currentTime - timestamps.lastChannelRead() > this.idleConnectionTimeout) { + if (this.idleConnectionTimeoutInNanos > 0L) { + if (currentTime - timestamps.lastChannelRead() > this.idleConnectionTimeoutInNanos) { return promise.setSuccess(Boolean.FALSE); } } @@ -187,9 +187,9 @@ static final class JsonSerializer extends StdSerializer Date: Thu, 14 Nov 2019 18:48:54 -0800 Subject: [PATCH 23/32] Attempt to resolve a number of test failures --- .../azure/cosmos/CosmosPartitionKeyTests.java | 4 +++- .../com/azure/cosmos/rx/BackPressureTest.java | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java index 544c7065101d..500ba67e1ee2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java @@ -204,7 +204,9 @@ public void testNonPartitionedCollectionOperations() throws Exception { // Partiton Key value same as what is specified in the stored procedure body RequestOptions options = new RequestOptions(); options.setPartitionKey(PartitionKey.None); - int result = Integer.parseInt(createdSproc.execute(null, new CosmosStoredProcedureRequestOptions()).block().getResponseAsString()); + CosmosStoredProcedureRequestOptions cosmosStoredProcedureRequestOptions = new CosmosStoredProcedureRequestOptions(); + cosmosStoredProcedureRequestOptions.setPartitionKey(PartitionKey.None); + int result = Integer.parseInt(createdSproc.execute(null, cosmosStoredProcedureRequestOptions).block().getResponseAsString()); assertThat(result).isEqualTo(1); // 3 previous items + 1 created from the sproc diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java index 869020636a19..2793ad6b001b 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java @@ -21,7 +21,6 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Factory; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; @@ -31,6 +30,7 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; @@ -73,10 +73,16 @@ public void readFeed() throws Exception { Flux> queryObservable = createdCollection.readAllItems(options); RxDocumentClientUnderTest rxClient = (RxDocumentClientUnderTest) CosmosBridgeInternal.getAsyncDocumentClient(client); + AtomicInteger valueCount = new AtomicInteger(); rxClient.httpRequests.clear(); TestSubscriber> subscriber = new TestSubscriber>(1); - queryObservable.publishOn(Schedulers.elastic(), 1).subscribe(subscriber); + queryObservable.doOnNext(cosmosItemPropertiesFeedResponse -> { + if (!cosmosItemPropertiesFeedResponse.getResults().isEmpty()) { + valueCount.incrementAndGet(); + } + }).publishOn(Schedulers.elastic(), 1).subscribe(subscriber); + int sleepTimeInMillis = 10000; // 10 seconds int i = 0; @@ -101,7 +107,7 @@ public void readFeed() throws Exception { subscriber.assertNoErrors(); subscriber.assertComplete(); - assertThat(subscriber.valueCount()).isEqualTo(createdDocuments.size()); + assertThat(valueCount.get()).isEqualTo(createdDocuments.size()); } @Test(groups = { "long" }, timeOut = 3 * TIMEOUT) @@ -115,7 +121,14 @@ public void query() throws Exception { rxClient.httpRequests.clear(); TestSubscriber> subscriber = new TestSubscriber>(1); - queryObservable.publishOn(Schedulers.elastic(), 1).subscribe(subscriber); + AtomicInteger valueCount = new AtomicInteger(); + + queryObservable.doOnNext(cosmosItemPropertiesFeedResponse -> { + if (!cosmosItemPropertiesFeedResponse.getResults().isEmpty()) { + valueCount.incrementAndGet(); + } + }).publishOn(Schedulers.elastic(), 1).subscribe(subscriber); + int sleepTimeInMillis = 10000; int i = 0; @@ -140,7 +153,7 @@ public void query() throws Exception { subscriber.assertNoErrors(); subscriber.assertComplete(); - assertThat(subscriber.valueCount()).isEqualTo(createdDocuments.size()); + assertThat(valueCount.get()).isEqualTo(createdDocuments.size()); } @BeforeClass(groups = { "long" }, timeOut = 2 * SETUP_TIMEOUT) From 34cb24c20f1434a4c9f4a6c138d15f82c2e879fa Mon Sep 17 00:00:00 2001 From: David Noble Date: Fri, 15 Nov 2019 16:37:14 -0800 Subject: [PATCH 24/32] Attempt to resolve a number of test failures --- .../java/com/azure/cosmos/rx/ResourceTokenTest.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java index 96af7f682337..9ec6e7378455 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java @@ -2,6 +2,7 @@ // Licensed under the MIT License. package com.azure.cosmos.rx; +import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.ConnectionPolicy; import com.azure.cosmos.ConsistencyLevel; import com.azure.cosmos.PartitionKey; @@ -265,8 +266,10 @@ public void readDocumentFromPermissionFeed(String documentUrl, Permission permis try { List permissionFeed = new ArrayList<>(); permissionFeed.add(permission); + ConnectionPolicy defaultPolicy = ConnectionPolicy.getDefaultPolicy(); + defaultPolicy.setConnectionMode(ConnectionMode.GATEWAY); asyncClientResourceToken = new AsyncDocumentClient.Builder().withServiceEndpoint(TestConfigurations.HOST) - .withPermissionFeed(permissionFeed).withConnectionPolicy(ConnectionPolicy.getDefaultPolicy()) + .withPermissionFeed(permissionFeed).withConnectionPolicy(defaultPolicy) .withConsistencyLevel(ConsistencyLevel.SESSION).build(); RequestOptions options = new RequestOptions(); if (StringUtils.isNotEmpty(partitionKey)) { @@ -321,8 +324,10 @@ public void readDocumentOfParKeyFromTwoCollPermissionWithDiffPartitionKeys(Strin List permissionFeed = new ArrayList<>(); permissionFeed.add(collPermission1); permissionFeed.add(collPermission2); + ConnectionPolicy defaultPolicy = ConnectionPolicy.getDefaultPolicy(); + defaultPolicy.setConnectionMode(ConnectionMode.GATEWAY); asyncClientResourceToken = new AsyncDocumentClient.Builder().withServiceEndpoint(TestConfigurations.HOST) - .withPermissionFeed(permissionFeed).withConnectionPolicy(ConnectionPolicy.getDefaultPolicy()) + .withPermissionFeed(permissionFeed).withConnectionPolicy(defaultPolicy) .withConsistencyLevel(ConsistencyLevel.SESSION).build(); RequestOptions options = new RequestOptions(); options.setPartitionKey(new PartitionKey(partitionKey)); @@ -348,8 +353,10 @@ public void readDocumentFromCollPermissionWithDiffPartitionKey_ResourceNotFound( try { List permissionFeed = new ArrayList<>(); permissionFeed.add(permission); + ConnectionPolicy defaultPolicy = ConnectionPolicy.getDefaultPolicy(); + defaultPolicy.setConnectionMode(ConnectionMode.GATEWAY); asyncClientResourceToken = new AsyncDocumentClient.Builder().withServiceEndpoint(TestConfigurations.HOST) - .withPermissionFeed(permissionFeed).withConnectionPolicy(ConnectionPolicy.getDefaultPolicy()) + .withPermissionFeed(permissionFeed).withConnectionPolicy(defaultPolicy) .withConsistencyLevel(ConsistencyLevel.SESSION).build(); RequestOptions options = new RequestOptions(); options.setPartitionKey(new PartitionKey(partitionKey)); From d1d01831e59f8d19c3407dca1e67d49664481348 Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 16 Nov 2019 10:28:46 -0800 Subject: [PATCH 25/32] Ignore ConsistencyTests1::validateConsistentPrefixOnAsyncReplication test because it is configured to use BoundedStaleness consistency. --- .../com/azure/cosmos/implementation/ConsistencyTests1.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java index a02888841fe0..57a2fff713ed 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java @@ -10,6 +10,7 @@ import com.azure.cosmos.PartitionKeyDefinition; import com.azure.cosmos.PartitionKind; import org.testng.SkipException; +import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; @@ -176,7 +177,9 @@ public void validateConsistentPrefixOnSyncReplication() throws InterruptedExcept assertThat(readLagging).isFalse(); } - // TODO (DANOBLE) test is flaky + // TODO (DANOBLE) Address ConsistencyTests1::validateConsistentPrefixOnAsyncReplication test failure #6378 + // see https://github.com/Azure/azure-sdk-for-java/issues/6378 + @Ignore @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateConsistentPrefixOnAsyncReplication() throws InterruptedException { if (!(TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.STRONG.toString()) || TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.BOUNDED_STALENESS.toString()))) { From c3872d07f8fd39b1cb0ba127a7005083e1291c20 Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 16 Nov 2019 11:41:35 -0800 Subject: [PATCH 26/32] Attempt to workaround VeryLargeDocumentQueryTest::queryLargeDocuments test timeout by bumping TIMEOUT as well as SETUP_TIMEOUT interval from 60 to 120 seconds --- .../java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java index fc9535e0c8bb..3a3fd10622f6 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java @@ -15,7 +15,6 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Factory; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -42,12 +41,12 @@ public VeryLargeDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - @Test(groups = { "emulator" }, timeOut = TIMEOUT) + @Test(groups = { "emulator" }, timeOut = 2 * TIMEOUT) public void queryLargeDocuments() { int cnt = 5; - for(int i = 0; i < cnt; i++) { + for (int i = 0; i < cnt; i++) { createLargeDocument(); } From 925381a2093f0efb8ea6218091e58d450b83bd4d Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 16 Nov 2019 13:34:05 -0800 Subject: [PATCH 27/32] Attempt to workaround VeryLargeDocumentQueryTest::queryLargeDocuments test timeout on Emulator runs by moving the queryLargeDocuments test out of the emulator group into the simple group. --- .../com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java index 3a3fd10622f6..75847c11d002 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java @@ -27,7 +27,6 @@ import static org.apache.commons.io.FileUtils.ONE_MB; -// TODO (DANOBLE) beforeClass method times out. public class VeryLargeDocumentQueryTest extends TestSuiteBase { private final static int TIMEOUT = 60000; @@ -41,7 +40,9 @@ public VeryLargeDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - @Test(groups = { "emulator" }, timeOut = 2 * TIMEOUT) + // TODO (DANOBLE) move this test back into the emulator group after we've addressed query performance on 4.X + // see https://github.com/Azure/azure-sdk-for-java/issues/6377 + @Test(groups = { "simple" }, timeOut = 2 * TIMEOUT) public void queryLargeDocuments() { int cnt = 5; @@ -82,8 +83,10 @@ private void createLargeDocument() { .verify(Duration.ofMillis(subscriberValidationTimeout)); } + // TODO (DANOBLE) beforeClass method intermittently times out within the SETUP_TIMEOUT interval. + // see see https://github.com/Azure/azure-sdk-for-java/issues/6377 @BeforeClass(groups = { "emulator" }, timeOut = 2 * SETUP_TIMEOUT) - public void beforeClass() { + public void before_VeryLargeDocumentQueryTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); truncateCollection(createdCollection); From 5ae65a81376e646444348c504dcf84d55169b8ee Mon Sep 17 00:00:00 2001 From: David Noble Date: Sat, 16 Nov 2019 18:33:25 -0800 Subject: [PATCH 28/32] Updated test TODOs based on current set of issues --- .../cosmos/benchmark/ReadMyWritesConsistencyTest.java | 1 - .../com/azure/cosmos/rx/examples/ConflictAPITest.java | 2 +- .../cosmos/rx/examples/DocumentCRUDAsyncAPITest.java | 2 +- .../azure/cosmos/rx/examples/InMemoryGroupbyTest.java | 1 - .../cosmos/rx/examples/UniqueIndexAsyncAPITest.java | 1 - .../java/com/azure/cosmos/CosmosPartitionKeyTests.java | 1 - .../azure/cosmos/implementation/ConsistencyTests1.java | 5 +++-- .../com/azure/cosmos/implementation/SessionTest.java | 1 - .../com/azure/cosmos/implementation/TestSuiteBase.java | 9 ++++----- .../directconnectivity/DCDocumentCrudTest.java | 1 - .../directconnectivity/GatewayAddressCacheTest.java | 1 - .../ReplicatedResourceClientPartitionSplitTest.java | 1 - .../java/com/azure/cosmos/rx/AggregateQueryTests.java | 2 ++ .../azure/cosmos/rx/BackPressureCrossPartitionTest.java | 6 ------ .../test/java/com/azure/cosmos/rx/BackPressureTest.java | 5 ----- .../test/java/com/azure/cosmos/rx/DocumentCrudTest.java | 7 ++++++- .../src/test/java/com/azure/cosmos/rx/LogLevelTest.java | 2 -- .../com/azure/cosmos/rx/OrderbyDocumentQueryTest.java | 2 -- .../com/azure/cosmos/rx/ParallelDocumentQueryTest.java | 3 --- .../java/com/azure/cosmos/rx/PermissionQueryTest.java | 1 - .../src/test/java/com/azure/cosmos/rx/ProxyHostTest.java | 1 - .../java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java | 1 - .../azure/cosmos/rx/ReadFeedStoredProceduresTest.java | 1 - .../java/com/azure/cosmos/rx/ReadFeedTriggersTest.java | 1 - .../test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java | 1 - .../test/java/com/azure/cosmos/rx/ResourceTokenTest.java | 2 +- .../cosmos/rx/SinglePartitionDocumentQueryTest.java | 2 -- .../com/azure/cosmos/rx/StoredProcedureQueryTest.java | 1 - .../cosmos/rx/StoredProcedureUpsertReplaceTest.java | 1 - .../src/test/java/com/azure/cosmos/rx/TestSuiteBase.java | 9 ++++----- .../test/java/com/azure/cosmos/rx/TokenResolverTest.java | 1 - .../src/test/java/com/azure/cosmos/rx/TopQueryTests.java | 1 - .../test/java/com/azure/cosmos/rx/TriggerCrudTest.java | 1 - .../test/java/com/azure/cosmos/rx/TriggerQueryTest.java | 1 - .../com/azure/cosmos/rx/TriggerUpsertReplaceTest.java | 1 - .../azure/cosmos/rx/UserDefinedFunctionQueryTest.java | 1 - .../cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java | 1 - .../src/test/java/com/azure/cosmos/rx/UserQueryTest.java | 1 - .../com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java | 3 ++- 39 files changed, 24 insertions(+), 61 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/test/java/com/azure/cosmos/benchmark/ReadMyWritesConsistencyTest.java b/sdk/cosmos/azure-cosmos-benchmark/src/test/java/com/azure/cosmos/benchmark/ReadMyWritesConsistencyTest.java index fd297f66aafc..5d147268360d 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/test/java/com/azure/cosmos/benchmark/ReadMyWritesConsistencyTest.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/test/java/com/azure/cosmos/benchmark/ReadMyWritesConsistencyTest.java @@ -94,7 +94,6 @@ public Object[][] collectionLinkTypeArgProvider() { }; } - // FIXME: Test is flaky, fails inconsistently @Test(dataProvider = "collectionLinkTypeArgProvider", groups = "e2e") public void readMyWrites(boolean useNameLink) throws Exception { diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java index 6b53b3c7fc38..b90eed564222 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/ConflictAPITest.java @@ -40,7 +40,7 @@ * transform a flux to CompletableFuture. Please see * {@link #transformObservableToCompletableFuture()} */ -// TODO (DANOBLE) setup method times out inconsistently + public class ConflictAPITest extends DocumentClientTest { private final static int TIMEOUT = 60000; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java index 295c4661fb29..daaf265feeb8 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/DocumentCRUDAsyncAPITest.java @@ -68,7 +68,7 @@ * transform a flux to CompletableFuture. Please see * {@link #transformObservableToCompletableFuture()} */ -// TODO (DANOBLE) beforeClass times out inconsistently + public class DocumentCRUDAsyncAPITest extends DocumentClientTest { private final static String PARTITION_KEY_PATH = "/mypk"; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java index e140f8c09936..34cd5b56b5e5 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/InMemoryGroupbyTest.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.UUID; -// TODO (DANOBLE) setup method times out occasionally when running against emulator. public class InMemoryGroupbyTest extends DocumentClientTest { private final static int TIMEOUT = 60000; diff --git a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java index 0a2163db18f5..84009e509e2a 100644 --- a/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java +++ b/sdk/cosmos/azure-cosmos-examples/src/test/java/com/azure/cosmos/rx/examples/UniqueIndexAsyncAPITest.java @@ -37,7 +37,6 @@ public class UniqueIndexAsyncAPITest extends DocumentClientTest { private AsyncDocumentClient client; private Database createdDatabase; - // TODO (DANOBLE) Times out when running in emulator tests. @Test(groups = "samples", timeOut = TIMEOUT) public void uniqueIndex() { DocumentCollection collectionDefinition = new DocumentCollection(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java index 500ba67e1ee2..6f57c7ebbe35 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosPartitionKeyTests.java @@ -123,7 +123,6 @@ private void createContainerWithoutPk() throws URISyntaxException, IOException { assertThat(body).contains("\"id\":\"" + NON_PARTITIONED_CONTAINER_DOCUEMNT_ID + "\""); } - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }) public void testNonPartitionedCollectionOperations() throws Exception { createContainerWithoutPk(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java index 57a2fff713ed..c6bc6f390fd2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/ConsistencyTests1.java @@ -21,7 +21,6 @@ public class ConsistencyTests1 extends ConsistencyTestsBase { - // TODO (DANOBLE) test is flaky @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) public void validateStrongConsistencyOnSyncReplication() throws Exception { if (!TestConfigurations.CONSISTENCY.equalsIgnoreCase(ConsistencyLevel.STRONG.toString())) { @@ -177,7 +176,9 @@ public void validateConsistentPrefixOnSyncReplication() throws InterruptedExcept assertThat(readLagging).isFalse(); } - // TODO (DANOBLE) Address ConsistencyTests1::validateConsistentPrefixOnAsyncReplication test failure #6378 + // TODO (DANOBLE) ConsistencyTests1::validateConsistentPrefixOnAsyncReplication test fails + // This test requires BoundedStaleness and fails due to timeouts when run in Direct TCP mode. + // This test should be enabled when we are ready to address our BoundedStaleness consistency issues. // see https://github.com/Azure/azure-sdk-for-java/issues/6378 @Ignore @Test(groups = {"direct"}, timeOut = CONSISTENCY_TEST_TIMEOUT) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java index c9b3711df1de..e875ce85cb9f 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/SessionTest.java @@ -98,7 +98,6 @@ private List getSessionTokensInRequests() { .map(r -> r.headers().value(HttpConstants.HttpHeaders.SESSION_TOKEN)).collect(Collectors.toList()); } - // TODO (DANOBLE) Test flakes inconsistently with assertion error @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "sessionTestArgProvider") public void sessionConsistency_ReadYourWrites(boolean isNameBased) { spyClient.readCollection(getCollectionLink(isNameBased), null).blockFirst(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java index 5107063be896..cfd8803e0922 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/TestSuiteBase.java @@ -783,11 +783,10 @@ public static Object[][] simpleClientBuildersWithDirect() { return simpleClientBuildersWithDirect(toArray(protocols)); } - // TODO (DANOBLE) uncomment this DataProvider - // @DataProvider - // public static Object[][] simpleClientBuildersWithDirectHttps() { - // return simpleClientBuildersWithDirect(Protocol.HTTPS); - // } + @DataProvider + public static Object[][] simpleClientBuildersWithDirectHttps() { + return simpleClientBuildersWithDirect(Protocol.HTTPS); + } private static Object[][] simpleClientBuildersWithDirect(Protocol... protocols) { logger.info("Max test consistency to use is [{}]", accountConsistency); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java index e84c24981d3e..d4a3673dc106 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/DCDocumentCrudTest.java @@ -199,7 +199,6 @@ public void upsert() throws Exception { validateNoDocumentOperationThroughGateway(); } - // TODO (DANOBLE) Times out @Test(groups = { "direct" }, timeOut = QUERY_TIMEOUT) public void crossPartitionQuery() { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java index 714b5a23e902..a805f105b138 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCacheTest.java @@ -520,7 +520,6 @@ public void tryGetAddresses_ForMasterPartition_MasterPartitionAddressAlreadyCach assertThat(clientWrapper.capturedRequests).asList().hasSize(0); } - // TODO (DANOBLE) times out inconsistently @Test(groups = { "direct" }, timeOut = TIMEOUT) public void tryGetAddresses_ForMasterPartition_ForceRefresh() throws Exception { Configs configs = new Configs(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java index 0f4742a721d4..d1c52bdcdb2f 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ReplicatedResourceClientPartitionSplitTest.java @@ -45,7 +45,6 @@ public Object[][] partitionIsSplittingArgProvider() { }; } - // TODO (DANOBLE) test times out inconsistently @Test(groups = { "unit" }, dataProvider = "partitionIsSplittingArgProvider", timeOut = TIMEOUT) public void partitionSplit_RefreshCache_Read(ConsistencyLevel consistencyLevel, int partitionIsSplitting) { URI secondary1AddressBeforeMove = URI.create("secondary"); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java index 755bcf8fe36f..e2d409200ea1 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java @@ -184,6 +184,8 @@ public void afterClass() { safeClose(client); } + // TODO (DANOBLE) AggregateQueryTests initialization intermittently fails due to collection truncation error. + // see https://github.com/Azure/azure-sdk-for-java/issues/6346 @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT * 2) public void before_AggregateQueryTests() throws Throwable { client = this.clientBuilder().buildAsyncClient(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java index 91451dcd67f2..af0d2ec024d2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureCrossPartitionTest.java @@ -114,9 +114,6 @@ public Object[][] queryProvider() { }; } - // TODO: DANOBLE: Investigate DIRECT TCP performance issue - // Links: https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028 - @Test(groups = { "long" }, dataProvider = "queryProvider", timeOut = 2 * TIMEOUT) public void query(String query, int maxItemCount, int maxExpectedBufferedCountForBackPressure, int expectedNumberOfResults) throws Exception { FeedOptions options = new FeedOptions(); @@ -186,9 +183,6 @@ public void before_BackPressureCrossPartitionTest() { warmUp(); } - // TODO: DANOBLE: Investigate DIRECT TCP performance issue - // Links: https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028 - @AfterClass(groups = { "long" }, timeOut = 2 * SHUTDOWN_TIMEOUT, alwaysRun = true) public void afterClass() { safeDeleteCollection(createdCollection); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java index 2793ad6b001b..d79896e22b36 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/BackPressureTest.java @@ -34,7 +34,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeClass method times out inconsistently public class BackPressureTest extends TestSuiteBase { private static final int TIMEOUT = 200000; @@ -195,10 +194,6 @@ private void warmUp() { createdCollection.queryItems("SELECT * from r", options).blockFirst(); } - // TODO: DANOBLE: Investigate DIRECT TCP performance issue - // NOTE: This method requires multiple SHUTDOWN_TIMEOUT intervals - // SEE: https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028https://msdata.visualstudio.com/CosmosDB/_workitems/edit/367028 - @AfterClass(groups = { "long" }, timeOut = 2 * SHUTDOWN_TIMEOUT, alwaysRun = true) public void afterClass() { safeDeleteCollection(createdCollection); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java index 225b2807f8b3..e9292d3af3ee 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/DocumentCrudTest.java @@ -64,6 +64,8 @@ public void createDocument(String documentId) throws InterruptedException { validateSuccess(createObservable, validator); } + // TODO (DANOBLE) DocumentCrudTest::createLargeDocument fails in some environments + // see https://github.com/Azure/azure-sdk-for-java/issues/6335 @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void createLargeDocument(String documentId) throws InterruptedException { CosmosItemProperties docDefinition = getDocumentDefinition(documentId); @@ -99,6 +101,8 @@ public void createDocumentWithVeryLargePartitionKey(String documentId) throws In validateSuccess(createObservable, validator); } + // TODO (DANOBLE) DocumentCrudTest::readDocumentWithVeryLargePartitionKey test fails in some environments + // see https://github.com/Azure/azure-sdk-for-java/issues/6336 @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void readDocumentWithVeryLargePartitionKey(String documentId) throws InterruptedException { CosmosItemProperties docDefinition = getDocumentDefinition(documentId); @@ -159,7 +163,6 @@ public void readDocument(String documentId) throws InterruptedException { validateSuccess(readObservable, validator); } - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void timestamp(String documentId) throws Exception { OffsetDateTime before = OffsetDateTime.now(); @@ -199,6 +202,8 @@ public void readDocument_DoesntExist(String documentId) throws InterruptedExcept validateFailure(readObservable, validator); } + // TODO (DANOBLE) DocumentCrudTest::deleteDocument test fails in some test environments + // see https://github.com/Azure/azure-sdk-for-java/issues/6337 @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "documentCrudArgProvider") public void deleteDocument(String documentId) throws InterruptedException { CosmosItemProperties docDefinition = getDocumentDefinition(documentId); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java index 624a6f2d2dfc..8f0e796dcade 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java @@ -114,7 +114,6 @@ public void createDocumentWithWarningLevel() throws Exception { * * @throws Exception */ - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithTraceLevel() throws Exception { LogManager.getRootLogger().setLevel(Level.INFO); @@ -142,7 +141,6 @@ public void createDocumentWithTraceLevel() throws Exception { } } - //FIXME test is flaky @Ignore @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithTraceLevelAtRoot() throws Exception { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java index 01e709d1a52e..f472d4f4f6b1 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java @@ -50,7 +50,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeClass times out inconsistently. public class OrderbyDocumentQueryTest extends TestSuiteBase { private final double minQueryRequestChargePerPartition = 2.0; @@ -66,7 +65,6 @@ public OrderbyDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocumentsValidateContent(boolean qmEnabled) throws Exception { CosmosItemProperties expectedDocument = createdDocuments.get(0); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java index 3e9f67f6a615..ea17d908e83a 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java @@ -40,7 +40,6 @@ import static com.azure.cosmos.CommonsBridgeInternal.partitionKeyRangeIdInternal; import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeClass times out inconsistently public class ParallelDocumentQueryTest extends TestSuiteBase { private CosmosAsyncDatabase createdDatabase; private CosmosAsyncContainer createdCollection; @@ -65,7 +64,6 @@ public Object[][] queryMetricsArgProvider() { }; } - // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocuments(boolean qmEnabled) { String query = "SELECT * from c where c.prop = 99"; @@ -255,7 +253,6 @@ public void compositeContinuationTokenRoundTrip() throws Exception { } } - // TODO: This test has been timing out on buildAsyncClient, related work item - https://msdata.visualstudio.com/CosmosDB/_workitems/edit/402438/ @Test(groups = { "non-emulator" }, timeOut = TIMEOUT * 10) public void queryDocumentsWithCompositeContinuationTokens() throws Exception { String query = "SELECT * FROM c"; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java index 0cf2dda7b121..1fd637903358 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/PermissionQueryTest.java @@ -31,7 +31,6 @@ import static org.assertj.core.api.Assertions.assertThat; // TODO: change to use external TestSuiteBase -// TODO (DANOBLE) beforeClass times out inconsistently public class PermissionQueryTest extends TestSuiteBase { public final String databaseId = DatabaseForTest.generateId(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java index 22677895bdfd..47767c7f79ca 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java @@ -97,7 +97,6 @@ public void createDocumentWithValidHttpProxy() throws Exception { * * @throws Exception */ - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithValidHttpProxyWithNettyWireLogging() throws Exception { LogManager.getRootLogger().setLevel(Level.INFO); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java index b31ac5466252..649eb54d4adb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java @@ -25,7 +25,6 @@ import java.util.UUID; import java.util.stream.Collectors; -// TODO (DANOBLE) beforeClass times out inconsistently public class ReadFeedDocumentsTest extends TestSuiteBase { private CosmosAsyncDatabase createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java index 44853a7ed4dd..82fd924e8da0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedStoredProceduresTest.java @@ -23,7 +23,6 @@ import java.util.UUID; import java.util.stream.Collectors; -// TODO (DANOBLE) beforeClass times out inconsistently public class ReadFeedStoredProceduresTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java index d866a37ea385..238db9aca601 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedTriggersTest.java @@ -24,7 +24,6 @@ import java.util.UUID; import java.util.stream.Collectors; -// TODO (DANOBLE) beforeClass times out inconsistently. public class ReadFeedTriggersTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java index 5cdc55f033c2..3cb813a04508 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedUdfsTest.java @@ -23,7 +23,6 @@ import java.util.UUID; import java.util.stream.Collectors; -// TODO (DANOBLE) beforeClass times out. public class ReadFeedUdfsTest extends TestSuiteBase { private Database createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java index 9ec6e7378455..3a85dfe7baa4 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ResourceTokenTest.java @@ -41,7 +41,7 @@ * */ -// TODO (DANOBLE) change to use external TestSuiteBase +// TODO change to use external TestSuiteBase public class ResourceTokenTest extends TestSuiteBase { public final String databaseId = DatabaseForTest.generateId(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java index f23cc548cec9..f69d963d6a5e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionDocumentQueryTest.java @@ -33,7 +33,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeclass times out inconsistently public class SinglePartitionDocumentQueryTest extends TestSuiteBase { private Database createdDatabase; @@ -51,7 +50,6 @@ public SinglePartitionDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider") public void queryDocuments(boolean queryMetricsEnabled) throws Exception { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java index 9de8b7514b7e..84ec74e84899 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureQueryTest.java @@ -26,7 +26,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeCLass times out inconsistently public class StoredProcedureQueryTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java index 7333dad6f2aa..b1e9672dd602 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/StoredProcedureUpsertReplaceTest.java @@ -67,7 +67,6 @@ public void replaceStoredProcedure() throws Exception { validateSuccess(replaceObservable, validatorForReplace); } - // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT) public void executeStoredProcedure() throws Exception { // create a stored procedure diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java index 629b648a82c2..02c2be2739bb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java @@ -838,11 +838,10 @@ public static Object[][] simpleClientBuildersWithDirect() { return simpleClientBuildersWithDirect(toArray(protocols)); } - // TODO (DANOBLE) uncomment this DataProvider - // @DataProvider - // public static Object[][] simpleClientBuildersWithDirectHttps() { - // return simpleClientBuildersWithDirect(Protocol.HTTPS); - // } + @DataProvider + public static Object[][] simpleClientBuildersWithDirectHttps() { + return simpleClientBuildersWithDirect(Protocol.HTTPS); + } private static Object[][] simpleClientBuildersWithDirect(Protocol... protocols) { logger.info("Max test consistency to use is [{}]", accountConsistency); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java index c65ee7089aaa..9dcbe2f7245b 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TokenResolverTest.java @@ -154,7 +154,6 @@ public void writeDocumentWithReadPermission(ConnectionMode connectionMode) { } } - // TODO (DANOBLE) test is flaky @Test(groups = {"simple"}, dataProvider = "connectionMode", timeOut = TIMEOUT) public void writeDocumentWithAllPermission(ConnectionMode connectionMode) { AsyncDocumentClient asyncClientWithTokenResolver = null; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java index 6f1c6a0701e0..85d2bee1e4d9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TopQueryTests.java @@ -46,7 +46,6 @@ public TopQueryTests(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - // TODO (DANOBLE) line 82 Assertion error. Error message "Expecting <0> to be greater than <0>" : FastIntegrationTests (Builds: SingeRegionSessionTcp) @Test(groups = { "simple" }, timeOut = TIMEOUT, dataProvider = "queryMetricsArgProvider", retryAnalyzer = RetryAnalyzer.class) public void queryDocumentsWithTop(boolean qmEnabled) throws Exception { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java index 78a6177899f9..50d24447b6d0 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerCrudTest.java @@ -76,7 +76,6 @@ public void readTrigger() throws Exception { validateSuccess(readObservable, validator); } - // TODO (DANOBLE) test is flaky @Test(groups = { "simple" }, timeOut = TIMEOUT) public void deleteTrigger() throws Exception { // create a trigger diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java index 9ef7a5a9fd0e..599b2a06f572 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerQueryTest.java @@ -29,7 +29,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeClass times out. public class TriggerQueryTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java index 9a6712bc5521..bd1e7fef413e 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/TriggerUpsertReplaceTest.java @@ -19,7 +19,6 @@ import java.util.UUID; -// TODO (DANOBLE) beforeClass times out inconsistently public class TriggerUpsertReplaceTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java index e2b49bbe868e..a78383e0ed44 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionQueryTest.java @@ -28,7 +28,6 @@ import static org.assertj.core.api.Assertions.assertThat; -// TODO (DANOBLE) beforeClass times out inconsistently public class UserDefinedFunctionQueryTest extends TestSuiteBase { private Database createdDatabase; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java index b94c46778f9d..2904e2ae4317 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java @@ -17,7 +17,6 @@ import java.util.UUID; -// TODO (DANOBLE) beforeClass times out inconsistently. public class UserDefinedFunctionUpsertReplaceTest extends TestSuiteBase { private CosmosAsyncContainer createdCollection; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java index db8bef25ef56..4077c27c36da 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserQueryTest.java @@ -41,7 +41,6 @@ public UserQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - // TODO (DANOBLE) test times out inconsistently @Test(groups = { "simple" }, timeOut = TIMEOUT) public void queryUsersWithFilter() throws Exception { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java index 75847c11d002..5585c40e0848 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/VeryLargeDocumentQueryTest.java @@ -40,7 +40,8 @@ public VeryLargeDocumentQueryTest(CosmosClientBuilder clientBuilder) { super(clientBuilder); } - // TODO (DANOBLE) move this test back into the emulator group after we've addressed query performance on 4.X + // TODO (DANOBLE) VeryLargeDocumentQueryTest::queryLargeDocuments intermittently times out + // Move this test back into the emulator group after we've addressed query performance on 4.X. // see https://github.com/Azure/azure-sdk-for-java/issues/6377 @Test(groups = { "simple" }, timeOut = 2 * TIMEOUT) public void queryLargeDocuments() { From 32c42bfeadeafd103c0b58bf3a65822b31e93e56 Mon Sep 17 00:00:00 2001 From: David Noble Date: Sun, 17 Nov 2019 21:38:29 +0000 Subject: [PATCH 29/32] Added TODOs and bumped SETUP_TIMEOUT for those test classes that routinely timeout during intialization on compute/memory constrained systems like CI --- .../java/com/azure/cosmos/rx/AggregateQueryTests.java | 2 +- .../java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java | 6 ++++-- .../cosmos/rx/SinglePartitionReadFeedDocumentsTest.java | 8 +++++--- .../cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java | 6 ++++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java index e2d409200ea1..9bf14d75c968 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/AggregateQueryTests.java @@ -186,7 +186,7 @@ public void afterClass() { // TODO (DANOBLE) AggregateQueryTests initialization intermittently fails due to collection truncation error. // see https://github.com/Azure/azure-sdk-for-java/issues/6346 - @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT * 2) + @BeforeClass(groups = { "simple" }, timeOut = 4 * SETUP_TIMEOUT) public void before_AggregateQueryTests() throws Throwable { client = this.clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java index 649eb54d4adb..03348cbb67af 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ReadFeedDocumentsTest.java @@ -73,7 +73,9 @@ public void readDocuments_withoutEnableCrossPartitionQuery() { validateQueryFailure(feedObservable, validator, FEED_TIMEOUT); } - @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT, alwaysRun = true) + // TODO (DANOBLE) ReadFeedDocumentsTest initialization consistently times out in CI environments. + // see https://github.com/Azure/azure-sdk-for-java/issues/6379 + @BeforeClass(groups = { "simple" }, timeOut = 4 * SETUP_TIMEOUT, alwaysRun = true) public void before_ReadFeedDocumentsTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); @@ -81,7 +83,7 @@ public void before_ReadFeedDocumentsTest() { List docDefList = new ArrayList<>(); - for(int i = 0; i < 100; i++) { + for (int i = 0; i < 100; i++) { docDefList.add(getDocumentDefinition()); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionReadFeedDocumentsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionReadFeedDocumentsTest.java index eb51c5c1df9d..3b6a982d018c 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionReadFeedDocumentsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/SinglePartitionReadFeedDocumentsTest.java @@ -51,15 +51,17 @@ public void readDocuments() { validateQuerySuccess(feedObservable, validator, FEED_TIMEOUT); } - @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + // TODO (DANOBLE) SinglePartitionReadFeedDocumentsTest initialization consistently times out in CI environments. + // see https://github.com/Azure/azure-sdk-for-java/issues/6380 + @BeforeClass(groups = { "simple" }, timeOut = 4 * SETUP_TIMEOUT) + public void before_SinglePartitionReadFeedDocumentsTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedSinglePartitionCosmosContainer(client); truncateCollection(createdCollection); List docDefList = new ArrayList<>(); - for(int i = 0; i < 5; i++) { + for (int i = 0; i < 5; i++) { docDefList.add(getDocumentDefinition()); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java index 2904e2ae4317..959340db3dfe 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/UserDefinedFunctionUpsertReplaceTest.java @@ -66,8 +66,10 @@ public void replaceUserDefinedFunction() throws Exception { validateSuccess(replaceObservable, validatorForReplace); } - @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) - public void beforeClass() { + // TODO (DANOBLE) UserDefinedFunctionUpsertReplaceTest initialization consistently times out in CI environments. + // see https://github.com/Azure/azure-sdk-for-java/issues/6383 + @BeforeClass(groups = { "simple" }, timeOut = 4 * SETUP_TIMEOUT) + public void before_UserDefinedFunctionUpsertReplaceTest() { client = clientBuilder().buildAsyncClient(); createdCollection = getSharedMultiPartitionCosmosContainer(client); truncateCollection(createdCollection); From 3172b7b36860a9314c48eca2756f441881361c95 Mon Sep 17 00:00:00 2001 From: David Noble Date: Sun, 17 Nov 2019 14:00:37 -0800 Subject: [PATCH 30/32] Enabled LogLevelTest::createDocumentWithTraceLevelAtRoot --- .../src/test/java/com/azure/cosmos/rx/LogLevelTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java index 8f0e796dcade..b54a6b8a1b22 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/LogLevelTest.java @@ -141,7 +141,6 @@ public void createDocumentWithTraceLevel() throws Exception { } } - @Ignore @Test(groups = { "simple" }, timeOut = TIMEOUT) public void createDocumentWithTraceLevelAtRoot() throws Exception { LogManager.getRootLogger().setLevel(Level.INFO); From c5bd5a1c0bd9ac7ee8c35c184ece22c52e74897d Mon Sep 17 00:00:00 2001 From: David Noble Date: Sun, 17 Nov 2019 19:11:54 -0800 Subject: [PATCH 31/32] Added TODO and bumped timeout interval for before_OrderbyDocumentQueryTest which itermittently times out in CI environments. --- .../java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java index f472d4f4f6b1..a1800993bb67 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/OrderbyDocumentQueryTest.java @@ -407,7 +407,9 @@ public void beforeMethod() throws Exception { TimeUnit.SECONDS.sleep(10); } - @BeforeClass(groups = { "simple" }, timeOut = SETUP_TIMEOUT) + // TODO (DANOBLE) OrderbyDocumentQueryTest initialization intermittently times out in CI environments + // see https://github.com/Azure/azure-sdk-for-java/issues/6386 + @BeforeClass(groups = { "simple" }, timeOut = 4 * SETUP_TIMEOUT) public void before_OrderbyDocumentQueryTest() throws Exception { client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); From b087b96fac659f7cbda9ca42433d31eb40f343e2 Mon Sep 17 00:00:00 2001 From: David Noble Date: Mon, 18 Nov 2019 14:56:05 -0800 Subject: [PATCH 32/32] Added TODO, bumped timeout interval, and revised error handling strategy for before_ParallelDocumentQueryTest which itermittently fails due to a 503 on a query operation in CI environments. --- .../cosmos/rx/ParallelDocumentQueryTest.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java index ea17d908e83a..cca7247aac63 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ParallelDocumentQueryTest.java @@ -21,12 +21,12 @@ import com.azure.cosmos.implementation.Utils.ValueHolder; import com.azure.cosmos.implementation.query.CompositeContinuationToken; import com.azure.cosmos.implementation.routing.Range; +import com.google.common.base.Strings; import io.reactivex.subscribers.TestSubscriber; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Factory; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; import reactor.core.publisher.Flux; @@ -39,6 +39,7 @@ import static com.azure.cosmos.CommonsBridgeInternal.partitionKeyRangeIdInternal; import static org.assertj.core.api.Assertions.assertThat; +import static org.testng.Assert.fail; public class ParallelDocumentQueryTest extends TestSuiteBase { private CosmosAsyncDatabase createdDatabase; @@ -264,23 +265,41 @@ public void queryDocumentsWithCompositeContinuationTokens() throws Exception { this.queryWithContinuationTokensAndPageSizes(query, new int[] {1, 10, 100}, expectedDocs); } - @BeforeClass(groups = { "simple", "non-emulator" }, timeOut = 2 * SETUP_TIMEOUT) + // TODO (DANOBLE) ParallelDocumentQueryTest initialization intermittently fails in CI environments + // see https://github.com/Azure/azure-sdk-for-java/issues/6398 + @BeforeClass(groups = { "simple", "non-emulator" }, timeOut = 4 * SETUP_TIMEOUT) public void before_ParallelDocumentQueryTest() { + client = clientBuilder().buildAsyncClient(); createdDatabase = getSharedCosmosDatabase(client); createdCollection = getSharedMultiPartitionCosmosContainer(client); - truncateCollection(createdCollection); + + try { + truncateCollection(createdCollection); + } catch (Throwable firstChanceException) { + try { + truncateCollection(createdCollection); + } catch (Throwable lastChanceException) { + String message = Strings.lenientFormat("container %s truncation failed due to first chance %s followed by last chance %s", + createdCollection, + firstChanceException, + lastChanceException); + logger.error(message); + fail(message, lastChanceException); + } + } + List docDefList = new ArrayList<>(); - for(int i = 0; i < 13; i++) { + + for (int i = 0; i < 13; i++) { docDefList.add(getDocumentDefinition(i)); } - for(int i = 0; i < 21; i++) { + for (int i = 0; i < 21; i++) { docDefList.add(getDocumentDefinition(99)); } createdDocuments = bulkInsertBlocking(createdCollection, docDefList); - waitIfNeededForReplicasToCatchUp(clientBuilder()); }