Skip to content

Commit

Permalink
Support update ledger metadata option bk-cli
Browse files Browse the repository at this point in the history
  • Loading branch information
rdhabalia committed Feb 27, 2023
1 parent 1e02853 commit 461b69f
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,7 @@ class LedgerMetadataCmd extends MyCommand {
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
Expand All @@ -827,6 +828,7 @@ public int runCmd(CommandLine cmdLine) throws Exception {
if (cmdLine.hasOption("restorefromfile")) {
flag.restoreFromFile(cmdLine.getOptionValue("restorefromfile"));
}
flag.update(cmdLine.hasOption("update"));

LedgerMetaDataCommand cmd = new LedgerMetaDataCommand(ledgerIdFormatter);
cmd.apply(bkConf, flag);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
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;
Expand All @@ -38,6 +39,7 @@
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;
Expand Down Expand Up @@ -92,6 +94,10 @@ public static class LedgerMetadataFlag extends CliFlags {

@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
Expand Down Expand Up @@ -124,7 +130,15 @@ private boolean handler(ServerConfiguration conf, LedgerMetadataFlag flag)
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
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;
Expand Down Expand Up @@ -79,6 +81,7 @@ public void setup() throws Exception {
});

when(ledgerManager.createLedgerMetadata(anyLong(), eq(ledgerMetadata))).thenReturn(future);
when(ledgerManager.writeLedgerMetadata(anyLong(), eq(ledgerMetadata), any())).thenReturn(future);
}

@Test
Expand Down Expand Up @@ -112,4 +115,14 @@ public void testWithoutArgs() {
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));
}
}

0 comments on commit 461b69f

Please sign in to comment.