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

mmerli 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 e0ee708269 Support update ledger metadata option bk-cli (#3821)
e0ee708269 is described below

commit e0ee70826974dd02c24133565bb1d81c30a753f1
Author: Rajan Dhabalia <[email protected]>
AuthorDate: Mon Feb 27 16:46:36 2023 -0800

    Support update ledger metadata option bk-cli (#3821)
---
 .../java/org/apache/bookkeeper/bookie/BookieShell.java   |  2 ++
 .../tools/cli/commands/client/LedgerMetaDataCommand.java | 16 +++++++++++++++-
 .../cli/commands/client/LedgerMetaDataCommandTest.java   | 13 +++++++++++++
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
index f3aaa13027..15e1fc6f05 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
@@ -805,6 +805,7 @@ public class BookieShell implements Tool {
             opts.addOption("l", "ledgerid", true, "Ledger ID");
             opts.addOption("dumptofile", true, "Dump metadata for ledger, to a 
file");
             opts.addOption("restorefromfile", true, "Restore metadata for 
ledger, from a file");
+            opts.addOption("update", false, "Update metadata if ledger already 
exist");
         }
 
         @Override
@@ -827,6 +828,7 @@ public class BookieShell implements Tool {
             if (cmdLine.hasOption("restorefromfile")) {
                 
flag.restoreFromFile(cmdLine.getOptionValue("restorefromfile"));
             }
+            flag.update(cmdLine.hasOption("update"));
 
             LedgerMetaDataCommand cmd = new 
LedgerMetaDataCommand(ledgerIdFormatter);
             cmd.apply(bkConf, flag);
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java
index 324bc1d4dd..ae06a67fd1 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommand.java
@@ -29,6 +29,7 @@ import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.apache.bookkeeper.client.BKException.BKLedgerExistException;
 import org.apache.bookkeeper.client.api.LedgerMetadata;
 import org.apache.bookkeeper.conf.ServerConfiguration;
 import org.apache.bookkeeper.meta.LedgerManager;
@@ -38,6 +39,7 @@ import org.apache.bookkeeper.tools.cli.helpers.BookieCommand;
 import org.apache.bookkeeper.tools.framework.CliFlags;
 import org.apache.bookkeeper.tools.framework.CliSpec;
 import org.apache.bookkeeper.util.LedgerIdFormatter;
+import org.apache.bookkeeper.versioning.LongVersion;
 import org.apache.bookkeeper.versioning.Versioned;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -92,6 +94,10 @@ public class LedgerMetaDataCommand extends 
BookieCommand<LedgerMetaDataCommand.L
 
         @Parameter(names =  {"-lf", "--ledgeridformatter"}, description = "Set 
ledger id formatter")
         private String ledgerIdFormatter = DEFAULT;
+
+        @Parameter(names = { "-u",
+                "--update" }, description = "Update metadata if already exist 
while restoring metadata")
+        private boolean update = false;
     }
 
     @Override
@@ -124,7 +130,15 @@ public class LedgerMetaDataCommand extends 
BookieCommand<LedgerMetaDataCommand.L
                     byte[] serialized = Files.readAllBytes(
                         
FileSystems.getDefault().getPath(flag.restoreFromFile));
                     LedgerMetadata md = serDe.parseConfig(serialized, 
flag.ledgerId, Optional.empty());
-                    m.createLedgerMetadata(flag.ledgerId, md).join();
+                    try {
+                        m.createLedgerMetadata(flag.ledgerId, md).join();
+                    } catch (Exception be) {
+                        if (!flag.update || !(be.getCause() instanceof 
BKLedgerExistException)) {
+                            throw be;
+                        }
+                        m.writeLedgerMetadata(flag.ledgerId, md, new 
LongVersion(-1L)).join();
+                        LOG.info("successsfully updated ledger metadata {}", 
flag.ledgerId);
+                    }
                 } else {
                     printLedgerMetadata(flag.ledgerId, 
m.readLedgerMetadata(flag.ledgerId).get().getValue(), true);
                 }
diff --git 
a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommandTest.java
 
b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommandTest.java
index da6e03f7de..5d0eee5a34 100644
--- 
a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommandTest.java
+++ 
b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/client/LedgerMetaDataCommandTest.java
@@ -30,7 +30,9 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import org.apache.bookkeeper.client.BKException.BKLedgerExistException;
 import org.apache.bookkeeper.client.api.LedgerMetadata;
+import org.apache.bookkeeper.common.concurrent.FutureUtils;
 import org.apache.bookkeeper.meta.LedgerManager;
 import org.apache.bookkeeper.meta.LedgerManagerFactory;
 import org.apache.bookkeeper.meta.LedgerMetadataSerDe;
@@ -79,6 +81,7 @@ public class LedgerMetaDataCommandTest extends 
BookieCommandTestBase {
         });
 
         when(ledgerManager.createLedgerMetadata(anyLong(), 
eq(ledgerMetadata))).thenReturn(future);
+        when(ledgerManager.writeLedgerMetadata(anyLong(), eq(ledgerMetadata), 
any())).thenReturn(future);
     }
 
     @Test
@@ -112,4 +115,14 @@ public class LedgerMetaDataCommandTest extends 
BookieCommandTestBase {
         verify(ledgerManager, times(1)).readLedgerMetadata(anyLong());
     }
 
+    @Test
+    public void testWithRestoreFromFileWithExistingLedger() throws IOException 
{
+        when(ledgerManager.createLedgerMetadata(anyLong(), any()))
+                .thenReturn(FutureUtils.exception(new 
BKLedgerExistException()));
+        File file = testDir.newFile("testrestore");
+        LedgerMetaDataCommand cmd = new LedgerMetaDataCommand();
+        Assert.assertTrue(cmd.apply(bkFlags, new String[] { "-l", "1", "-u", 
"-r", file.getAbsolutePath() }));
+
+        verify(ledgerManager, times(1)).createLedgerMetadata(anyLong(), 
any(LedgerMetadata.class));
+    }
 }

Reply via email to