Http2Stream to have independent errors for request and response streams
See original GitHub issueI am using minio for Object storage. Minio is a golang project using go1.12 as the base go version.
The server is HTTP2 enabled. I use using minio java client which uses okhttp3
. when i try to store the object in a bucket in multi threaded mode i get okhttp3.internal.http2.StreamResetException: stream was reset: NO_ERROR
.
Refer https://github.com/minio/minio/issues/7501 .
okhttp3.OkHttpClient
uses http2.0 by default which causes such issue.
If i forcefuly set the protocol to 1.1 ,it works fine.
Refer PR https://github.com/minio/minio-java/pull/766.
I find there is some issue with Go1.12
or okhttp3
as i found this issue in the community.
Refer https://github.com/square/okhttp/issues/3955
The only solution provided there was to revert to HTTP1_1 .
Setting the protocol to 1.1 is not the solution as i am not using the functionality of HTTP2.0 enabled server. Below is the code which replicates the problem
import io.minio.MinioClient;
class PutObjectRunnable implements Runnable {
MinioClient client;
String bucketName;
String filename;
public PutObjectRunnable(MinioClient client, String bucketName, String filename) {
this.client = client;
this.bucketName = bucketName;
this.filename = filename;
}
public void run() {
StringBuffer traceBuffer = new StringBuffer();
try {
client.putObject(bucketName, filename, filename);
} catch (Exception e) {
System.err.print(traceBuffer.toString());
e.printStackTrace();
}
}
}
public class ThreadedPutObject {
public static void main(String args[]) throws Exception {
try{
MinioClient client = new MinioClient("https://play.min.io:9000", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", true);
client.traceOn(System.out);
long startTime = System.currentTimeMillis();
boolean found = minioClient.bucketExists("my-bucketname");
if (found) {
System.out.println("my-bucketname already exists");
} else {
// Create bucket 'my-bucketname'.
minioClient.makeBucket("my-bucketname");
System.out.println("my-bucketname is created successfully");
}
Thread[] threads = new Thread[7];
String[] location = new String[]{"<<PATH_TO_OBJECT_1>>",
"<<PATH_TO_OBJECT_2>>",
"<<PATH_TO_OBJECT_3>>",
"<<PATH_TO_OBJECT_4>>",
"<<PATH_TO_OBJECT_5>>",
"<<PATH_TO_OBJECT_6>>",
"<<PATH_TO_OBJECT_7>>" };
for (int i = 0; i < 7; i++) {
PutObjectRunnable pr = new PutObjectRunnable(client, "my-bucketname",location[i] );
threads[i] = new Thread(pr);
}
for (int i = 0; i < 7; i++) {
threads[i].start();
}
// Waiting for threads to complete.
for (int i = 0; i < 7; i++) {
threads[i].join();
System.out.println(i);
}
// All threads are completed.
} catch (Exception e) {
throw e;
}
System.out.println("uploaded");
}
}
Issue Analytics
- State:
- Created 4 years ago
- Comments:34 (9 by maintainers)
Top GitHub Comments
@swankjesse I would like to point out that I have lots of users who are waiting for a fix on this (https://github.com/PhilippC/keepass2android/issues/747), so if it is possible in any way to keep the milestone fixed to 4.5 I’d be really happy, as I have seen this being moved from 4.3 to 4.4 and now 4.5. Anyway: Thanks for your hard work! I really appreciate it and I totally understand that features are shifted to later milestones, so please don’t see this as criticism. I just want to make sure you are aware that this is a real issue for real people 😃
Can fix.