From a81617e45ffa405c1bc0a6160643590b65bbcc8e Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Wed, 24 Aug 2022 14:19:07 -0700 Subject: [PATCH 01/41] http client canary --- samples/HttpClientCanary/pom.xml | 25 +++ .../src/main/java/com/canary/CanaryUtils.java | 66 ++++++ .../com/canary/Http2StreamManagerCanary.java | 197 ++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 samples/HttpClientCanary/pom.xml create mode 100644 samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java create mode 100644 samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java diff --git a/samples/HttpClientCanary/pom.xml b/samples/HttpClientCanary/pom.xml new file mode 100644 index 000000000..daee1a5d2 --- /dev/null +++ b/samples/HttpClientCanary/pom.xml @@ -0,0 +1,25 @@ + + + + 4.0.0 + + com.canary + canary + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + 1.8 + + + + + software.amazon.awssdk.crt + aws-crt + 1.0.0-SNAPSHOT + + + + diff --git a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java new file mode 100644 index 000000000..bc3c3ae77 --- /dev/null +++ b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java @@ -0,0 +1,66 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +package com.canary; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.ArrayList; + +public class CanaryUtils { + private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private static final AtomicInteger numDataCollected = new AtomicInteger(0); + + public static ScheduledExecutorService createDataCollector(int warmupLoops, int loops, long timerSecs, + AtomicInteger opts, AtomicBoolean done, + ArrayList warmupResults, ArrayList results) { + ScheduledFuture task = scheduler.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + int numCollected = numDataCollected.incrementAndGet(); + if (numCollected <= warmupLoops) { + int warmupResult = opts.getAndSet(0); + System.out.println("warm up: " + warmupResult); + warmupResults.add(warmupResult); + return; + } + if (numCollected > loops + warmupLoops) { + done.set(true); + return; + } + int result = opts.getAndSet(0); + System.out.println("result: " + result); + results.add(result); + } + }, timerSecs, timerSecs, TimeUnit.SECONDS); + return scheduler; + } + + public static double calculateAverage(ArrayList list) { + return list.stream().mapToDouble(d -> d).average().orElse(0.0); + } + + public static double calculateVariance(ArrayList list) { + /* This seems wrong... */ + double sumDiffsSquared = 0.0; + double avg = calculateAverage(list); + for (int value : list) + { + double diff = value - avg; + diff *= diff; + sumDiffsSquared += diff; + } + return sumDiffsSquared / (list.size()-1); + } + + public static void printResult(ArrayList list) { + double avg = calculateAverage(list); + double various = calculateVariance(list); + System.out.println("Result collected has: " + list.size()); + System.out.println("avg of all samples: " + avg); + System.out.println("various of all samples: " + various); + } +} diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java new file mode 100644 index 000000000..fe9fc161d --- /dev/null +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -0,0 +1,197 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +package com.canary; + +import software.amazon.awssdk.crt.CRT; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.CrtRuntimeException; +import software.amazon.awssdk.crt.io.*; +import software.amazon.awssdk.crt.http.*; +import software.amazon.awssdk.crt.utils.ByteBufferUtils; +import software.amazon.awssdk.crt.Log; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.FileReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.Signature; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.ArrayList; +import java.util.Base64; +import java.util.UUID; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.canary.CanaryUtils.createDataCollector; +import static com.canary.CanaryUtils.printResult; + +/** + * A sample for testing the custom private key operations. See the Java V2 SDK + * sample for a more in-depth + * sample with additional options that can be configured via the terminal. This + * is for testing primarily. + */ +public class Http2StreamManagerCanary { + private final AtomicInteger opts = new AtomicInteger(0); + private URI uri; + + private Http2StreamManager createStreamManager(URI uri, int numConnections) { + + try (EventLoopGroup eventLoopGroup = new EventLoopGroup(1); + HostResolver resolver = new HostResolver(eventLoopGroup); + ClientBootstrap bootstrap = new ClientBootstrap(eventLoopGroup, resolver); + SocketOptions sockOpts = new SocketOptions(); + TlsContextOptions tlsOpts = TlsContextOptions.createDefaultClient().withAlpnList("h2") + .withVerifyPeer(false); + TlsContext tlsContext = new TlsContext(tlsOpts)) { + Http2StreamManagerOptions options = new Http2StreamManagerOptions(); + HttpClientConnectionManagerOptions connectionManagerOptions = new HttpClientConnectionManagerOptions(); + connectionManagerOptions.withClientBootstrap(bootstrap) + .withSocketOptions(sockOpts) + .withTlsContext(tlsContext) + .withUri(uri) + .withMaxConnections(numConnections); + options.withConnectionManagerOptions(connectionManagerOptions); + + return Http2StreamManager.create(options); + } + } + + private HttpRequestBodyStream createBodyStreamWithLength(long bodyLength) { + final long payloadSize = bodyLength; + final String payloadString = "This is CRT HTTP test."; + + HttpRequestBodyStream payloadStream = new HttpRequestBodyStream() { + + private long remainingBody = payloadSize; + + @Override + public boolean sendRequestBody(ByteBuffer outBuffer) { + + byte[] payloadBytes = null; + + try { + payloadBytes = payloadString.getBytes("ASCII"); + } catch (Exception ex) { + System.out.println("Encountered error trying to get payload bytes."); + return true; + } + + while (remainingBody > 0 && outBuffer.remaining() > 0) { + long amtToTransfer = Math.min(remainingBody, (long) outBuffer.remaining()); + amtToTransfer = Math.min(amtToTransfer, (long) payloadBytes.length); + + // Transfer the data + outBuffer.put(payloadBytes, 0, (int) amtToTransfer); + + remainingBody -= amtToTransfer; + } + + return remainingBody == 0; + } + + @Override + public boolean resetPosition() { + return true; + } + + @Override + public long getLength() { + return payloadSize; + } + }; + return payloadStream; + } + + private Http2Request createHttp2Request(String method, URI uri, long bodyLength) { + HttpHeader[] requestHeaders = new HttpHeader[] { + new HttpHeader(":method", method), + new HttpHeader(":path", uri.getPath()), + new HttpHeader(":scheme", uri.getScheme()), + new HttpHeader(":authority", uri.getHost()), + }; + HttpRequestBodyStream bodyStream = null; + if (bodyLength > 0) { + bodyStream = createBodyStreamWithLength(bodyLength); + } + Http2Request request = new Http2Request(requestHeaders, bodyStream); + + return request; + } + + private void concurrentRequests(Http2StreamManager streamManager, int concurrentNum, + AtomicInteger numStreamsFailures, AtomicInteger opts, AtomicBoolean done) throws Exception { + Http2Request request = createHttp2Request("GET", uri, 0); + while (!done.get()) { + ArrayList> requestCompleteFutures = new ArrayList<>(); + ArrayList> acquireCompleteFutures = new ArrayList<>(); + for (int i = 0; i < concurrentNum; i++) { + final CompletableFuture requestCompleteFuture = new CompletableFuture(); + requestCompleteFutures.add(requestCompleteFuture); + acquireCompleteFutures.add(streamManager.acquireStream(request, new HttpStreamBaseResponseHandler() { + @Override + public void onResponseHeaders(HttpStreamBase stream, int responseStatusCode, int blockType, + HttpHeader[] nextHeaders) { + if (responseStatusCode != 200) { + numStreamsFailures.incrementAndGet(); + } + } + + @Override + public void onResponseComplete(HttpStreamBase stream, int errorCode) { + opts.incrementAndGet(); + if (errorCode != CRT.AWS_CRT_SUCCESS) { + numStreamsFailures.incrementAndGet(); + } + stream.close(); + requestCompleteFuture.complete(null); + } + })); + } + for (CompletableFuture f : acquireCompleteFutures) { + f.get(30, TimeUnit.SECONDS); + } + // Wait for all Requests to complete + for (CompletableFuture f : requestCompleteFutures) { + f.get(30, TimeUnit.SECONDS); + } + } + } + + private void runCanary(int warmupLoops, int loops, long timerSecs) throws Exception { + ArrayList warmupResults = new ArrayList<>(); + ArrayList results = new ArrayList<>(); + AtomicInteger streamFailed = new AtomicInteger(0); + + try (Http2StreamManager streamManager = createStreamManager(uri, 100)) { + AtomicInteger opts = new AtomicInteger(0); + AtomicBoolean done = new AtomicBoolean(false); + ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); + concurrentRequests(streamManager, 1, streamFailed, opts, done); + scheduler.shutdown(); + } + System.out.println("Failed request num: " + streamFailed.get()); + System.out.println("////////////// warmup results //////////////"); + printResult(warmupResults); + System.out.println("////////////// real results //////////////"); + printResult(results); + CrtResource.logNativeResources(); + CrtResource.waitForNoResources(); + } + + public static void main(String[] args) throws Exception { + Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); + canary.uri = new URI("https://localhost:8443/echo"); + canary.runCanary(5, 5, 10); + } +} From 9dbebd5858428efef82060e13709f70492dec762 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Wed, 24 Aug 2022 22:21:32 +0000 Subject: [PATCH 02/41] add mvn exec --- samples/HttpClientCanary/pom.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/samples/HttpClientCanary/pom.xml b/samples/HttpClientCanary/pom.xml index daee1a5d2..f3d4e0c5b 100644 --- a/samples/HttpClientCanary/pom.xml +++ b/samples/HttpClientCanary/pom.xml @@ -22,4 +22,23 @@ + + + + org.codehaus.mojo + + exec-maven-plugin + 1.6.0 + + java + + -classpath + + com.canary.Http2StreamManagerCanary + + + + + + From d9ad7837a899c074dd33808cce21d58866cb3ff5 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Wed, 24 Aug 2022 15:40:22 -0700 Subject: [PATCH 03/41] use per sec --- .../src/main/java/com/canary/CanaryUtils.java | 34 +++++++++---------- .../com/canary/Http2StreamManagerCanary.java | 4 +-- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java index bc3c3ae77..5e5f2633c 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java @@ -16,22 +16,22 @@ public class CanaryUtils { public static ScheduledExecutorService createDataCollector(int warmupLoops, int loops, long timerSecs, AtomicInteger opts, AtomicBoolean done, - ArrayList warmupResults, ArrayList results) { + ArrayList warmupResults, ArrayList results) { ScheduledFuture task = scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { int numCollected = numDataCollected.incrementAndGet(); + int collectedOpts = opts.getAndSet(0); + double result = (double)collectedOpts/(double)timerSecs; if (numCollected <= warmupLoops) { - int warmupResult = opts.getAndSet(0); - System.out.println("warm up: " + warmupResult); - warmupResults.add(warmupResult); + System.out.println("warm up: " + result); + warmupResults.add(result); return; } if (numCollected > loops + warmupLoops) { done.set(true); return; } - int result = opts.getAndSet(0); System.out.println("result: " + result); results.add(result); } @@ -39,28 +39,26 @@ public void run() { return scheduler; } - public static double calculateAverage(ArrayList list) { + public static double calculateAverage(ArrayList list) { return list.stream().mapToDouble(d -> d).average().orElse(0.0); } - public static double calculateVariance(ArrayList list) { - /* This seems wrong... */ - double sumDiffsSquared = 0.0; + public static double calculateSTD(ArrayList list) { double avg = calculateAverage(list); - for (int value : list) - { - double diff = value - avg; - diff *= diff; - sumDiffsSquared += diff; + + double variance = 0; + for (int i = 0; i < list.size(); i++) { + variance += Math.pow(list.get(i) - avg, 2); } - return sumDiffsSquared / (list.size()-1); + variance /= (list.size()-1); + return Math.sqrt(variance); } - public static void printResult(ArrayList list) { + public static void printResult(ArrayList list) { double avg = calculateAverage(list); - double various = calculateVariance(list); + double std = calculateSTD(list); System.out.println("Result collected has: " + list.size()); System.out.println("avg of all samples: " + avg); - System.out.println("various of all samples: " + various); + System.out.println("Standard deviation of all samples: " + std); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index fe9fc161d..d9f33e815 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -169,8 +169,8 @@ public void onResponseComplete(HttpStreamBase stream, int errorCode) { } private void runCanary(int warmupLoops, int loops, long timerSecs) throws Exception { - ArrayList warmupResults = new ArrayList<>(); - ArrayList results = new ArrayList<>(); + ArrayList warmupResults = new ArrayList<>(); + ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); try (Http2StreamManager streamManager = createStreamManager(uri, 100)) { From facd3f637e0facf62acaa849ed7b48a7a4b68878 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Wed, 24 Aug 2022 15:46:33 -0700 Subject: [PATCH 04/41] make it more clear --- .../com/canary/Http2StreamManagerCanary.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index d9f33e815..92819decf 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -133,11 +133,9 @@ private void concurrentRequests(Http2StreamManager streamManager, int concurrent AtomicInteger numStreamsFailures, AtomicInteger opts, AtomicBoolean done) throws Exception { Http2Request request = createHttp2Request("GET", uri, 0); while (!done.get()) { - ArrayList> requestCompleteFutures = new ArrayList<>(); - ArrayList> acquireCompleteFutures = new ArrayList<>(); + final AtomicInteger requestCompleted = new AtomicInteger(0); + final CompletableFuture requestCompleteFuture = new CompletableFuture(); for (int i = 0; i < concurrentNum; i++) { - final CompletableFuture requestCompleteFuture = new CompletableFuture(); - requestCompleteFutures.add(requestCompleteFuture); acquireCompleteFutures.add(streamManager.acquireStream(request, new HttpStreamBaseResponseHandler() { @Override public void onResponseHeaders(HttpStreamBase stream, int responseStatusCode, int blockType, @@ -149,22 +147,21 @@ public void onResponseHeaders(HttpStreamBase stream, int responseStatusCode, int @Override public void onResponseComplete(HttpStreamBase stream, int errorCode) { - opts.incrementAndGet(); if (errorCode != CRT.AWS_CRT_SUCCESS) { numStreamsFailures.incrementAndGet(); } stream.close(); - requestCompleteFuture.complete(null); + + opts.incrementAndGet(); + int requestCompletedNum = requestCompleted.incrementAndGet(); + if(requestCompletedNum == concurrentNum) { + requestCompleteFuture.complete(null); + } } })); } - for (CompletableFuture f : acquireCompleteFutures) { - f.get(30, TimeUnit.SECONDS); - } // Wait for all Requests to complete - for (CompletableFuture f : requestCompleteFutures) { - f.get(30, TimeUnit.SECONDS); - } + requestCompleteFuture.get(30, TimeUnit.SECONDS); } } @@ -177,7 +174,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(streamManager, 1, streamFailed, opts, done); + concurrentRequests(streamManager, 100, streamFailed, opts, done); scheduler.shutdown(); } System.out.println("Failed request num: " + streamFailed.get()); From 3806aa68ecaf48a848e68b844ec4f13a3795e635 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Wed, 24 Aug 2022 15:50:51 -0700 Subject: [PATCH 05/41] fix build --- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 92819decf..f2ab83525 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -136,7 +136,7 @@ private void concurrentRequests(Http2StreamManager streamManager, int concurrent final AtomicInteger requestCompleted = new AtomicInteger(0); final CompletableFuture requestCompleteFuture = new CompletableFuture(); for (int i = 0; i < concurrentNum; i++) { - acquireCompleteFutures.add(streamManager.acquireStream(request, new HttpStreamBaseResponseHandler() { + streamManager.acquireStream(request, new HttpStreamBaseResponseHandler() { @Override public void onResponseHeaders(HttpStreamBase stream, int responseStatusCode, int blockType, HttpHeader[] nextHeaders) { @@ -158,7 +158,7 @@ public void onResponseComplete(HttpStreamBase stream, int errorCode) { requestCompleteFuture.complete(null); } } - })); + }); } // Wait for all Requests to complete requestCompleteFuture.get(30, TimeUnit.SECONDS); From 6d6c628904c7250d6fe7179198996b6cecb8cfea Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 14:55:15 -0700 Subject: [PATCH 06/41] add netty client --- samples/HttpClientCanary/pom.xml | 6 + .../src/main/java/com/canary/CanaryUtils.java | 2 +- .../main/java/com/canary/EmptyPublisher.java | 45 ++++++ .../java/com/canary/SDKNettyClientCanary.java | 146 ++++++++++++++++++ 4 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 samples/HttpClientCanary/src/main/java/com/canary/EmptyPublisher.java create mode 100644 samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java diff --git a/samples/HttpClientCanary/pom.xml b/samples/HttpClientCanary/pom.xml index f3d4e0c5b..59ed4fbe7 100644 --- a/samples/HttpClientCanary/pom.xml +++ b/samples/HttpClientCanary/pom.xml @@ -20,6 +20,12 @@ aws-crt 1.0.0-SNAPSHOT + + software.amazon.awssdk + netty-nio-client + 2.17.261 + compile + diff --git a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java index 5e5f2633c..b118c9246 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java @@ -11,7 +11,7 @@ import java.util.ArrayList; public class CanaryUtils { - private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10); private static final AtomicInteger numDataCollected = new AtomicInteger(0); public static ScheduledExecutorService createDataCollector(int warmupLoops, int loops, long timerSecs, diff --git a/samples/HttpClientCanary/src/main/java/com/canary/EmptyPublisher.java b/samples/HttpClientCanary/src/main/java/com/canary/EmptyPublisher.java new file mode 100644 index 000000000..ba7d6f7b5 --- /dev/null +++ b/samples/HttpClientCanary/src/main/java/com/canary/EmptyPublisher.java @@ -0,0 +1,45 @@ +package com.canary; + +import java.nio.ByteBuffer; +import java.util.Optional; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import software.amazon.awssdk.http.async.SdkHttpContentPublisher; + +public class EmptyPublisher implements SdkHttpContentPublisher { + @Override + public void subscribe(Subscriber subscriber) { + subscriber.onSubscribe(new EmptySubscription(subscriber)); + } + + @Override + public Optional contentLength() { + return Optional.of(0L); + } + + private static class EmptySubscription implements Subscription { + private final Subscriber subscriber; + private volatile boolean done; + + EmptySubscription(Subscriber subscriber) { + this.subscriber = subscriber; + } + + @Override + public void request(long l) { + if (!done) { + done = true; + if (l <= 0) { + this.subscriber.onError(new IllegalArgumentException("Demand must be positive")); + } else { + this.subscriber.onComplete(); + } + } + } + + @Override + public void cancel() { + done = true; + } + } +} diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java new file mode 100644 index 000000000..a9d71dfc7 --- /dev/null +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -0,0 +1,146 @@ +package com.canary; + +import static software.amazon.awssdk.http.SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES; +import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; + +import org.reactivestreams.Publisher; +import software.amazon.awssdk.http.*; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.utils.AttributeMap; + +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.canary.CanaryUtils.createDataCollector; +import static com.canary.CanaryUtils.printResult; + +public class SDKNettyClientCanary { + private final AtomicInteger opts = new AtomicInteger(0); + private URI uri; + + public static AttributeMap.Builder trustAllTlsAttributeMapBuilder() { + return AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, true); + } + + private static class TestResponseHandler implements SdkAsyncHttpResponseHandler { + @Override + public void onHeaders(SdkHttpResponse headers) { + } + + @Override + public void onStream(Publisher stream) { + } + + @Override + public void onError(Throwable error) { + } + } + + private AsyncExecuteRequest createExecuteRequest(AtomicInteger numStreamsFailures) { + SdkHttpRequest request = createRequest(uri); + + SdkAsyncHttpResponseHandler handler = new TestResponseHandler() { + @Override + public void onHeaders(SdkHttpResponse headers) { + opts.incrementAndGet(); + if (!headers.isSuccessful()) { + numStreamsFailures.incrementAndGet(); + } + } + + @Override + public void onError(Throwable error) { + numStreamsFailures.incrementAndGet(); + } + }; + return AsyncExecuteRequest.builder() + .request(request) + .requestContentPublisher(new EmptyPublisher()) + .responseHandler(handler) + .build(); + } + + private SdkHttpFullRequest createRequest(URI uri) { + return SdkHttpFullRequest.builder() + .uri(uri) + .method(SdkHttpMethod.GET) + .encodedPath("/echo") + .putHeader("host", uri.getHost()) + .putHeader("content-length", "0") + .build(); + } + + private void concurrentRequests(SdkAsyncHttpClient sdkHttpClient, int concurrentNum, + AtomicInteger numStreamsFailures, AtomicInteger opts, AtomicBoolean done) throws Exception { + + while (!done.get()) { + + SdkHttpFullRequest request = SdkHttpFullRequest.builder() + .uri(uri) + .method(SdkHttpMethod.GET) + .build(); + final AtomicInteger requestCompleted = new AtomicInteger(0); + final CompletableFuture requestCompleteFuture = new CompletableFuture(); + + for (int i = 0; i < concurrentNum; i++) { + try { + CompletableFuture httpClientFuture = sdkHttpClient + .execute(createExecuteRequest(numStreamsFailures)) + .whenComplete((r, t) -> { + if (t != null) { + numStreamsFailures.incrementAndGet(); + } + opts.incrementAndGet(); + int requestCompletedNum = requestCompleted.incrementAndGet(); + if (requestCompletedNum == concurrentNum) { + requestCompleteFuture.complete(null); + } + }); + } catch (Exception e) { + System.out.println(e); + } + } + // Wait for all Requests to complete + requestCompleteFuture.get(130, TimeUnit.SECONDS); + } + } + + private void runCanary(int warmupLoops, int loops, long timerSecs) throws Exception { + ArrayList warmupResults = new ArrayList<>(); + ArrayList results = new ArrayList<>(); + AtomicInteger streamFailed = new AtomicInteger(0); + + SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder() + .buildWithDefaults(trustAllTlsAttributeMapBuilder() + .put(PROTOCOL, Protocol.HTTP2) + .build()); + + AtomicInteger opts = new AtomicInteger(0); + AtomicBoolean done = new AtomicBoolean(false); + ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, + warmupResults, results); + concurrentRequests(sdkHttpClient, 50, streamFailed, opts, done); + scheduler.shutdown(); + + System.out.println("Failed request num: " + streamFailed.get()); + System.out.println("////////////// warmup results //////////////"); + printResult(warmupResults); + System.out.println("////////////// real results //////////////"); + printResult(results); + } + + public static void main(String[] args) throws Exception { + SDKNettyClientCanary canary = new SDKNettyClientCanary(); + canary.uri = new URI("https://localhost:8443/echo"); + canary.runCanary(5, 5, 10); + } +} From fe083a815681f87ea8f294198487598017b64b07 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 22:36:11 +0000 Subject: [PATCH 07/41] let's try to run it from CI for now --- .builder/actions/localhost_canary.py | 16 ++++++ .github/workflows/ci.yml | 55 +++++++++++++++++++ samples/HttpClientCanary/pom.xml | 32 ++++++++--- .../java/com/canary/SDKNettyClientCanary.java | 3 +- 4 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 .builder/actions/localhost_canary.py diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py new file mode 100644 index 000000000..964fc1dd5 --- /dev/null +++ b/.builder/actions/localhost_canary.py @@ -0,0 +1,16 @@ +import Builder +import sys +import os + + +class LocalhostCanary(Builder.Action): + + def run(self, env): + env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') + actions = [ + "cd /samples/HttpClientCanary", + "mvn install", + "mvn exec:exec@netty exec:exec@crt" + ] + + return Builder.Script(actions, name='aws-crt-java-test') diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cfd5708f8..48c8cee18 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -238,3 +238,58 @@ jobs: Start-Process -NoNewWindow python .\non_tls_server.py python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} downstream + + localhost-canary-linux: + runs-on: ubuntu-20.04 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python3 -m pip install h2 + cd crt/aws-c-http/tests/py_localhost/ + python3 server.py & + python3 non_tls_server.py & + - name: Build and test + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz localhost-canary -p ${{ env.PACKAGE_NAME }} --spec=downstream + + localhost-canary-mac: + runs-on: macos-11 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python3 -m pip install h2 + cd crt/aws-c-http/tests/py_localhost/ + python3 server.py & + python3 non_tls_server.py & + - name: Build and test + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + chmod a+x builder + ./builder localhost-canary -p ${{ env.PACKAGE_NAME }} --spec=downstream + + localhost-canary-win: + runs-on: windows-2022 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python -m pip install h2 + - name: Build and test + run: | + cd crt/aws-c-http/tests/py_localhost/ + Start-Process -NoNewWindow python .\server.py + Start-Process -NoNewWindow python .\non_tls_server.py + python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz localhost-canary -p ${{ env.PACKAGE_NAME }} downstream diff --git a/samples/HttpClientCanary/pom.xml b/samples/HttpClientCanary/pom.xml index 59ed4fbe7..74b3aa7d3 100644 --- a/samples/HttpClientCanary/pom.xml +++ b/samples/HttpClientCanary/pom.xml @@ -35,14 +35,30 @@ exec-maven-plugin 1.6.0 - - java - - -classpath - - com.canary.Http2StreamManagerCanary - - + + + netty + + java + + -classpath + + com.canary.SDKNettyClientCanary + + + + + crt + + java + + -classpath + + com.canary.Http2StreamManagerCanary + + + + diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index a9d71dfc7..50c29afd1 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -74,7 +74,6 @@ private SdkHttpFullRequest createRequest(URI uri) { .uri(uri) .method(SdkHttpMethod.GET) .encodedPath("/echo") - .putHeader("host", uri.getHost()) .putHeader("content-length", "0") .build(); } @@ -128,7 +127,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(sdkHttpClient, 50, streamFailed, opts, done); + concurrentRequests(sdkHttpClient, 100, streamFailed, opts, done); scheduler.shutdown(); System.out.println("Failed request num: " + streamFailed.get()); From 7f8eecba00a2561b53b388df563a6a77b999dca3 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 22:52:14 +0000 Subject: [PATCH 08/41] oh my --- .builder/actions/localhost_canary.py | 2 +- .github/workflows/ci.yml | 412 +++++++++++++-------------- 2 files changed, 207 insertions(+), 207 deletions(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index 964fc1dd5..b0bc08be5 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -8,7 +8,7 @@ class LocalhostCanary(Builder.Action): def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ - "cd /samples/HttpClientCanary", + "cd ./samples/HttpClientCanary", "mvn install", "mvn exec:exec@netty exec:exec@crt" ] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48c8cee18..647248fca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,225 +19,225 @@ env: AWS_REGION: us-east-1 jobs: - linux-compat: - runs-on: ubuntu-20.04 # latest - strategy: - matrix: - image: - - manylinux2014-x64 - - al2-x64 - - fedora-34-x64 - - opensuse-leap - - rhel8-x64 - #- manylinux2014-x86 until we find 32-bit linux binaries we can use - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} - run: | - aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh - ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }} - - uses: actions/upload-artifact@v2 - if: failure() - with: - name: logs - path: | - hs_err_pid* - target/surefire-reports/*stream + # linux-compat: + # runs-on: ubuntu-20.04 # latest + # strategy: + # matrix: + # image: + # - manylinux2014-x64 + # - al2-x64 + # - fedora-34-x64 + # - opensuse-leap + # - rhel8-x64 + # #- manylinux2014-x86 until we find 32-bit linux binaries we can use + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + # run: | + # aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh + # ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }} + # - uses: actions/upload-artifact@v2 + # if: failure() + # with: + # name: logs + # path: | + # hs_err_pid* + # target/surefire-reports/*stream - linux-compiler-compat: - runs-on: ubuntu-20.04 # latest - strategy: - matrix: - compiler: - - clang-3 - - clang-6 - - clang-8 - - clang-9 - - clang-10 - - clang-11 - - gcc-4.8 - - gcc-5 - - gcc-6 - - gcc-7 - - gcc-8 - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} - run: | - aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh - ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} - - uses: actions/upload-artifact@v2 - if: failure() - with: - name: logs - path: | - hs_err_pid* - target/surefire-reports/*stream + # linux-compiler-compat: + # runs-on: ubuntu-20.04 # latest + # strategy: + # matrix: + # compiler: + # - clang-3 + # - clang-6 + # - clang-8 + # - clang-9 + # - clang-10 + # - clang-11 + # - gcc-4.8 + # - gcc-5 + # - gcc-6 + # - gcc-7 + # - gcc-8 + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + # run: | + # aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh + # ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} + # - uses: actions/upload-artifact@v2 + # if: failure() + # with: + # name: logs + # path: | + # hs_err_pid* + # target/surefire-reports/*stream - linux-arm: - name: ARM (${{ matrix.arch }}) - runs-on: ubuntu-20.04 # latest - strategy: - matrix: - arch: [armv6, armv7, arm64] - steps: - - name: Build ${{ env.PACKAGE_NAME }} - run: | - python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - chmod a+x builder - ./builder build -p ${{ env.PACKAGE_NAME }} --target=linux-${{ matrix.arch }} --spec=downstream + # linux-arm: + # name: ARM (${{ matrix.arch }}) + # runs-on: ubuntu-20.04 # latest + # strategy: + # matrix: + # arch: [armv6, armv7, arm64] + # steps: + # - name: Build ${{ env.PACKAGE_NAME }} + # run: | + # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + # chmod a+x builder + # ./builder build -p ${{ env.PACKAGE_NAME }} --target=linux-${{ matrix.arch }} --spec=downstream - windows: - runs-on: windows-2022 # latest - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} + consumers - run: | - python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - python builder.pyz build -p ${{ env.PACKAGE_NAME }} --spec=downstream + # windows: + # runs-on: windows-2022 # latest + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + consumers + # run: | + # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + # python builder.pyz build -p ${{ env.PACKAGE_NAME }} --spec=downstream - windows-vc14: - runs-on: windows-2019 # windows-2019 is last env with Visual Studio 2015 (v14.0) - strategy: - matrix: - arch: [x86, x64] - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} + consumers - env: - AWS_CMAKE_TOOLSET: v140 - run: | - python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream + # windows-vc14: + # runs-on: windows-2019 # windows-2019 is last env with Visual Studio 2015 (v14.0) + # strategy: + # matrix: + # arch: [x86, x64] + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + consumers + # env: + # AWS_CMAKE_TOOLSET: v140 + # run: | + # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + # python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream - osx: - runs-on: macos-11 # latest - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} + consumers - run: | - python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - chmod a+x builder - ./builder build -p ${{ env.PACKAGE_NAME }} --spec=downstream + # osx: + # runs-on: macos-11 # latest + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + consumers + # run: | + # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + # chmod a+x builder + # ./builder build -p ${{ env.PACKAGE_NAME }} --spec=downstream - osx-arm64: - runs-on: macos-11 # latest - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} + consumers - run: | - mvn -B compile -P mac-arm64 + # osx-arm64: + # runs-on: macos-11 # latest + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + consumers + # run: | + # mvn -B compile -P mac-arm64 - android: - name: Android - # ubuntu-20.04 comes with Android tooling, see: https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md#android - runs-on: ubuntu-20.04 # latest - steps: - - name: Checkout Sources - uses: actions/checkout@v2 - with: - submodules: true - - name: Build ${{ env.PACKAGE_NAME }} - run: | - ./gradlew :android:crt:build + # android: + # name: Android + # # ubuntu-20.04 comes with Android tooling, see: https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md#android + # runs-on: ubuntu-20.04 # latest + # steps: + # - name: Checkout Sources + # uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Build ${{ env.PACKAGE_NAME }} + # run: | + # ./gradlew :android:crt:build - # check that docs can still build - check-docs: - runs-on: ubuntu-20.04 # latest - steps: - - uses: actions/checkout@v2 - with: - submodules: true - - name: Check docs - run: | - ./make-docs.sh + # # check that docs can still build + # check-docs: + # runs-on: ubuntu-20.04 # latest + # steps: + # - uses: actions/checkout@v2 + # with: + # submodules: true + # - name: Check docs + # run: | + # ./make-docs.sh - check-submodules: - runs-on: ubuntu-20.04 # latest - steps: - - name: Checkout Source - uses: actions/checkout@v2 - with: - submodules: true - fetch-depth: 0 - - name: Check Submodules - # note: using "@main" because "@${{env.BUILDER_VERSION}}" doesn't work - # https://github.com/actions/runner/issues/480 - uses: awslabs/aws-crt-builder/.github/actions/check-submodules@main + # check-submodules: + # runs-on: ubuntu-20.04 # latest + # steps: + # - name: Checkout Source + # uses: actions/checkout@v2 + # with: + # submodules: true + # fetch-depth: 0 + # - name: Check Submodules + # # note: using "@main" because "@${{env.BUILDER_VERSION}}" doesn't work + # # https://github.com/actions/runner/issues/480 + # uses: awslabs/aws-crt-builder/.github/actions/check-submodules@main - localhost-test-linux: - runs-on: ubuntu-20.04 # latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: true - - name: Configure local host - run: | - python3 -m pip install h2 - cd crt/aws-c-http/tests/py_localhost/ - python3 server.py & - python3 non_tls_server.py & - - name: Build and test - run: | - python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream + # localhost-test-linux: + # runs-on: ubuntu-20.04 # latest + # steps: + # - name: Checkout + # uses: actions/checkout@v3 + # with: + # submodules: true + # - name: Configure local host + # run: | + # python3 -m pip install h2 + # cd crt/aws-c-http/tests/py_localhost/ + # python3 server.py & + # python3 non_tls_server.py & + # - name: Build and test + # run: | + # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + # python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream - localhost-test-mac: - runs-on: macos-11 # latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: true - - name: Configure local host - run: | - python3 -m pip install h2 - cd crt/aws-c-http/tests/py_localhost/ - python3 server.py & - python3 non_tls_server.py & - - name: Build and test - run: | - python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - chmod a+x builder - ./builder localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream + # localhost-test-mac: + # runs-on: macos-11 # latest + # steps: + # - name: Checkout + # uses: actions/checkout@v3 + # with: + # submodules: true + # - name: Configure local host + # run: | + # python3 -m pip install h2 + # cd crt/aws-c-http/tests/py_localhost/ + # python3 server.py & + # python3 non_tls_server.py & + # - name: Build and test + # run: | + # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + # chmod a+x builder + # ./builder localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream - localhost-test-win: - runs-on: windows-2022 # latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: true - - name: Configure local host - run: | - python -m pip install h2 - - name: Build and test - run: | - cd crt/aws-c-http/tests/py_localhost/ - Start-Process -NoNewWindow python .\server.py - Start-Process -NoNewWindow python .\non_tls_server.py - python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} downstream + # localhost-test-win: + # runs-on: windows-2022 # latest + # steps: + # - name: Checkout + # uses: actions/checkout@v3 + # with: + # submodules: true + # - name: Configure local host + # run: | + # python -m pip install h2 + # - name: Build and test + # run: | + # cd crt/aws-c-http/tests/py_localhost/ + # Start-Process -NoNewWindow python .\server.py + # Start-Process -NoNewWindow python .\non_tls_server.py + # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + # python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} downstream localhost-canary-linux: runs-on: ubuntu-20.04 # latest From f51b463d903957b3bffc4afb025f4e447c78786b Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:04:43 +0000 Subject: [PATCH 09/41] install first? --- .builder/actions/localhost_canary.py | 1 + .../src/main/java/com/canary/Http2StreamManagerCanary.java | 5 ++++- .../src/main/java/com/canary/SDKNettyClientCanary.java | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index b0bc08be5..547e403be 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -8,6 +8,7 @@ class LocalhostCanary(Builder.Action): def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ + "mvn install -DskipTests", "cd ./samples/HttpClientCanary", "mvn install", "mvn exec:exec@netty exec:exec@crt" diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index f2ab83525..2fc0bdc14 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -44,6 +44,7 @@ public class Http2StreamManagerCanary { private final AtomicInteger opts = new AtomicInteger(0); private URI uri; + private int benchNum; private Http2StreamManager createStreamManager(URI uri, int numConnections) { @@ -174,7 +175,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(streamManager, 100, streamFailed, opts, done); + concurrentRequests(streamManager, benchNum, streamFailed, opts, done); scheduler.shutdown(); } System.out.println("Failed request num: " + streamFailed.get()); @@ -187,8 +188,10 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except } public static void main(String[] args) throws Exception { + /* TODO: make all those number configurable */ Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); canary.uri = new URI("https://localhost:8443/echo"); + canary.benchNum = 100; canary.runCanary(5, 5, 10); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 50c29afd1..9b939554c 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -26,6 +26,7 @@ public class SDKNettyClientCanary { private final AtomicInteger opts = new AtomicInteger(0); private URI uri; + private int benchNum; public static AttributeMap.Builder trustAllTlsAttributeMapBuilder() { return AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, true); @@ -127,7 +128,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(sdkHttpClient, 100, streamFailed, opts, done); + concurrentRequests(sdkHttpClient, benchNum, streamFailed, opts, done); scheduler.shutdown(); System.out.println("Failed request num: " + streamFailed.get()); @@ -139,7 +140,9 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); + /* TODO: make all those number configurable */ canary.uri = new URI("https://localhost:8443/echo"); + canary.benchNum = 100; canary.runCanary(5, 5, 10); } } From 892c64b98181a8ca99d561ed5b8ab02c6dcc58e2 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:12:58 +0000 Subject: [PATCH 10/41] do we change dir succeed? --- .builder/actions/localhost_canary.py | 5 +++-- aws-sdk-java-v2 | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) create mode 160000 aws-sdk-java-v2 diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index 547e403be..9ca703aa2 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -10,8 +10,9 @@ def run(self, env): actions = [ "mvn install -DskipTests", "cd ./samples/HttpClientCanary", - "mvn install", - "mvn exec:exec@netty exec:exec@crt" + "ls" + # "mvn install", + # "mvn exec:exec@netty exec:exec@crt" ] return Builder.Script(actions, name='aws-crt-java-test') diff --git a/aws-sdk-java-v2 b/aws-sdk-java-v2 new file mode 160000 index 000000000..b3b08fd54 --- /dev/null +++ b/aws-sdk-java-v2 @@ -0,0 +1 @@ +Subproject commit b3b08fd545ebe96956a34fab80a1e24db2d28305 From ed7d1d748f8a96e7856a9f556d13d5ca8e69b741 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:14:44 +0000 Subject: [PATCH 11/41] Revert "do we change dir succeed?" This reverts commit 892c64b98181a8ca99d561ed5b8ab02c6dcc58e2. --- .builder/actions/localhost_canary.py | 5 ++--- aws-sdk-java-v2 | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 160000 aws-sdk-java-v2 diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index 9ca703aa2..547e403be 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -10,9 +10,8 @@ def run(self, env): actions = [ "mvn install -DskipTests", "cd ./samples/HttpClientCanary", - "ls" - # "mvn install", - # "mvn exec:exec@netty exec:exec@crt" + "mvn install", + "mvn exec:exec@netty exec:exec@crt" ] return Builder.Script(actions, name='aws-crt-java-test') diff --git a/aws-sdk-java-v2 b/aws-sdk-java-v2 deleted file mode 160000 index b3b08fd54..000000000 --- a/aws-sdk-java-v2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b3b08fd545ebe96956a34fab80a1e24db2d28305 From c30a8f8f25d1c5b0aaa1756a3e49267037283dce Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:15:13 +0000 Subject: [PATCH 12/41] check it out --- .builder/actions/localhost_canary.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index 547e403be..d1f23eaa8 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -8,10 +8,11 @@ class LocalhostCanary(Builder.Action): def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ - "mvn install -DskipTests", + # "mvn install -DskipTests", "cd ./samples/HttpClientCanary", - "mvn install", - "mvn exec:exec@netty exec:exec@crt" + "ls" + # "mvn install", + # "mvn exec:exec@netty exec:exec@crt" ] return Builder.Script(actions, name='aws-crt-java-test') From 1a1be3f9ddd6ff2fd5b3183b165c9c1b66f1c9ea Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:18:58 +0000 Subject: [PATCH 13/41] what about this? --- .builder/actions/localhost_canary.py | 2 +- aws-sdk-java-v2 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 aws-sdk-java-v2 diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index d1f23eaa8..cfaf5fa91 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -9,7 +9,7 @@ def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ # "mvn install -DskipTests", - "cd ./samples/HttpClientCanary", + "cd ./samples/HttpClientCanary && ls", "ls" # "mvn install", # "mvn exec:exec@netty exec:exec@crt" diff --git a/aws-sdk-java-v2 b/aws-sdk-java-v2 new file mode 160000 index 000000000..b3b08fd54 --- /dev/null +++ b/aws-sdk-java-v2 @@ -0,0 +1 @@ +Subproject commit b3b08fd545ebe96956a34fab80a1e24db2d28305 From b74df4edb81538ed1071f1787fc51779e8ce7ebb Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:19:15 +0000 Subject: [PATCH 14/41] Revert "what about this?" This reverts commit 1a1be3f9ddd6ff2fd5b3183b165c9c1b66f1c9ea. --- .builder/actions/localhost_canary.py | 2 +- aws-sdk-java-v2 | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 aws-sdk-java-v2 diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index cfaf5fa91..d1f23eaa8 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -9,7 +9,7 @@ def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ # "mvn install -DskipTests", - "cd ./samples/HttpClientCanary && ls", + "cd ./samples/HttpClientCanary", "ls" # "mvn install", # "mvn exec:exec@netty exec:exec@crt" diff --git a/aws-sdk-java-v2 b/aws-sdk-java-v2 deleted file mode 160000 index b3b08fd54..000000000 --- a/aws-sdk-java-v2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b3b08fd545ebe96956a34fab80a1e24db2d28305 From 4115ede6966b1e08387986df9c33e3b92c35de18 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:20:07 +0000 Subject: [PATCH 15/41] again --- .builder/actions/localhost_canary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index d1f23eaa8..cfaf5fa91 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -9,7 +9,7 @@ def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ # "mvn install -DskipTests", - "cd ./samples/HttpClientCanary", + "cd ./samples/HttpClientCanary && ls", "ls" # "mvn install", # "mvn exec:exec@netty exec:exec@crt" From 075fd22e969227085f7c7851825177eac04953a6 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:23:25 +0000 Subject: [PATCH 16/41] nice --- .builder/actions/localhost_canary.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index cfaf5fa91..308abebeb 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -9,10 +9,8 @@ def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ # "mvn install -DskipTests", - "cd ./samples/HttpClientCanary && ls", - "ls" - # "mvn install", - # "mvn exec:exec@netty exec:exec@crt" + "cd ./samples/HttpClientCanary && mvn install", + "cd ./samples/HttpClientCanary && mvn exec:exec@netty exec:exec@crt" ] return Builder.Script(actions, name='aws-crt-java-test') From 8205abae924f8d1c8b734e041cb8db1d11736d5d Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:26:13 +0000 Subject: [PATCH 17/41] now it should work --- .builder/actions/localhost_canary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index 308abebeb..d135c7a43 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -8,7 +8,7 @@ class LocalhostCanary(Builder.Action): def run(self, env): env.shell.setenv('AWS_CRT_MEMORY_TRACING', '2') actions = [ - # "mvn install -DskipTests", + "mvn install -DskipTests", "cd ./samples/HttpClientCanary && mvn install", "cd ./samples/HttpClientCanary && mvn exec:exec@netty exec:exec@crt" ] From 949c7e0c90c65e93a0c1517d6011501b8f7492b0 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 23:58:07 +0000 Subject: [PATCH 18/41] revert the ignore of the other tests --- .github/workflows/ci.yml | 412 +++++++++++++++++++-------------------- 1 file changed, 206 insertions(+), 206 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 647248fca..48c8cee18 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,225 +19,225 @@ env: AWS_REGION: us-east-1 jobs: - # linux-compat: - # runs-on: ubuntu-20.04 # latest - # strategy: - # matrix: - # image: - # - manylinux2014-x64 - # - al2-x64 - # - fedora-34-x64 - # - opensuse-leap - # - rhel8-x64 - # #- manylinux2014-x86 until we find 32-bit linux binaries we can use - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} - # run: | - # aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh - # ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }} - # - uses: actions/upload-artifact@v2 - # if: failure() - # with: - # name: logs - # path: | - # hs_err_pid* - # target/surefire-reports/*stream + linux-compat: + runs-on: ubuntu-20.04 # latest + strategy: + matrix: + image: + - manylinux2014-x64 + - al2-x64 + - fedora-34-x64 + - opensuse-leap + - rhel8-x64 + #- manylinux2014-x86 until we find 32-bit linux binaries we can use + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + run: | + aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh + ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }} + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: logs + path: | + hs_err_pid* + target/surefire-reports/*stream - # linux-compiler-compat: - # runs-on: ubuntu-20.04 # latest - # strategy: - # matrix: - # compiler: - # - clang-3 - # - clang-6 - # - clang-8 - # - clang-9 - # - clang-10 - # - clang-11 - # - gcc-4.8 - # - gcc-5 - # - gcc-6 - # - gcc-7 - # - gcc-8 - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} - # run: | - # aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh - # ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} - # - uses: actions/upload-artifact@v2 - # if: failure() - # with: - # name: logs - # path: | - # hs_err_pid* - # target/surefire-reports/*stream + linux-compiler-compat: + runs-on: ubuntu-20.04 # latest + strategy: + matrix: + compiler: + - clang-3 + - clang-6 + - clang-8 + - clang-9 + - clang-10 + - clang-11 + - gcc-4.8 + - gcc-5 + - gcc-6 + - gcc-7 + - gcc-8 + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + run: | + aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh + ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: logs + path: | + hs_err_pid* + target/surefire-reports/*stream - # linux-arm: - # name: ARM (${{ matrix.arch }}) - # runs-on: ubuntu-20.04 # latest - # strategy: - # matrix: - # arch: [armv6, armv7, arm64] - # steps: - # - name: Build ${{ env.PACKAGE_NAME }} - # run: | - # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - # chmod a+x builder - # ./builder build -p ${{ env.PACKAGE_NAME }} --target=linux-${{ matrix.arch }} --spec=downstream + linux-arm: + name: ARM (${{ matrix.arch }}) + runs-on: ubuntu-20.04 # latest + strategy: + matrix: + arch: [armv6, armv7, arm64] + steps: + - name: Build ${{ env.PACKAGE_NAME }} + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + chmod a+x builder + ./builder build -p ${{ env.PACKAGE_NAME }} --target=linux-${{ matrix.arch }} --spec=downstream - # windows: - # runs-on: windows-2022 # latest - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} + consumers - # run: | - # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - # python builder.pyz build -p ${{ env.PACKAGE_NAME }} --spec=downstream + windows: + runs-on: windows-2022 # latest + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + consumers + run: | + python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz build -p ${{ env.PACKAGE_NAME }} --spec=downstream - # windows-vc14: - # runs-on: windows-2019 # windows-2019 is last env with Visual Studio 2015 (v14.0) - # strategy: - # matrix: - # arch: [x86, x64] - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} + consumers - # env: - # AWS_CMAKE_TOOLSET: v140 - # run: | - # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - # python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream + windows-vc14: + runs-on: windows-2019 # windows-2019 is last env with Visual Studio 2015 (v14.0) + strategy: + matrix: + arch: [x86, x64] + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + consumers + env: + AWS_CMAKE_TOOLSET: v140 + run: | + python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream - # osx: - # runs-on: macos-11 # latest - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} + consumers - # run: | - # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - # chmod a+x builder - # ./builder build -p ${{ env.PACKAGE_NAME }} --spec=downstream + osx: + runs-on: macos-11 # latest + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + consumers + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + chmod a+x builder + ./builder build -p ${{ env.PACKAGE_NAME }} --spec=downstream - # osx-arm64: - # runs-on: macos-11 # latest - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} + consumers - # run: | - # mvn -B compile -P mac-arm64 + osx-arm64: + runs-on: macos-11 # latest + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + consumers + run: | + mvn -B compile -P mac-arm64 - # android: - # name: Android - # # ubuntu-20.04 comes with Android tooling, see: https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md#android - # runs-on: ubuntu-20.04 # latest - # steps: - # - name: Checkout Sources - # uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Build ${{ env.PACKAGE_NAME }} - # run: | - # ./gradlew :android:crt:build + android: + name: Android + # ubuntu-20.04 comes with Android tooling, see: https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md#android + runs-on: ubuntu-20.04 # latest + steps: + - name: Checkout Sources + uses: actions/checkout@v2 + with: + submodules: true + - name: Build ${{ env.PACKAGE_NAME }} + run: | + ./gradlew :android:crt:build - # # check that docs can still build - # check-docs: - # runs-on: ubuntu-20.04 # latest - # steps: - # - uses: actions/checkout@v2 - # with: - # submodules: true - # - name: Check docs - # run: | - # ./make-docs.sh + # check that docs can still build + check-docs: + runs-on: ubuntu-20.04 # latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Check docs + run: | + ./make-docs.sh - # check-submodules: - # runs-on: ubuntu-20.04 # latest - # steps: - # - name: Checkout Source - # uses: actions/checkout@v2 - # with: - # submodules: true - # fetch-depth: 0 - # - name: Check Submodules - # # note: using "@main" because "@${{env.BUILDER_VERSION}}" doesn't work - # # https://github.com/actions/runner/issues/480 - # uses: awslabs/aws-crt-builder/.github/actions/check-submodules@main + check-submodules: + runs-on: ubuntu-20.04 # latest + steps: + - name: Checkout Source + uses: actions/checkout@v2 + with: + submodules: true + fetch-depth: 0 + - name: Check Submodules + # note: using "@main" because "@${{env.BUILDER_VERSION}}" doesn't work + # https://github.com/actions/runner/issues/480 + uses: awslabs/aws-crt-builder/.github/actions/check-submodules@main - # localhost-test-linux: - # runs-on: ubuntu-20.04 # latest - # steps: - # - name: Checkout - # uses: actions/checkout@v3 - # with: - # submodules: true - # - name: Configure local host - # run: | - # python3 -m pip install h2 - # cd crt/aws-c-http/tests/py_localhost/ - # python3 server.py & - # python3 non_tls_server.py & - # - name: Build and test - # run: | - # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - # python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream + localhost-test-linux: + runs-on: ubuntu-20.04 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python3 -m pip install h2 + cd crt/aws-c-http/tests/py_localhost/ + python3 server.py & + python3 non_tls_server.py & + - name: Build and test + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream - # localhost-test-mac: - # runs-on: macos-11 # latest - # steps: - # - name: Checkout - # uses: actions/checkout@v3 - # with: - # submodules: true - # - name: Configure local host - # run: | - # python3 -m pip install h2 - # cd crt/aws-c-http/tests/py_localhost/ - # python3 server.py & - # python3 non_tls_server.py & - # - name: Build and test - # run: | - # python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - # chmod a+x builder - # ./builder localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream + localhost-test-mac: + runs-on: macos-11 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python3 -m pip install h2 + cd crt/aws-c-http/tests/py_localhost/ + python3 server.py & + python3 non_tls_server.py & + - name: Build and test + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + chmod a+x builder + ./builder localhost-test -p ${{ env.PACKAGE_NAME }} --spec=downstream - # localhost-test-win: - # runs-on: windows-2022 # latest - # steps: - # - name: Checkout - # uses: actions/checkout@v3 - # with: - # submodules: true - # - name: Configure local host - # run: | - # python -m pip install h2 - # - name: Build and test - # run: | - # cd crt/aws-c-http/tests/py_localhost/ - # Start-Process -NoNewWindow python .\server.py - # Start-Process -NoNewWindow python .\non_tls_server.py - # python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - # python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} downstream + localhost-test-win: + runs-on: windows-2022 # latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: true + - name: Configure local host + run: | + python -m pip install h2 + - name: Build and test + run: | + cd crt/aws-c-http/tests/py_localhost/ + Start-Process -NoNewWindow python .\server.py + Start-Process -NoNewWindow python .\non_tls_server.py + python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" + python builder.pyz localhost-test -p ${{ env.PACKAGE_NAME }} downstream localhost-canary-linux: runs-on: ubuntu-20.04 # latest From 38aa46ccf15bf7bcb10a96b99a2cc51512d9e91b Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 29 Aug 2022 17:03:49 -0700 Subject: [PATCH 19/41] trivial updates --- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 2 +- .../src/main/java/com/canary/SDKNettyClientCanary.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 2fc0bdc14..6e4f7e842 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -48,7 +48,7 @@ public class Http2StreamManagerCanary { private Http2StreamManager createStreamManager(URI uri, int numConnections) { - try (EventLoopGroup eventLoopGroup = new EventLoopGroup(1); + try (EventLoopGroup eventLoopGroup = new EventLoopGroup(0 /* default to number of cores */); HostResolver resolver = new HostResolver(eventLoopGroup); ClientBootstrap bootstrap = new ClientBootstrap(eventLoopGroup, resolver); SocketOptions sockOpts = new SocketOptions(); diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 9b939554c..4d87bf8be 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -110,7 +110,7 @@ private void concurrentRequests(SdkAsyncHttpClient sdkHttpClient, int concurrent } } // Wait for all Requests to complete - requestCompleteFuture.get(130, TimeUnit.SECONDS); + requestCompleteFuture.get(30, TimeUnit.SECONDS); } } From 9c60a0e4ae99a6b771e0b04d32db6308e3c5876d Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Tue, 30 Aug 2022 15:13:43 -0700 Subject: [PATCH 20/41] override on stream? --- .../src/main/java/com/canary/SDKNettyClientCanary.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 4d87bf8be..cc4db2d5d 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -58,6 +58,10 @@ public void onHeaders(SdkHttpResponse headers) { } } + @Override + public void onStream(Publisher stream) { + } + @Override public void onError(Throwable error) { numStreamsFailures.incrementAndGet(); From 87b79a798b328494a6061b519ad56cd255a24a12 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Tue, 30 Aug 2022 15:32:15 -0700 Subject: [PATCH 21/41] consume the body --- samples/HttpClientCanary/pom.xml | 6 ++++++ .../src/main/java/com/canary/SDKNettyClientCanary.java | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/samples/HttpClientCanary/pom.xml b/samples/HttpClientCanary/pom.xml index 74b3aa7d3..ca7b23d95 100644 --- a/samples/HttpClientCanary/pom.xml +++ b/samples/HttpClientCanary/pom.xml @@ -26,6 +26,12 @@ 2.17.261 compile + + io.reactivex.rxjava2 + rxjava + 2.2.21 + compile + diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index cc4db2d5d..d042ec0b0 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -4,6 +4,7 @@ import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; import org.reactivestreams.Publisher; +import io.reactivex.Flowable; import software.amazon.awssdk.http.*; import software.amazon.awssdk.http.async.AsyncExecuteRequest; import software.amazon.awssdk.http.async.SdkAsyncHttpClient; @@ -39,6 +40,8 @@ public void onHeaders(SdkHttpResponse headers) { @Override public void onStream(Publisher stream) { + Flowable.fromPublisher(stream).forEach(b -> { + }); } @Override @@ -58,10 +61,6 @@ public void onHeaders(SdkHttpResponse headers) { } } - @Override - public void onStream(Publisher stream) { - } - @Override public void onError(Throwable error) { numStreamsFailures.incrementAndGet(); From ce3edc97adb2c0e478020364f77bafdb5a0d03bd Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Tue, 30 Aug 2022 16:39:50 -0700 Subject: [PATCH 22/41] remove the content length --- .../src/main/java/com/canary/SDKNettyClientCanary.java | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index d042ec0b0..a293f8161 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -78,7 +78,6 @@ private SdkHttpFullRequest createRequest(URI uri) { .uri(uri) .method(SdkHttpMethod.GET) .encodedPath("/echo") - .putHeader("content-length", "0") .build(); } From de08df7eadbfe09bd501ea3542dead1a2baf30c2 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Tue, 30 Aug 2022 17:01:12 -0700 Subject: [PATCH 23/41] use 30s gap --- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 2 +- .../src/main/java/com/canary/SDKNettyClientCanary.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 6e4f7e842..278c4da3a 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -192,6 +192,6 @@ public static void main(String[] args) throws Exception { Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); canary.uri = new URI("https://localhost:8443/echo"); canary.benchNum = 100; - canary.runCanary(5, 5, 10); + canary.runCanary(5, 5, 30); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index a293f8161..c79cf59a6 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -145,6 +145,6 @@ public static void main(String[] args) throws Exception { /* TODO: make all those number configurable */ canary.uri = new URI("https://localhost:8443/echo"); canary.benchNum = 100; - canary.runCanary(5, 5, 10); + canary.runCanary(5, 5, 30); } } From 285c6d7d97237ab15ce373cb3f2b6fe8ba386916 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 17:01:15 +0000 Subject: [PATCH 24/41] support non-tls uri --- .../main/java/com/canary/Http2StreamManagerCanary.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 278c4da3a..9cf2fd1e9 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -43,6 +43,7 @@ */ public class Http2StreamManagerCanary { private final AtomicInteger opts = new AtomicInteger(0); + private static final String HTTPS = "https"; private URI uri; private int benchNum; @@ -55,13 +56,18 @@ private Http2StreamManager createStreamManager(URI uri, int numConnections) { TlsContextOptions tlsOpts = TlsContextOptions.createDefaultClient().withAlpnList("h2") .withVerifyPeer(false); TlsContext tlsContext = new TlsContext(tlsOpts)) { + boolean useTls = HTTPS.equals(uri.getScheme()); Http2StreamManagerOptions options = new Http2StreamManagerOptions(); HttpClientConnectionManagerOptions connectionManagerOptions = new HttpClientConnectionManagerOptions(); connectionManagerOptions.withClientBootstrap(bootstrap) .withSocketOptions(sockOpts) - .withTlsContext(tlsContext) .withUri(uri) .withMaxConnections(numConnections); + if(useTls) { + connectionManagerOptions.withTlsContext(tlsContext); + } else { + options.withPriorKnowledge(true); + } options.withConnectionManagerOptions(connectionManagerOptions); return Http2StreamManager.create(options); @@ -170,6 +176,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList warmupResults = new ArrayList<>(); ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); + Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); try (Http2StreamManager streamManager = createStreamManager(uri, 100)) { AtomicInteger opts = new AtomicInteger(0); From 45df7687967583209d9b27fdb41c75cbb9b35154 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 11:06:17 -0700 Subject: [PATCH 25/41] use local server without body --- crt/aws-c-http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index f81ee942f..9275fffcc 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit f81ee942fa9b149711d90b4a3f3af5c946151d16 +Subproject commit 9275fffcc13b944ad9c2e7d16683f1989276f21a From f941879c89f982df543f7bc6ac2b2d27fdd887cf Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 13:26:15 -0700 Subject: [PATCH 26/41] non tls test --- crt/aws-c-http | 2 +- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 2 +- .../src/main/java/com/canary/SDKNettyClientCanary.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index 9275fffcc..f98f134bb 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit 9275fffcc13b944ad9c2e7d16683f1989276f21a +Subproject commit f98f134bb761f9dfab95679fdacfbfd584a002c2 diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 9cf2fd1e9..8e9716ef2 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -197,7 +197,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { /* TODO: make all those number configurable */ Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); - canary.uri = new URI("https://localhost:8443/echo"); + canary.uri = new URI("http://localhost:8080/"); canary.benchNum = 100; canary.runCanary(5, 5, 30); } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index c79cf59a6..721b88a9a 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -143,7 +143,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); /* TODO: make all those number configurable */ - canary.uri = new URI("https://localhost:8443/echo"); + canary.uri = new URI("http://localhost:8080/"); canary.benchNum = 100; canary.runCanary(5, 5, 30); } From 79adafd5a17f82dd1b29d980de21156b09ac4abf Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 14:12:25 -0700 Subject: [PATCH 27/41] Revert "non tls test" This reverts commit f941879c89f982df543f7bc6ac2b2d27fdd887cf. --- crt/aws-c-http | 2 +- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 2 +- .../src/main/java/com/canary/SDKNettyClientCanary.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index f98f134bb..9275fffcc 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit f98f134bb761f9dfab95679fdacfbfd584a002c2 +Subproject commit 9275fffcc13b944ad9c2e7d16683f1989276f21a diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 8e9716ef2..9cf2fd1e9 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -197,7 +197,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { /* TODO: make all those number configurable */ Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); - canary.uri = new URI("http://localhost:8080/"); + canary.uri = new URI("https://localhost:8443/echo"); canary.benchNum = 100; canary.runCanary(5, 5, 30); } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 721b88a9a..c79cf59a6 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -143,7 +143,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); /* TODO: make all those number configurable */ - canary.uri = new URI("http://localhost:8080/"); + canary.uri = new URI("https://localhost:8443/echo"); canary.benchNum = 100; canary.runCanary(5, 5, 30); } From 4fcb93e854dd23f3a2dd9e1d2f5296f861cd187d Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 16:18:00 -0700 Subject: [PATCH 28/41] back to the server with body --- crt/aws-c-http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index 9275fffcc..f81ee942f 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit 9275fffcc13b944ad9c2e7d16683f1989276f21a +Subproject commit f81ee942fa9b149711d90b4a3f3af5c946151d16 From a269139497a5fde213f01aa9134dc0082c941ecb Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 16:22:04 -0700 Subject: [PATCH 29/41] send byte[] across jni --- .../crt/http/HttpStreamResponseHandlerNativeAdapter.java | 4 +--- src/native/http_request_response.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/software/amazon/awssdk/crt/http/HttpStreamResponseHandlerNativeAdapter.java b/src/main/java/software/amazon/awssdk/crt/http/HttpStreamResponseHandlerNativeAdapter.java index 7a0db0f64..02bc91afe 100644 --- a/src/main/java/software/amazon/awssdk/crt/http/HttpStreamResponseHandlerNativeAdapter.java +++ b/src/main/java/software/amazon/awssdk/crt/http/HttpStreamResponseHandlerNativeAdapter.java @@ -41,9 +41,7 @@ void onResponseHeadersDone(HttpStreamBase stream, int blockType) { } } - int onResponseBody(HttpStreamBase stream, ByteBuffer bodyBytesIn) { - byte[] body = new byte[bodyBytesIn.limit()]; - bodyBytesIn.get(body); + int onResponseBody(HttpStreamBase stream, byte[] body) { if (this.responseBaseHandler != null) { return responseBaseHandler.onResponseBody(stream, body); } else { diff --git a/src/native/http_request_response.c b/src/native/http_request_response.c index 037bf5031..45f8afb1f 100644 --- a/src/native/http_request_response.c +++ b/src/native/http_request_response.c @@ -214,7 +214,7 @@ int aws_java_http_stream_on_incoming_body_fn( int result = AWS_OP_ERR; - jobject jni_payload = aws_jni_direct_byte_buffer_from_raw_ptr(env, data->ptr, data->len); + jobject jni_payload = aws_jni_byte_array_from_cursor(env, data); jint window_increment = (*env)->CallIntMethod( env, From 47ed94ccfb1627adc9a7b260c0b592ce001a5c07 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 8 Sep 2022 23:34:30 +0000 Subject: [PATCH 30/41] update register type --- src/native/java_class_ids.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/native/java_class_ids.c b/src/native/java_class_ids.c index a51c8389c..baeb9404e 100644 --- a/src/native/java_class_ids.c +++ b/src/native/java_class_ids.c @@ -475,8 +475,8 @@ static void s_cache_http_stream_response_handler_native_adapter(JNIEnv *env) { (*env)->GetMethodID(env, cls, "onResponseHeadersDone", "(Lsoftware/amazon/awssdk/crt/http/HttpStreamBase;I)V"); AWS_FATAL_ASSERT(http_stream_response_handler_properties.onResponseHeadersDone); - http_stream_response_handler_properties.onResponseBody = (*env)->GetMethodID( - env, cls, "onResponseBody", "(Lsoftware/amazon/awssdk/crt/http/HttpStreamBase;Ljava/nio/ByteBuffer;)I"); + http_stream_response_handler_properties.onResponseBody = + (*env)->GetMethodID(env, cls, "onResponseBody", "(Lsoftware/amazon/awssdk/crt/http/HttpStreamBase;[B)I"); AWS_FATAL_ASSERT(http_stream_response_handler_properties.onResponseBody); http_stream_response_handler_properties.onResponseComplete = From 57ffd075ef35faa242d88da0493a7bc2a4510265 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Fri, 9 Sep 2022 03:08:06 +0000 Subject: [PATCH 31/41] disable log --- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 9cf2fd1e9..7e7e7bbb3 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -176,7 +176,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList warmupResults = new ArrayList<>(); ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); - Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); + // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); try (Http2StreamManager streamManager = createStreamManager(uri, 100)) { AtomicInteger opts = new AtomicInteger(0); From 4e7c9f17fcb79cce3e3f8b24a9a02c92a5a36705 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Fri, 9 Sep 2022 16:14:47 -0700 Subject: [PATCH 32/41] make each connection 40 concurrent streams and 800 batch --- .../main/java/com/canary/Http2StreamManagerCanary.java | 9 +++++---- .../src/main/java/com/canary/SDKNettyClientCanary.java | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 7e7e7bbb3..35c7545e3 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -49,7 +49,7 @@ public class Http2StreamManagerCanary { private Http2StreamManager createStreamManager(URI uri, int numConnections) { - try (EventLoopGroup eventLoopGroup = new EventLoopGroup(0 /* default to number of cores */); + try (EventLoopGroup eventLoopGroup = new EventLoopGroup(4 /* default to number of cores */); HostResolver resolver = new HostResolver(eventLoopGroup); ClientBootstrap bootstrap = new ClientBootstrap(eventLoopGroup, resolver); SocketOptions sockOpts = new SocketOptions(); @@ -68,7 +68,7 @@ private Http2StreamManager createStreamManager(URI uri, int numConnections) { } else { options.withPriorKnowledge(true); } - options.withConnectionManagerOptions(connectionManagerOptions); + options.withConnectionManagerOptions(connectionManagerOptions).withIdealConcurrentStreamsPerConnection(40); return Http2StreamManager.create(options); } @@ -178,7 +178,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger streamFailed = new AtomicInteger(0); // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); - try (Http2StreamManager streamManager = createStreamManager(uri, 100)) { + try (Http2StreamManager streamManager = createStreamManager(uri, 20)) { AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); @@ -195,10 +195,11 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except } public static void main(String[] args) throws Exception { + System.out.println("Current JVM version - " + System.getProperty("java.version")); /* TODO: make all those number configurable */ Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); canary.uri = new URI("https://localhost:8443/echo"); - canary.benchNum = 100; + canary.benchNum = 800; canary.runCanary(5, 5, 30); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index c79cf59a6..e6dd444a3 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -11,6 +11,7 @@ import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.utils.AttributeMap; +import software.amazon.awssdk.http.nio.netty.Http2Configuration; import java.net.URI; import java.nio.ByteBuffer; @@ -121,7 +122,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); - SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder() + SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder().http2Configuration(Http2Configuration.builder().maxStreams(new Long(40)).build()) .buildWithDefaults(trustAllTlsAttributeMapBuilder() .put(PROTOCOL, Protocol.HTTP2) .build()); @@ -144,7 +145,7 @@ public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); /* TODO: make all those number configurable */ canary.uri = new URI("https://localhost:8443/echo"); - canary.benchNum = 100; + canary.benchNum = 800; canary.runCanary(5, 5, 30); } } From f00e98112b5fbeefe319dfe879c637703c36752f Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Sat, 10 Sep 2022 00:44:35 +0000 Subject: [PATCH 33/41] make sure the connections and streams are equal --- .../java/com/canary/Http2StreamManagerCanary.java | 12 +++++++++--- .../main/java/com/canary/SDKNettyClientCanary.java | 7 +++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 35c7545e3..5c78b507d 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -45,6 +45,8 @@ public class Http2StreamManagerCanary { private final AtomicInteger opts = new AtomicInteger(0); private static final String HTTPS = "https"; private URI uri; + private int maxStreams = 100; + private int maxConnections = 50; private int benchNum; private Http2StreamManager createStreamManager(URI uri, int numConnections) { @@ -68,7 +70,9 @@ private Http2StreamManager createStreamManager(URI uri, int numConnections) { } else { options.withPriorKnowledge(true); } - options.withConnectionManagerOptions(connectionManagerOptions).withIdealConcurrentStreamsPerConnection(40); + options.withConnectionManagerOptions(connectionManagerOptions) + .withIdealConcurrentStreamsPerConnection(this.maxStreams) + .withMaxConcurrentStreamsPerConnection(this.maxStreams); return Http2StreamManager.create(options); } @@ -178,7 +182,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger streamFailed = new AtomicInteger(0); // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); - try (Http2StreamManager streamManager = createStreamManager(uri, 20)) { + try (Http2StreamManager streamManager = createStreamManager(uri, this.maxConnections)) { AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); @@ -199,7 +203,9 @@ public static void main(String[] args) throws Exception { /* TODO: make all those number configurable */ Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); canary.uri = new URI("https://localhost:8443/echo"); - canary.benchNum = 800; + canary.maxConnections = 8; + canary.maxStreams = 20; + canary.benchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index e6dd444a3..6f8f3c690 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -29,6 +29,8 @@ public class SDKNettyClientCanary { private final AtomicInteger opts = new AtomicInteger(0); private URI uri; private int benchNum; + private int maxStreams = 100; + private int maxConnections = 50; public static AttributeMap.Builder trustAllTlsAttributeMapBuilder() { return AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, true); @@ -122,7 +124,8 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); - SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder().http2Configuration(Http2Configuration.builder().maxStreams(new Long(40)).build()) + SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder().http2Configuration(Http2Configuration.builder() + .maxStreams(new Long(this.maxStreams)).build()) .buildWithDefaults(trustAllTlsAttributeMapBuilder() .put(PROTOCOL, Protocol.HTTP2) .build()); @@ -145,7 +148,7 @@ public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); /* TODO: make all those number configurable */ canary.uri = new URI("https://localhost:8443/echo"); - canary.benchNum = 800; + canary.benchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } } From 3e46f984dcbfccdfe9d9503e445784d7366f9648 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 12 Sep 2022 17:21:16 +0000 Subject: [PATCH 34/41] clean up a bit --- .../src/main/java/com/canary/Http2StreamManagerCanary.java | 5 ++++- .../src/main/java/com/canary/SDKNettyClientCanary.java | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 5c78b507d..45396668d 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -51,7 +51,7 @@ public class Http2StreamManagerCanary { private Http2StreamManager createStreamManager(URI uri, int numConnections) { - try (EventLoopGroup eventLoopGroup = new EventLoopGroup(4 /* default to number of cores */); + try (EventLoopGroup eventLoopGroup = new EventLoopGroup(0 /* default to number of cores */); HostResolver resolver = new HostResolver(eventLoopGroup); ClientBootstrap bootstrap = new ClientBootstrap(eventLoopGroup, resolver); SocketOptions sockOpts = new SocketOptions(); @@ -182,6 +182,9 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger streamFailed = new AtomicInteger(0); // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); + System.out.println("benchNum: "+ this.benchNum); + System.out.println("maxStreams: "+ this.maxStreams); + System.out.println("maxConnections: "+ this.maxConnections); try (Http2StreamManager streamManager = createStreamManager(uri, this.maxConnections)) { AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 6f8f3c690..3df70806a 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -124,8 +124,12 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); + System.out.println("benchNum: "+ this.benchNum); + System.out.println("maxStreams: "+ this.maxStreams); + System.out.println("maxConnections: "+ this.maxConnections); SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder().http2Configuration(Http2Configuration.builder() .maxStreams(new Long(this.maxStreams)).build()) + .maxConcurrency(this.benchNum) .buildWithDefaults(trustAllTlsAttributeMapBuilder() .put(PROTOCOL, Protocol.HTTP2) .build()); @@ -148,6 +152,8 @@ public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); /* TODO: make all those number configurable */ canary.uri = new URI("https://localhost:8443/echo"); + canary.maxConnections = 8; + canary.maxStreams = 20; canary.benchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } From f9813b6038811d76a585991054a55a21baa1cbe7 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 12 Sep 2022 17:26:46 +0000 Subject: [PATCH 35/41] typo --- .../main/java/com/canary/Http2StreamManagerCanary.java | 8 ++++---- .../src/main/java/com/canary/SDKNettyClientCanary.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 45396668d..468b8dd58 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -47,7 +47,7 @@ public class Http2StreamManagerCanary { private URI uri; private int maxStreams = 100; private int maxConnections = 50; - private int benchNum; + private int batchNum; private Http2StreamManager createStreamManager(URI uri, int numConnections) { @@ -182,14 +182,14 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicInteger streamFailed = new AtomicInteger(0); // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); - System.out.println("benchNum: "+ this.benchNum); + System.out.println("batchNum: "+ this.batchNum); System.out.println("maxStreams: "+ this.maxStreams); System.out.println("maxConnections: "+ this.maxConnections); try (Http2StreamManager streamManager = createStreamManager(uri, this.maxConnections)) { AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(streamManager, benchNum, streamFailed, opts, done); + concurrentRequests(streamManager, batchNum, streamFailed, opts, done); scheduler.shutdown(); } System.out.println("Failed request num: " + streamFailed.get()); @@ -208,7 +208,7 @@ public static void main(String[] args) throws Exception { canary.uri = new URI("https://localhost:8443/echo"); canary.maxConnections = 8; canary.maxStreams = 20; - canary.benchNum = canary.maxStreams * canary.maxConnections; + canary.batchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 3df70806a..f00d9ec01 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -28,7 +28,7 @@ public class SDKNettyClientCanary { private final AtomicInteger opts = new AtomicInteger(0); private URI uri; - private int benchNum; + private int batchNum; private int maxStreams = 100; private int maxConnections = 50; @@ -124,12 +124,12 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); - System.out.println("benchNum: "+ this.benchNum); + System.out.println("batchNum: "+ this.batchNum); System.out.println("maxStreams: "+ this.maxStreams); System.out.println("maxConnections: "+ this.maxConnections); SdkAsyncHttpClient sdkHttpClient = NettyNioAsyncHttpClient.builder().http2Configuration(Http2Configuration.builder() .maxStreams(new Long(this.maxStreams)).build()) - .maxConcurrency(this.benchNum) + .maxConcurrency(this.batchNum) .buildWithDefaults(trustAllTlsAttributeMapBuilder() .put(PROTOCOL, Protocol.HTTP2) .build()); @@ -138,7 +138,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except AtomicBoolean done = new AtomicBoolean(false); ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); - concurrentRequests(sdkHttpClient, benchNum, streamFailed, opts, done); + concurrentRequests(sdkHttpClient, batchNum, streamFailed, opts, done); scheduler.shutdown(); System.out.println("Failed request num: " + streamFailed.get()); @@ -154,7 +154,7 @@ public static void main(String[] args) throws Exception { canary.uri = new URI("https://localhost:8443/echo"); canary.maxConnections = 8; canary.maxStreams = 20; - canary.benchNum = canary.maxStreams * canary.maxConnections; + canary.batchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } } From 699d702b170c3fb536c9d387161d45ee7062b6c4 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 12 Sep 2022 16:54:25 -0700 Subject: [PATCH 36/41] use the new branch of http --- crt/aws-c-http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index f81ee942f..2a23d4f11 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit f81ee942fa9b149711d90b4a3f3af5c946151d16 +Subproject commit 2a23d4f11353732bb2e7c7c8546903673776235b From db37f9a0140ab10f0bc0dc6f8489a8c9be7b4692 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Mon, 12 Sep 2022 17:00:47 -0700 Subject: [PATCH 37/41] update the branch --- crt/aws-c-http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index 2a23d4f11..a34e41031 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit 2a23d4f11353732bb2e7c7c8546903673776235b +Subproject commit a34e41031936c0f1c7b41708f2a1da24735e41d6 From 623e16721bd4120b944da048d32aa8faf4edf2fd Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Tue, 13 Sep 2022 14:49:56 -0700 Subject: [PATCH 38/41] make sure we error out when CRT result is smaller than netty --- .builder/actions/localhost_canary.py | 3 +- .../src/main/java/com/canary/CanaryUtils.java | 4 +- .../com/canary/Http2StreamManagerCanary.java | 44 ++++++++++++++----- .../java/com/canary/SDKNettyClientCanary.java | 18 +++++--- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/.builder/actions/localhost_canary.py b/.builder/actions/localhost_canary.py index d135c7a43..1530a98c6 100644 --- a/.builder/actions/localhost_canary.py +++ b/.builder/actions/localhost_canary.py @@ -10,7 +10,8 @@ def run(self, env): actions = [ "mvn install -DskipTests", "cd ./samples/HttpClientCanary && mvn install", - "cd ./samples/HttpClientCanary && mvn exec:exec@netty exec:exec@crt" + "cd ./samples/HttpClientCanary && mvn exec:exec@netty", + "cd ./samples/HttpClientCanary && mvn exec:exec@crt" ] return Builder.Script(actions, name='aws-crt-java-test') diff --git a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java index b118c9246..4929c25d6 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/CanaryUtils.java @@ -54,11 +54,13 @@ public static double calculateSTD(ArrayList list) { return Math.sqrt(variance); } - public static void printResult(ArrayList list) { + /* Return avg of the list and print out the avg and std */ + public static double printResult(ArrayList list) { double avg = calculateAverage(list); double std = calculateSTD(list); System.out.println("Result collected has: " + list.size()); System.out.println("avg of all samples: " + avg); System.out.println("Standard deviation of all samples: " + std); + return avg; } } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 468b8dd58..93df80fbb 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -48,6 +48,7 @@ public class Http2StreamManagerCanary { private int maxStreams = 100; private int maxConnections = 50; private int batchNum; + private String nettyResultPath; private Http2StreamManager createStreamManager(URI uri, int numConnections) { @@ -65,7 +66,7 @@ private Http2StreamManager createStreamManager(URI uri, int numConnections) { .withSocketOptions(sockOpts) .withUri(uri) .withMaxConnections(numConnections); - if(useTls) { + if (useTls) { connectionManagerOptions.withTlsContext(tlsContext); } else { options.withPriorKnowledge(true); @@ -165,7 +166,7 @@ public void onResponseComplete(HttpStreamBase stream, int errorCode) { opts.incrementAndGet(); int requestCompletedNum = requestCompleted.incrementAndGet(); - if(requestCompletedNum == concurrentNum) { + if (requestCompletedNum == concurrentNum) { requestCompleteFuture.complete(null); } } @@ -180,15 +181,15 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except ArrayList warmupResults = new ArrayList<>(); ArrayList results = new ArrayList<>(); AtomicInteger streamFailed = new AtomicInteger(0); - // Log.initLoggingToFile(Log.LogLevel.Error, "errorlog.txt"); - System.out.println("batchNum: "+ this.batchNum); - System.out.println("maxStreams: "+ this.maxStreams); - System.out.println("maxConnections: "+ this.maxConnections); + System.out.println("batchNum: " + this.batchNum); + System.out.println("maxStreams: " + this.maxStreams); + System.out.println("maxConnections: " + this.maxConnections); try (Http2StreamManager streamManager = createStreamManager(uri, this.maxConnections)) { AtomicInteger opts = new AtomicInteger(0); AtomicBoolean done = new AtomicBoolean(false); - ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, warmupResults, results); + ScheduledExecutorService scheduler = createDataCollector(warmupLoops, loops, timerSecs, opts, done, + warmupResults, results); concurrentRequests(streamManager, batchNum, streamFailed, opts, done); scheduler.shutdown(); } @@ -196,18 +197,37 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except System.out.println("////////////// warmup results //////////////"); printResult(warmupResults); System.out.println("////////////// real results //////////////"); - printResult(results); + double avg_result = printResult(results); + BufferedReader reader = new BufferedReader(new FileReader(nettyResultPath)); + StringBuilder stringBuilder = new StringBuilder(); + String line = null; + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + } + reader.close(); + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + String content = stringBuilder.toString(); + double netty_result = Double.parseDouble(content); + if (avg_result < netty_result) { + System.out.println("CRT result is smaller than netty. CRT: " + avg_result + " Netty: " + netty_result); + System.exit(-1); + } + CrtResource.logNativeResources(); CrtResource.waitForNoResources(); + } public static void main(String[] args) throws Exception { System.out.println("Current JVM version - " + System.getProperty("java.version")); - /* TODO: make all those number configurable */ + Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); - canary.uri = new URI("https://localhost:8443/echo"); - canary.maxConnections = 8; - canary.maxStreams = 20; + + canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:8443/echo")); + canary.maxConnections = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxConnections", "8")); + canary.maxStreams = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxStreams", "20")); + canary.nettyResultPath = System.getProperty("aws.crt.http.canary.nettyResultPath", "netty_result.txt"); + canary.batchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index f00d9ec01..724ed3d62 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -13,6 +13,8 @@ import software.amazon.awssdk.utils.AttributeMap; import software.amazon.awssdk.http.nio.netty.Http2Configuration; +import java.io.BufferedWriter; +import java.io.FileWriter; import java.net.URI; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -31,6 +33,7 @@ public class SDKNettyClientCanary { private int batchNum; private int maxStreams = 100; private int maxConnections = 50; + private String nettyResultPath; public static AttributeMap.Builder trustAllTlsAttributeMapBuilder() { return AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, true); @@ -145,15 +148,20 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except System.out.println("////////////// warmup results //////////////"); printResult(warmupResults); System.out.println("////////////// real results //////////////"); - printResult(results); + double avg_result = printResult(results); + BufferedWriter writer = new BufferedWriter(new FileWriter(this.nettyResultPath, false)); + writer.append(Double.toString(avg_result)); + writer.close(); } public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); - /* TODO: make all those number configurable */ - canary.uri = new URI("https://localhost:8443/echo"); - canary.maxConnections = 8; - canary.maxStreams = 20; + + canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:8443/echo")); + canary.maxConnections = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxConnections", "8")); + canary.maxStreams = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxStreams", "20")); + canary.nettyResultPath = System.getProperty("aws.crt.http.canary.nettyResultPath", "netty_result.txt"); + canary.batchNum = canary.maxStreams * canary.maxConnections; canary.runCanary(5, 5, 30); } From bac7d415411c3fd45e840f336f9b7d8ceee1d556 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 19 Mar 2026 15:47:01 -0700 Subject: [PATCH 39/41] fixing CI --- .github/workflows/ci.yml | 26 +++++++++---------- .../com/canary/Http2StreamManagerCanary.java | 2 +- .../java/com/canary/SDKNettyClientCanary.java | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5bbb43bb9..dec55cae9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -329,27 +329,27 @@ jobs: - name: Configure local host run: | python3 -m pip install h2 - cd crt/aws-c-http/tests/py_localhost/ - python3 server.py & - python3 non_tls_server.py & + cd crt/aws-c-http/tests/mock_server/ + python3 h2tls_mock_server.py & + python3 h2non_tls_server.py & - name: Build and test run: | python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" python builder.pyz localhost-canary -p ${{ env.PACKAGE_NAME }} --spec=downstream localhost-canary-mac: - runs-on: macos-11 # latest + runs-on: macos-15 # latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true - name: Configure local host run: | python3 -m pip install h2 - cd crt/aws-c-http/tests/py_localhost/ - python3 server.py & - python3 non_tls_server.py & + cd crt/aws-c-http/tests/mock_server/ + python3 h2tls_mock_server.py & + python3 h2non_tls_server.py & - name: Build and test run: | python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" @@ -357,10 +357,10 @@ jobs: ./builder localhost-canary -p ${{ env.PACKAGE_NAME }} --spec=downstream localhost-canary-win: - runs-on: windows-2022 # latest + runs-on: windows-2025 # latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true - name: Configure local host @@ -368,9 +368,9 @@ jobs: python -m pip install h2 - name: Build and test run: | - cd crt/aws-c-http/tests/py_localhost/ - Start-Process -NoNewWindow python .\server.py - Start-Process -NoNewWindow python .\non_tls_server.py + cd crt/aws-c-http/tests/mock_server/ + Start-Process -NoNewWindow python .\h2tls_mock_server.py + Start-Process -NoNewWindow python .\h2non_tls_server.py python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" python builder.pyz localhost-canary -p ${{ env.PACKAGE_NAME }} downstream diff --git a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java index 93df80fbb..42e4738ff 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/Http2StreamManagerCanary.java @@ -223,7 +223,7 @@ public static void main(String[] args) throws Exception { Http2StreamManagerCanary canary = new Http2StreamManagerCanary(); - canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:8443/echo")); + canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:3443/echo")); canary.maxConnections = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxConnections", "8")); canary.maxStreams = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxStreams", "20")); canary.nettyResultPath = System.getProperty("aws.crt.http.canary.nettyResultPath", "netty_result.txt"); diff --git a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java index 724ed3d62..4691f9a05 100644 --- a/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java +++ b/samples/HttpClientCanary/src/main/java/com/canary/SDKNettyClientCanary.java @@ -157,7 +157,7 @@ private void runCanary(int warmupLoops, int loops, long timerSecs) throws Except public static void main(String[] args) throws Exception { SDKNettyClientCanary canary = new SDKNettyClientCanary(); - canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:8443/echo")); + canary.uri = new URI(System.getProperty("aws.crt.http.canary.uri", "https://localhost:3443/echo")); canary.maxConnections = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxConnections", "8")); canary.maxStreams = Integer.parseInt(System.getProperty("aws.crt.http.canary.maxStreams", "20")); canary.nettyResultPath = System.getProperty("aws.crt.http.canary.nettyResultPath", "netty_result.txt"); From 9dd543d942bf063cdeca805e2f978191fe74c380 Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 19 Mar 2026 15:56:00 -0700 Subject: [PATCH 40/41] more CI fix --- .github/workflows/ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dec55cae9..54661f0b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -202,7 +202,7 @@ jobs: python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream macos: - runs-on: macos-14 #latest + runs-on: macos-15 #latest steps: - uses: aws-actions/configure-aws-credentials@v4 with: @@ -220,7 +220,7 @@ jobs: python3 codebuild/macos_compatibility_check.py macos-x64: - runs-on: macos-14-large #latest + runs-on: macos-15-large #latest steps: - uses: aws-actions/configure-aws-credentials@v4 with: @@ -287,7 +287,7 @@ jobs: localhost-test-macos: - runs-on: macos-14 # latest + runs-on: macos-15 # latest steps: - uses: aws-actions/configure-aws-credentials@v4 with: @@ -346,6 +346,8 @@ jobs: submodules: true - name: Configure local host run: | + python3 -m venv .venv + source .venv/bin/activate python3 -m pip install h2 cd crt/aws-c-http/tests/mock_server/ python3 h2tls_mock_server.py & From 14268e176ab13460123ed07155119eec478d0afa Mon Sep 17 00:00:00 2001 From: Dengke Tang Date: Thu, 19 Mar 2026 16:12:46 -0700 Subject: [PATCH 41/41] try the new branch --- crt/aws-c-http | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crt/aws-c-http b/crt/aws-c-http index 0d8e1a933..a6d309eaa 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit 0d8e1a933f46b8af984dfc8168ebcdf32748c184 +Subproject commit a6d309eaaf6365466721adf69c11e4a80c5dfcd8