ivankelly commented on a change in pull request #1580: (@bug W-5100764@) Write 
Ledger Handle listens for metadata changes
URL: https://github.com/apache/bookkeeper/pull/1580#discussion_r211164117
 
 

 ##########
 File path: 
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java
 ##########
 @@ -2382,4 +2387,60 @@ public void closeComplete(int rc, LedgerHandle lh, 
Object ctx) {
         }
     }
 
+    class MetadataMerger extends SafeRunnable {
+
+        final LedgerMetadata m;
+
+        MetadataMerger(LedgerMetadata metadata) {
+            this.m = metadata;
+        }
+
+        @Override
+        public void safeRun() {
+            Version.Occurred occurred =
+                    
LedgerHandle.this.metadata.getVersion().compare(this.m.getVersion());
+            if (Version.Occurred.BEFORE == occurred) {
+                LOG.info("Updated ledger metadata for ledger {} to {}.", 
ledgerId, this.m.toSafeString());
+                synchronized (LedgerHandle.this) {
+                    LedgerHandle.this.metadata.setVersion(m.getVersion());
+                    
LedgerHandle.this.metadata.mergeEnsembles(m.getEnsembles());
+                }
+            }
+        }
+
+        @Override
+        public String toString() {
+            return String.format("MetadataMerger(%d)", ledgerId);
+        }
+    }
+
+    @Override
+    public void onChanged(long ledgerId, LedgerMetadata newMetadata) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Received ledger metadata update on writeHandle {} : {}",
+                    ledgerId, newMetadata);
+        }
+        if (this.ledgerId != ledgerId) {
+            // Ignore
+            return;
+        }
+        if (null == newMetadata) {
+            // Ignore
+            return;
+        }
+        Version.Occurred occurred =
+                this.metadata.getVersion().compare(newMetadata.getVersion());
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Try to merge metadata from {} to {} : {}",
+                    this.metadata, newMetadata, occurred);
+        }
+        if (Version.Occurred.BEFORE == occurred) { // the metadata is updated
+            try {
+                bk.getMainWorkerPool().executeOrdered(ledgerId, new 
MetadataMerger(newMetadata));
 
 Review comment:
   @jvrao the stack is blocked, waiting on #1589, but otherwise the change is 
pretty much ready.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to