dlg99 commented on code in PR #3365:
URL: https://github.com/apache/bookkeeper/pull/3365#discussion_r911609146


##########
bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java:
##########
@@ -402,6 +402,7 @@ public void registerLedgerMetadataListener(long ledgerId, 
LedgerMetadataListener
                 }
             }
             synchronized (listenerSet) {
+                listenerSet = listeners.computeIfAbsent(ledgerId, k -> new 
HashSet<>());

Review Comment:
   with this
   ```
               Set<LedgerMetadataListener> listenerSet = 
listeners.computeIfAbsent(ledgerId, k -> new HashSet<>());
               synchronized (listenerSet) {
                   listenerSet = listeners.computeIfAbsent(ledgerId, k -> new 
HashSet<>());
                   listenerSet.add(listener);
               }
   ```
   it looks like the codes assume that between two calls of 
`listeners.computeIfAbsent` it may need to create a new instance (listeners can 
be modified/removed concurrently.) 
   
   so you are getting (or creating) one instance to synchronize on, meanwhile, 
listeners change, now synchronize locks on one instance of listenerSet while 
modifying another.
   
   so either the second call to computeIfAbsent is not needed or the locking 
needs to be done differently
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to