Description
I 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 minio/minio#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 minio/minio-java#766.
I find there is some issue with Go1.12
or okhttp3
as i found this issue in the community.
Refer #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");
}
}