Possible Data Race detected by TSAN (original) (raw)
TSAN reported the following data race.
WARNING: ThreadSanitizer: data race (pid=4522) Read of size 4 at 0x0000bedf0004 by thread T41: #0 com.github.benmanes.caffeine.cache.References$WeakValueReference.getKeyReference()Ljava/lang/Object; References.java:267 #1 com.github.benmanes.caffeine.cache.PW.getKeyReference()Ljava/lang/Object; PW.java:62 #2 com.github.benmanes.caffeine.cache.BoundedLocalCache.evictEntry(Lcom/github/benmanes/caffeine/cache/Node;Lcom/github/benmanes/caffeine/cache/RemovalCause;J)Z BoundedLocalCache.java:1032 #3 com.github.benmanes.caffeine.cache.BoundedLocalCache.drainValueReferences()V BoundedLocalCache.java:1763 #4 com.github.benmanes.caffeine.cache.BoundedLocalCache.maintenance(Ljava/lang/Runnable;)V BoundedLocalCache.java:1722 #5 com.github.benmanes.caffeine.cache.BoundedLocalCache.performCleanUp(Ljava/lang/Runnable;)V BoundedLocalCache.java:1662 #6 com.github.benmanes.caffeine.cache.BoundedLocalCache$PerformCleanupTask.run()V BoundedLocalCache.java:3893 #7 com.github.benmanes.caffeine.cache.BoundedLocalCache$PerformCleanupTask.exec()Z BoundedLocalCache.java:3880 #8 java.util.concurrent.ForkJoinTask.doExec()I ForkJoinTask.java:387 #9 java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V ForkJoinPool.java:1312 #10 java.util.concurrent.ForkJoinPool.scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;II)I ForkJoinPool.java:1843 #11 java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V ForkJoinPool.java:1808 #12 java.util.concurrent.ForkJoinWorkerThread.run()V ForkJoinWorkerThread.java:188 #13 (Generated Stub)
Previous write of size 4 at 0x0000bedf0004 by thread T101 (mutexes: write M0): #0 com.github.benmanes.caffeine.cache.References$WeakValueReference.(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V References.java:262 #1 com.github.benmanes.caffeine.cache.PW.setValue(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V PW.java:86 #2 com.github.benmanes.caffeine.cache.BoundedLocalCache.put(Ljava/lang/Object;Ljava/lang/Object;Lcom/github/benmanes/caffeine/cache/Expiry;Z)Ljava/lang/Object; BoundedLocalCache.java:2399 #3 com.github.benmanes.caffeine.cache.BoundedLocalCache.putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; BoundedLocalCache.java:2285
Using getOpaque in com.github.benmanes.caffeine.cache.node.AddKey.addIfCollectedValue instead of plain get fixes our TSAN build.
Let me know what you think.