eolivelli commented on code in PR #17922:
URL: https://github.com/apache/pulsar/pull/17922#discussion_r996295522


##########
pulsar-metadata/src/main/java/org/apache/pulsar/metadata/bookkeeper/PulsarRegistrationClient.java:
##########
@@ -153,4 +212,56 @@ private static Set<BookieId> 
convertToBookieAddresses(List<String> children) {
         }
         return newBookieAddrs;
     }
+
+    @Override
+    public CompletableFuture<Versioned<BookieServiceInfo>> 
getBookieServiceInfo(BookieId bookieId) {
+        // this method cannot perform blocking calls to the MetadataStore
+        // or return a CompletableFuture that is completed on the 
MetadataStore main thread
+        // this is because there are a few cases in which some operations on 
the main thread
+        // wait for the result. This is due to the fact that resolving the 
address of a bookie
+        // is needed in many code paths.
+        Versioned<BookieServiceInfo> resultFromCache = 
bookieServiceInfoCache.get(bookieId);
+        if (log.isDebugEnabled()) {
+            log.debug("getBookieServiceInfo {} -> {}", bookieId, 
resultFromCache);
+        }
+        if (resultFromCache != null) {
+            return CompletableFuture.completedFuture(resultFromCache);
+        } else {
+            return FutureUtils.exception(new 
BKException.BKBookieHandleNotAvailableException());
+        }
+    }
+
+    public CompletableFuture<Versioned<BookieServiceInfo>> 
readBookieServiceInfoAsync(BookieId bookieId) {
+        String asWritable = bookieRegistrationPath + "/" + bookieId;
+        return bookieServiceInfoMetadataCache.get(asWritable)
+                .thenCompose((Optional<BookieServiceInfo> getResult) -> {
+                    if (getResult.isPresent()) {
+                        Versioned<BookieServiceInfo> res =
+                                new Versioned<>(getResult.get(), new 
LongVersion(-1));
+                        log.info("Update BookieInfoCache (writable bookie) {} 
-> {}", bookieId, getResult.get());
+                        bookieServiceInfoCache.put(bookieId, res);
+                        return CompletableFuture.completedFuture(res);
+                    } else {
+                        return readBookieInfoAsReadonlyBookie(bookieId);
+                    }
+                }
+        );
+    }
+
+    final CompletableFuture<Versioned<BookieServiceInfo>> 
readBookieInfoAsReadonlyBookie(BookieId bookieId) {
+        String asReadonly = bookieReadonlyRegistrationPath + "/" + bookieId;
+        return bookieServiceInfoMetadataCache.get(asReadonly)

Review Comment:
   Correct. I did it this way in order to leverage the built in support for 
SerDe of MetadataCache.
   The overhead is not big and it is more elegant.
   I can use raw reads and use the SerDe explicitly if you feel strong 



-- 
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