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