From a8b5ca3929f05823d7645d7c11cb83fea1de288b Mon Sep 17 00:00:00 2001 From: Mohammad Derakhshani Date: Tue, 26 Nov 2019 15:08:24 -0800 Subject: [PATCH 1/5] async read use v4 api e2e --- .../azure/cosmos/BridgeInternalBenchmark.java | 10 ++++++++ .../cosmos/benchmark/AsyncBenchmark.java | 23 +++++++++++------ .../cosmos/benchmark/AsyncReadBenchmark.java | 25 +++++++++++-------- 3 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java new file mode 100644 index 000000000000..b03ff49943aa --- /dev/null +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java @@ -0,0 +1,10 @@ +package com.azure.cosmos; + +import com.azure.cosmos.implementation.AsyncDocumentClient; + +public class BridgeInternalBenchmark { + + static public AsyncDocumentClient getOldClient(CosmosAsyncClient client) { + return client.getDocClientWrapper(); + } +} diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java index f5cec6f0c554..4279c9b3a4fe 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java @@ -3,8 +3,12 @@ package com.azure.cosmos.benchmark; -import com.azure.cosmos.implementation.AsyncDocumentClient; import com.azure.cosmos.BridgeInternal; +import com.azure.cosmos.BridgeInternalBenchmark; +import com.azure.cosmos.CosmosAsyncClient; +import com.azure.cosmos.CosmosClientBuilder; +import com.azure.cosmos.CosmosKeyCredential; +import com.azure.cosmos.implementation.AsyncDocumentClient; import com.azure.cosmos.implementation.Database; import com.azure.cosmos.implementation.Document; import com.azure.cosmos.implementation.DocumentCollection; @@ -47,6 +51,7 @@ abstract class AsyncBenchmark { private Meter failureMeter; final Logger logger; + final CosmosAsyncClient v4Client; final AsyncDocumentClient client; final DocumentCollection collection; final String partitionKey; @@ -56,15 +61,17 @@ abstract class AsyncBenchmark { Timer latency; AsyncBenchmark(Configuration cfg) { - client = new AsyncDocumentClient.Builder() - .withServiceEndpoint(cfg.getServiceEndpoint()) - .withMasterKeyOrResourceToken(cfg.getMasterKey()) - .withConnectionPolicy(cfg.getConnectionPolicy()) - .withConsistencyLevel(cfg.getConsistencyLevel()) - .build(); + v4Client = new CosmosClientBuilder() + .setEndpoint(cfg.getServiceEndpoint()) + .setKey(cfg.getMasterKey()) + .setConnectionPolicy(cfg.getConnectionPolicy()) + .setConsistencyLevel(cfg.getConsistencyLevel()) + .buildAsyncClient(); logger = LoggerFactory.getLogger(this.getClass()); + client = BridgeInternalBenchmark.getOldClient(v4Client); + Database database = DocDBUtils.getDatabase(client, cfg.getDatabaseId()); collection = DocDBUtils.getCollection(client, database.getSelfLink(), cfg.getCollectionId()); nameCollectionLink = String.format("dbs/%s/colls/%s", database.getId(), collection.getId()); @@ -133,7 +140,7 @@ protected void init() { } void shutdown() { - client.close(); + v4Client.close(); } protected void onSuccess() { diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java index b6987d43e201..cadf6378656c 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java @@ -3,6 +3,8 @@ package com.azure.cosmos.benchmark; +import com.azure.cosmos.CosmosAsyncContainer; +import com.azure.cosmos.CosmosAsyncItemResponse; import com.azure.cosmos.implementation.Document; import com.azure.cosmos.PartitionKey; import com.azure.cosmos.implementation.RequestOptions; @@ -11,16 +13,18 @@ import org.reactivestreams.Subscription; import reactor.core.publisher.BaseSubscriber; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -class AsyncReadBenchmark extends AsyncBenchmark> { +class AsyncReadBenchmark extends AsyncBenchmark { + private final CosmosAsyncContainer cosmosAsyncContainer; class LatencySubscriber extends BaseSubscriber { Timer.Context context; - BaseSubscriber> baseSubscriber; + BaseSubscriber baseSubscriber; - LatencySubscriber(BaseSubscriber> baseSubscriber) { + LatencySubscriber(BaseSubscriber baseSubscriber) { this.baseSubscriber = baseSubscriber; } @@ -48,24 +52,25 @@ protected void hookOnError(Throwable throwable) { AsyncReadBenchmark(Configuration cfg) { super(cfg); + cosmosAsyncContainer = v4Client.getDatabase(cfg.getDatabaseId()).getContainer(cfg.getCollectionId()).read().block().getContainer(); } @Override - protected void performWorkload(BaseSubscriber> baseSubscriber, long i) throws InterruptedException { + protected void performWorkload(BaseSubscriber baseSubscriber, long i) throws InterruptedException { int index = (int) (i % docsToRead.size()); - RequestOptions options = new RequestOptions(); - options.setPartitionKey(new PartitionKey(docsToRead.get(index).getId())); + Document doc = docsToRead.get(index); - Flux> obs = client.readDocument(getDocumentLink(docsToRead.get(index)), options); + String partitionKeyValue = doc.getId(); + Mono result = cosmosAsyncContainer.getItem(doc.getId(), partitionKeyValue).read(); concurrencyControlSemaphore.acquire(); if (configuration.getOperationType() == Configuration.Operation.ReadThroughput) { - obs.subscribeOn(Schedulers.parallel()).subscribe(baseSubscriber); + result.subscribeOn(Schedulers.parallel()).subscribe(baseSubscriber); } else { - LatencySubscriber> latencySubscriber = new LatencySubscriber<>(baseSubscriber); + LatencySubscriber latencySubscriber = new LatencySubscriber<>(baseSubscriber); latencySubscriber.context = latency.time(); - obs.subscribeOn(Schedulers.parallel()).subscribe(latencySubscriber); + result.subscribeOn(Schedulers.parallel()).subscribe(latencySubscriber); } } } From c12227a38a3ed3c43132a6dbce3de42b42d0af6a Mon Sep 17 00:00:00 2001 From: Mohammad Derakhshani Date: Fri, 6 Dec 2019 09:39:35 -0800 Subject: [PATCH 2/5] minor update --- .../main/java/com/azure/cosmos/BridgeInternalBenchmark.java | 5 ++++- .../main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java | 3 +-- .../java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java | 4 ---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java index b03ff49943aa..9a76e09d2699 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java @@ -1,10 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.cosmos; import com.azure.cosmos.implementation.AsyncDocumentClient; public class BridgeInternalBenchmark { - static public AsyncDocumentClient getOldClient(CosmosAsyncClient client) { + static public AsyncDocumentClient getInternalDocumentClient(CosmosAsyncClient client) { return client.getDocClientWrapper(); } } diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java index 4279c9b3a4fe..54cc1ddec97a 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java @@ -7,7 +7,6 @@ import com.azure.cosmos.BridgeInternalBenchmark; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosClientBuilder; -import com.azure.cosmos.CosmosKeyCredential; import com.azure.cosmos.implementation.AsyncDocumentClient; import com.azure.cosmos.implementation.Database; import com.azure.cosmos.implementation.Document; @@ -70,7 +69,7 @@ abstract class AsyncBenchmark { logger = LoggerFactory.getLogger(this.getClass()); - client = BridgeInternalBenchmark.getOldClient(v4Client); + client = BridgeInternalBenchmark.getInternalDocumentClient(v4Client); Database database = DocDBUtils.getDatabase(client, cfg.getDatabaseId()); collection = DocDBUtils.getCollection(client, database.getSelfLink(), cfg.getCollectionId()); diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java index cadf6378656c..332db003ea98 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java @@ -6,13 +6,9 @@ import com.azure.cosmos.CosmosAsyncContainer; import com.azure.cosmos.CosmosAsyncItemResponse; import com.azure.cosmos.implementation.Document; -import com.azure.cosmos.PartitionKey; -import com.azure.cosmos.implementation.RequestOptions; -import com.azure.cosmos.implementation.ResourceResponse; import com.codahale.metrics.Timer; import org.reactivestreams.Subscription; import reactor.core.publisher.BaseSubscriber; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; From 77fbd48cf4f85a474d0519fed0d8045cbc3d548c Mon Sep 17 00:00:00 2001 From: Mohammad Derakhshani Date: Fri, 6 Dec 2019 11:18:56 -0800 Subject: [PATCH 3/5] removed unnecessary BridgeInternalBenchmark.java --- .../com/azure/cosmos/BridgeInternalBenchmark.java | 13 ------------- .../com/azure/cosmos/benchmark/AsyncBenchmark.java | 3 ++- 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java deleted file mode 100644 index 9a76e09d2699..000000000000 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/BridgeInternalBenchmark.java +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.cosmos; - -import com.azure.cosmos.implementation.AsyncDocumentClient; - -public class BridgeInternalBenchmark { - - static public AsyncDocumentClient getInternalDocumentClient(CosmosAsyncClient client) { - return client.getDocClientWrapper(); - } -} diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java index 54cc1ddec97a..a98eeca90798 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java @@ -6,6 +6,7 @@ import com.azure.cosmos.BridgeInternal; import com.azure.cosmos.BridgeInternalBenchmark; import com.azure.cosmos.CosmosAsyncClient; +import com.azure.cosmos.CosmosBridgeInternal; import com.azure.cosmos.CosmosClientBuilder; import com.azure.cosmos.implementation.AsyncDocumentClient; import com.azure.cosmos.implementation.Database; @@ -69,7 +70,7 @@ abstract class AsyncBenchmark { logger = LoggerFactory.getLogger(this.getClass()); - client = BridgeInternalBenchmark.getInternalDocumentClient(v4Client); + client = CosmosBridgeInternal.getAsyncDocumentClient(v4Client); Database database = DocDBUtils.getDatabase(client, cfg.getDatabaseId()); collection = DocDBUtils.getCollection(client, database.getSelfLink(), cfg.getCollectionId()); From 18118eb91c70a92d5ba6a824c9eb42ab84137e16 Mon Sep 17 00:00:00 2001 From: Mohammad Derakhshani Date: Fri, 6 Dec 2019 11:30:24 -0800 Subject: [PATCH 4/5] added a TOOD as per code review comment --- .../main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java index 332db003ea98..b0242cad37a8 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncReadBenchmark.java @@ -48,6 +48,7 @@ protected void hookOnError(Throwable throwable) { AsyncReadBenchmark(Configuration cfg) { super(cfg); + // TODO: once all benchmarks move to v4 api, we should rely on the container which is read in the parent, and remove this. cosmosAsyncContainer = v4Client.getDatabase(cfg.getDatabaseId()).getContainer(cfg.getCollectionId()).read().block().getContainer(); } From d6dbca7732d1d05a79f5f1cc69a97bb9b2420346 Mon Sep 17 00:00:00 2001 From: Mohammad Derakhshani Date: Fri, 6 Dec 2019 11:38:42 -0800 Subject: [PATCH 5/5] remoed a leftover import --- .../src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java index a98eeca90798..88bf88cb3ced 100644 --- a/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java +++ b/sdk/cosmos/azure-cosmos-benchmark/src/main/java/com/azure/cosmos/benchmark/AsyncBenchmark.java @@ -4,7 +4,6 @@ package com.azure.cosmos.benchmark; import com.azure.cosmos.BridgeInternal; -import com.azure.cosmos.BridgeInternalBenchmark; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosBridgeInternal; import com.azure.cosmos.CosmosClientBuilder;