Re: (hypothetical? bogus?) TSAN failure reported in ForkJoinPool (JDK11 and "refresh" versions)
Chris Povirk via Concurrency-interest <[email protected]> Thu, 16 Jul 2020 14:15:06 -0400
| Newsgroups | gmane.comp.java.jsr.166-concurrency |
|---|---|
| Message-ID | <CAEvq2noqiHLu0eE-bFbP3gf6FBdd0c6=5Hg4jGrsxzJ4E98s0w@mail.gmail.com> |
Additional info:
We have worked around
<https://github.com/google/guava/commit/da93601899485518956c211e81017833071838b9>
the immediate TSAN failure.
Unfortunately, I don't have a test case packed up for you to run. What I
have is entangled with Google infrastructure (which is different from some
JDK infrastructure Martin discussed last year
<https://bugs.openjdk.java.net/browse/JDK-8232642?focusedCommentId=14295054&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-14295054>
).
But here is the code I've been running and a TSAN failure report. (TSAN
gives an error maybe about half the time I run the test.) The report comes
from a run against the "refresh" ForkJoinPool.
Again, the failure is a TSAN failure only: I haven't been able to see a
stale value in practice, so my assertFalse check is always succeeding.
package com.google.common;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertFalse;
import java.util.concurrent.ForkJoinPool;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class ForkJoinPoolTsanTest {
@Test
public void testHandoff() throws Exception {
ForkJoinPool service = new ForkJoinPool();
boolean[] failed = new boolean[1];
for (int j = 0; j < 5; j++) {
service.execute(new Job(failed));
}
service.shutdown();
service.awaitTermination(10, SECONDS);
assertFalse(failed[0]);
}
private static final class Job implements Runnable {
final boolean[] failed;
boolean b = true;
Job(boolean[] failed) {
this.failed = failed;
}
@Override
public void run() {
if (!b) {
failed[0] = true;
}
}
}
}
Read of size 1 at 0x0000cf6f8d54 by thread T18:
#0 com.google.common.ForkJoinPoolTsanTest$Job.run()V
ForkJoinPoolTsanTest.java:35
#1 java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec()Z
ForkJoinTask.java:1341
#2 java.util.concurrent.ForkJoinTask.doExec()I ForkJoinTask.java:435
#3
java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V
ForkJoinPool.java:1128
#4
java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I
ForkJoinPool.java:1598
#5
java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V
ForkJoinPool.java:1565
#6 java.util.concurrent.ForkJoinWorkerThread.run()V
ForkJoinWorkerThread.java:138
Previous write of size 1 at 0x0000cf6f8d54 by thread T5:
#0 com.google.common.ForkJoinPoolTsanTest$Job.<init>([Z)V
ForkJoinPoolTsanTest.java:27
#1 com.google.common.ForkJoinPoolTsanTest.testHandoff()V
ForkJoinPoolTsanTest.java:18
Thread T18 (tid=661, running) created by thread T5 at:
#0 pthread_create
third_party/llvm/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:965:3
(4766092b7397d478e6abfb6f139c4adc84ae7e74c64c75064c31eca5ef3d4346_02000308b290+0x36b82a)
#1 os::create_thread(Thread*, os::ThreadType, unsigned long) <null>
(libjvm.so+0x1148e95)
#2 java.lang.Thread.start()V Thread.java:803
#3 java.util.concurrent.ForkJoinPool.createWorker()Z
ForkJoinPool.java:1408
#4 java.util.concurrent.ForkJoinPool.signalWork()V ForkJoinPool.java:1531
#5
java.util.concurrent.ForkJoinPool.externalPush(Ljava/util/concurrent/ForkJoinTask;)V
ForkJoinPool.java:2128
#6
java.util.concurrent.ForkJoinPool.externalSubmit(Ljava/util/concurrent/ForkJoinTask;)Ljava/util/concurrent/ForkJoinTask;
ForkJoinPool.java:2143
#7 java.util.concurrent.ForkJoinPool.execute(Ljava/lang/Runnable;)V
ForkJoinPool.java:2587
#8 com.google.common.ForkJoinPoolTsanTest.testHandoff()V
ForkJoinPoolTsanTest.java:18
_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest