BewareMyPower commented on a change in pull request #8244:
URL: https://github.com/apache/pulsar/pull/8244#discussion_r506789940



##########
File path: 
pulsar-broker/src/main/java/org/apache/pulsar/PulsarClusterMetadataTeardown.java
##########
@@ -107,5 +128,86 @@ public static void deleteZkNodeRecursively(ZooKeeper 
zooKeeper, String path) thr
         }
     }
 
+    private static List<String> getChildren(ZooKeeper zooKeeper, String path) {
+        try {
+            return zooKeeper.getChildren(path, null);
+        } catch (InterruptedException | KeeperException e) {
+            log.error("Failed to get children of {}: {}", path, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static byte[] getData(ZooKeeper zooKeeper, String path) {
+        try {
+            return zooKeeper.getData(path, null, null);
+        } catch (KeeperException | InterruptedException e) {
+            log.error("Failed to get data from {}: {}", path, e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static void deleteLedger(BookKeeper bookKeeper, long ledgerId) {
+        try {
+            bookKeeper.deleteLedger(ledgerId);
+            log.debug("Delete ledger id: {}", ledgerId);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        } catch (BKException e) {
+            log.warn("Failed to delete ledger {}: {}", ledgerId, e);
+        }
+    }
+
+    private static void deleteManagedLedgers(ZooKeeper zooKeeper, BookKeeper 
bookKeeper) {
+        final String managedLedgersRoot = "/managed-ledgers";
+        getChildren(zooKeeper, managedLedgersRoot).forEach(tenant -> {
+            final String tenantRoot = managedLedgersRoot + "/" + tenant;
+            getChildren(zooKeeper, tenantRoot).forEach(namespace -> {
+                final String namespaceRoot = String.join("/", tenantRoot, 
namespace, "persistent");
+                getChildren(zooKeeper, namespaceRoot).forEach(topic -> {
+                    final String topicRoot = namespaceRoot + "/" + topic;
+                    byte[] topicData = getData(zooKeeper, topicRoot);
+                    try {
+                        
ManagedLedgerInfo.parseFrom(topicData).getLedgerInfoList().stream()
+                                .map(ManagedLedgerInfo.LedgerInfo::getLedgerId)
+                                .forEach(ledgerId -> deleteLedger(bookKeeper, 
ledgerId));
+
+                        getChildren(zooKeeper, 
topicRoot).stream().map(subscription -> {
+                            final String subscriptionRoot = topicRoot + "/" + 
subscription;
+                            try {
+                                return 
ManagedCursorInfo.parseFrom(getData(zooKeeper, 
subscriptionRoot)).getCursorsLedgerId();
+                            } catch (InvalidProtocolBufferException e) {
+                                log.warn("Invalid data format from {}: {}", 
subscriptionRoot, e);
+                                return -1L;

Review comment:
       From the comment after this `try-catch` block, I noted that some valid 
cursor ledger id could also be -1, so I return -1L here to simplify the filter 
logic from `filter(ledgerId -> (ledgerId != null && ledgerId >= 0))` to 
`filter(ledgerId -> ledgerId >= 0)`. But somehow I deleted the `filter` 
sentence, maybe it's during one refactor. it's my fault, I'll add `filter` here 
and still returns -1L in `catch` block. Or should still return `null`?




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

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


Reply via email to