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));
+ }
}