From 85e656c0dc396d86dc7234689c0f041ff87b832c Mon Sep 17 00:00:00 2001 From: ZHANG Dapeng Date: Fri, 24 Mar 2023 11:20:38 -0700 Subject: [PATCH] Fix AsyncServletOutputStreamWriterConcurrencyTest flakiness (#9948) The commit https://github.com/grpc/grpc-java/pull/8596/commits/792946132c6bb38ebfd84787fa40b768f4b6d7ad#diff-cc7b2eb82d208e027f432435bcd324a46713c31096352f437417b770752f92abR197 makes it possible that the sleep can naturally wake up while `writeState` gets changes at the same time, causing a data race in the value of `parkingThread` between https://github.com/niloc132/grpc-java/blob/792946132c6bb38ebfd84787fa40b768f4b6d7ad/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java#L199 and https://github.com/niloc132/grpc-java/blob/792946132c6bb38ebfd84787fa40b768f4b6d7ad/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java#L218 , in extreme scenario such as the CPU is stressed. Fixes #9917 --- .../java/io/grpc/servlet/AsyncServletOutputStreamWriter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java index 4f4e37fda8..5ee5c02a12 100644 --- a/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java +++ b/servlet/src/main/java/io/grpc/servlet/AsyncServletOutputStreamWriter.java @@ -194,7 +194,9 @@ final class AsyncServletOutputStreamWriter { // being set to false by runOrBuffer() concurrently. while (writeState.get().readyAndDrained) { parkingThread = Thread.currentThread(); - LockSupport.parkNanos(Duration.ofMinutes(1).toNanos()); // should return immediately + // Try to sleep for an extremely long time to avoid writeState being changed at exactly + // the time when sleep time expires (in extreme scenario, such as #9917). + LockSupport.parkNanos(Duration.ofHours(1).toNanos()); // should return immediately } parkingThread = null; }