You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2018/07/23 18:04:40 UTC

[bookkeeper] branch master updated: ISSUE #1544: [DLOG] ConcurrentModificationException with nonblocking logReader.readNext(true)

This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new ec7fb62  ISSUE #1544: [DLOG] ConcurrentModificationException with nonblocking logReader.readNext(true)
ec7fb62 is described below

commit ec7fb62f025a3b03b42fd92b38bc836515310fad
Author: Sijie Guo <si...@apache.org>
AuthorDate: Mon Jul 23 11:04:33 2018 -0700

    ISSUE #1544: [DLOG] ConcurrentModificationException with nonblocking logReader.readNext(true)
    
    Descriptions of the changes in this PR:
    
    *Motivation*
    
    Fixes #1544. ConcurrentModificationException is thrown when trying to access a non-thread-safe hashmap from different threads.
    
    *Changes*
    
    Make sure accessing to this non-thread-safe hashmap is under synchronized block.
    
    *Tests*
    
    It is a bit tricky to reproduce this race condition in a unit test or an integration test. so not going to attempt adding any tests.
    
    Master Issue: #1544
    
    Author: Sijie Guo <si...@apache.org>
    
    Reviewers: Enrico Olivelli <eo...@gmail.com>, Jia Zhai <None>
    
    This closes #1558 from sijie/issue_1544, closes #1544
---
 .../distributedlog/impl/ZKLogSegmentMetadataStore.java   | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/ZKLogSegmentMetadataStore.java b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/ZKLogSegmentMetadataStore.java
index d78b455..f688f44 100644
--- a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/ZKLogSegmentMetadataStore.java
+++ b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/impl/ZKLogSegmentMetadataStore.java
@@ -476,8 +476,12 @@ public class ZKLogSegmentMetadataStore implements LogSegmentMetadataStore, Watch
             return;
         }
         this.submitTask(logSegmentsPath, () -> {
-            for (LogSegmentNamesListener listener : listeners.keySet()) {
-                listener.onLogStreamDeleted();
+            // the listener map might be updated in different threads (e.g. unregisterLogSegmentListener)
+            // so access it under a synchronization block
+            synchronized (listeners) {
+                for (LogSegmentNamesListener listener : listeners.keySet()) {
+                    listener.onLogStreamDeleted();
+                }
             }
         });
 
@@ -490,8 +494,12 @@ public class ZKLogSegmentMetadataStore implements LogSegmentMetadataStore, Watch
             return;
         }
         this.submitTask(logSegmentsPath, () -> {
-            for (VersionedLogSegmentNamesListener listener : listeners.values()) {
-                listener.onSegmentsUpdated(segments);
+            // the listener map might be updated in different threads (e.g. unregisterLogSegmentListener)
+            // so access it under a synchronization block
+            synchronized (listeners) {
+                for (VersionedLogSegmentNamesListener listener : listeners.values()) {
+                    listener.onSegmentsUpdated(segments);
+                }
             }
         });
     }