You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@bookkeeper.apache.org by GitBox <gi...@apache.org> on 2018/12/04 11:03:16 UTC
[GitHub] ivankelly closed pull request #1858: Add max ledger metadata format
version to layout
ivankelly closed pull request #1858: Add max ledger metadata format version to layout
URL: https://github.com/apache/bookkeeper/pull/1858
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
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 9108ef36d2..9c6180b63e 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
@@ -1106,7 +1106,7 @@ Options getOptions() {
void printLedgerMetadata(long ledgerId, LedgerMetadata md, boolean printMeta) {
System.out.println("ledgerID: " + ledgerIdFormatter.formatLedgerId(ledgerId));
if (printMeta) {
- System.out.println(new String(new LedgerMetadataSerDe().serialize(md), UTF_8));
+ System.out.println(md.toString());
}
}
@@ -1115,7 +1115,10 @@ void printLedgerMetadata(long ledgerId, LedgerMetadata md, boolean printMeta) {
*/
class LedgerMetadataCmd extends MyCommand {
Options lOpts = new Options();
- LedgerMetadataSerDe serDe = new LedgerMetadataSerDe();
+ // the max version won't actually take effect as this tool
+ // never creates new metadata (there'll already be a format version in the existing metadata)
+ LedgerMetadataSerDe serDe = new LedgerMetadataSerDe(
+ LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION);
LedgerMetadataCmd() {
super(CMD_LEDGERMETADATA);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/AbstractConfiguration.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/AbstractConfiguration.java
index 7f00d09adb..3057bfe65b 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/AbstractConfiguration.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/AbstractConfiguration.java
@@ -85,6 +85,7 @@
protected static final String STORE_SYSTEMTIME_AS_LEDGER_UNDERREPLICATED_MARK_TIME =
"storeSystemTimeAsLedgerUnderreplicatedMarkTime";
protected static final String STORE_SYSTEMTIME_AS_LEDGER_CREATION_TIME = "storeSystemTimeAsLedgerCreationTime";
+ protected static final String MAX_LEDGER_METADATA_FORMAT_VERSION = "maxLedgerMetadataFormatVersion";
// Metastore settings, only being used when LEDGER_MANAGER_FACTORY_CLASS is MSLedgerManagerFactory
protected static final String METASTORE_IMPL_CLASS = "metastoreImplClass";
@@ -855,6 +856,29 @@ public boolean getStoreSystemTimeAsLedgerUnderreplicatedMarkTime() {
return getBoolean(STORE_SYSTEMTIME_AS_LEDGER_UNDERREPLICATED_MARK_TIME, true);
}
+ /**
+ * Set the maximum format version which should be used when serializing ledger metadata.
+ * Setting the maximum format allows us to ensure that all clients running against a cluster
+ * will be able to read back all written metadata.
+ * Normally this is set when loading the layout from the metadata store. Users should not
+ * set this directly.
+ */
+ public T setMaxLedgerMetadataFormatVersion(int maxVersion) {
+ setProperty(MAX_LEDGER_METADATA_FORMAT_VERSION, maxVersion);
+ return getThis();
+ }
+
+ /**
+ * Get the maximum format version which should be used when serializing ledger metadata.
+ * The default is 2, as that was the current version when this functionallity was introduced.
+ *
+ * @see #setMaxLedgerMetadataFormatVersion(int)
+ * @return the maximum format version with which to serialize metadata.
+ */
+ public int getMaxLedgerMetadataFormatVersion() {
+ return getInteger(MAX_LEDGER_METADATA_FORMAT_VERSION, 2);
+ }
+
/**
* Whether to preserve MDC for tasks in Executor.
*
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
index 5dbdd06791..97413b7bff 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
@@ -160,7 +160,7 @@ private void handleMetadata(Versioned<LedgerMetadata> result, Throwable exceptio
* ZooKeeper Client Handle
*/
protected AbstractZkLedgerManager(AbstractConfiguration conf, ZooKeeper zk) {
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(conf.getMaxLedgerMetadataFormatVersion());
this.conf = conf;
this.zk = zk;
this.ledgerRootPath = ZKMetadataDriverBase.resolveZkLedgersRootPath(conf);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerFactory.java
index 72bc3e841e..4bb2fb141d 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerFactory.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerFactory.java
@@ -178,6 +178,7 @@ public static LedgerManagerFactory newLedgerManagerFactory(
if (log.isDebugEnabled()) {
log.debug("read ledger layout {}", layout);
}
+ conf.setMaxLedgerMetadataFormatVersion(layout.getMaxLedgerMetadataFormatVersion());
// there is existing layout, we need to look into the layout.
// handle pre V2 layout
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerLayout.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerLayout.java
index eb5b705c16..c39e6b6fea 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerLayout.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerLayout.java
@@ -39,8 +39,14 @@
// version of ledger layout metadata
public static final int LAYOUT_FORMAT_VERSION = 2;
- private static final String splitter = ":";
- private static final String lSplitter = "\n";
+ private static final String FIELD_SPLITTER = ":";
+ private static final String LINE_SPLITTER = "\n";
+
+ // For version 2 and below, max ledger metadata format wasn't stored in the layout
+ // so assume 2 if it is missing.
+ private static final int DEFAULT_MAX_LEDGER_METADATA_FORMAT_VERSION = 2;
+ private static final String MAX_LEDGER_METADATA_FORMAT_VERSION_FIELD =
+ "MAX_LEDGER_METADATA_FORMAT_VERSION";
// ledger manager factory class
private final String managerFactoryClass;
@@ -50,6 +56,9 @@
// layout version of how to store layout information
private final int layoutFormatVersion;
+ // maximum format version that can be used for storing ledger metadata
+ private final int maxLedgerMetadataFormatVersion;
+
/**
* Ledger Layout Constructor.
*
@@ -59,13 +68,17 @@
* Ledger Manager Version
*/
public LedgerLayout(String managerFactoryCls, int managerVersion) {
- this(managerFactoryCls, managerVersion, LAYOUT_FORMAT_VERSION);
+ this(managerFactoryCls, managerVersion,
+ LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION,
+ LAYOUT_FORMAT_VERSION);
}
LedgerLayout(String managerFactoryCls, int managerVersion,
+ int maxLedgerMetadataFormatVersion,
int layoutVersion) {
this.managerFactoryClass = managerFactoryCls;
this.managerVersion = managerVersion;
+ this.maxLedgerMetadataFormatVersion = maxLedgerMetadataFormatVersion;
this.layoutFormatVersion = layoutVersion;
}
@@ -76,8 +89,11 @@ public LedgerLayout(String managerFactoryCls, int managerVersion) {
*/
public byte[] serialize() throws IOException {
String s =
- new StringBuilder().append(layoutFormatVersion).append(lSplitter)
- .append(managerFactoryClass).append(splitter).append(managerVersion).toString();
+ new StringBuilder().append(layoutFormatVersion).append(LINE_SPLITTER)
+ .append(managerFactoryClass).append(FIELD_SPLITTER).append(managerVersion).append(LINE_SPLITTER)
+ .append(MAX_LEDGER_METADATA_FORMAT_VERSION_FIELD).append(FIELD_SPLITTER)
+ .append(maxLedgerMetadataFormatVersion)
+ .toString();
if (log.isDebugEnabled()) {
log.debug("Serialized layout info: {}", s);
@@ -100,7 +116,7 @@ public static LedgerLayout parseLayout(byte[] bytes) throws IOException {
log.debug("Parsing Layout: {}", layout);
}
- String lines[] = layout.split(lSplitter);
+ String lines[] = layout.split(LINE_SPLITTER);
try {
int layoutFormatVersion = Integer.parseInt(lines[0]);
@@ -113,7 +129,7 @@ public static LedgerLayout parseLayout(byte[] bytes) throws IOException {
throw new IOException("Ledger manager and its version absent from layout: " + layout);
}
- String[] parts = lines[1].split(splitter);
+ String[] parts = lines[1].split(FIELD_SPLITTER);
if (parts.length != 2) {
throw new IOException("Invalid Ledger Manager defined in layout : " + layout);
}
@@ -121,7 +137,18 @@ public static LedgerLayout parseLayout(byte[] bytes) throws IOException {
String managerFactoryCls = parts[0];
// ledger manager version
int managerVersion = Integer.parseInt(parts[1]);
- return new LedgerLayout(managerFactoryCls, managerVersion, layoutFormatVersion);
+
+ int maxLedgerMetadataFormatVersion = DEFAULT_MAX_LEDGER_METADATA_FORMAT_VERSION;
+ if (lines.length >= 3) {
+ String[] metadataFormatParts = lines[2].split(FIELD_SPLITTER);
+ if (metadataFormatParts.length != 2
+ || !metadataFormatParts[0].equals(MAX_LEDGER_METADATA_FORMAT_VERSION_FIELD)) {
+ throw new IOException("Invalid field for max ledger metadata format:" + lines[2]);
+ }
+ maxLedgerMetadataFormatVersion = Integer.parseInt(metadataFormatParts[1]);
+ }
+ return new LedgerLayout(managerFactoryCls, managerVersion,
+ maxLedgerMetadataFormatVersion, layoutFormatVersion);
} catch (NumberFormatException e) {
throw new IOException("Could not parse layout '" + layout + "'", e);
}
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
index 6020a3bf4f..4653af4f30 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerMetadataSerDe.java
@@ -63,6 +63,12 @@
private static final String V1_CLOSED_TAG = "CLOSED";
private static final int V1_IN_RECOVERY_ENTRY_ID = -102;
+ private final int maxLedgerMetadataFormatVersion;
+
+ public LedgerMetadataSerDe(int maxLedgerMetadataFormatVersion) {
+ this.maxLedgerMetadataFormatVersion = maxLedgerMetadataFormatVersion;
+ }
+
public byte[] serialize(LedgerMetadata metadata) {
if (metadata.getMetadataFormatVersion() == 1) {
return serializeVersion1(metadata);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
index fc87632445..38c6816dd6 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
@@ -284,7 +284,7 @@ private void handleMetadata(Versioned<LedgerMetadata> metadata, Throwable except
this.conf = conf;
this.zk = zk;
this.metastore = metastore;
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(conf.getMaxLedgerMetadataFormatVersion());
try {
ledgerTable = metastore.createScannableTable(TABLE_NAME);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java
index 7fcaeda810..537b50ce46 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/GetLedgerMetaService.java
@@ -53,7 +53,7 @@ public GetLedgerMetaService(ServerConfiguration conf, BookieServer bookieServer)
checkNotNull(conf);
this.conf = conf;
this.bookieServer = bookieServer;
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION);
}
@Override
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java
index f553b6431b..13022e4f2d 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/http/service/ListLedgerService.java
@@ -58,7 +58,7 @@ public ListLedgerService(ServerConfiguration conf, BookieServer bookieServer) {
checkNotNull(conf);
this.conf = conf;
this.bookieServer = bookieServer;
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION);
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerMetadataTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerMetadataTest.java
index a9ffc2d422..d9141e6461 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerMetadataTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/LedgerMetadataTest.java
@@ -80,7 +80,8 @@ public void testStoreSystemtimeAsLedgerCtimeEnabled()
.withCreationTime(System.currentTimeMillis())
.storingCreationTime(true)
.build();
- LedgerMetadataFormat format = new LedgerMetadataSerDe().buildProtoFormat(lm);
+ LedgerMetadataFormat format = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION)
+ .buildProtoFormat(lm);
assertTrue(format.hasCtime());
}
@@ -94,7 +95,8 @@ public void testStoreSystemtimeAsLedgerCtimeDisabled()
LedgerMetadata lm = LedgerMetadataBuilder.create()
.newEnsembleEntry(0L, ensemble).build();
- LedgerMetadataFormat format = new LedgerMetadataSerDe().buildProtoFormat(lm);
+ LedgerMetadataFormat format = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION)
+ .buildProtoFormat(lm);
assertFalse(format.hasCtime());
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
index 37f55b3e6e..20a8d5134a 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
@@ -142,7 +142,7 @@ public void setup() throws Exception {
assertSame(conf, ledgerManager.conf);
assertSame(scheduler, ledgerManager.scheduler);
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION);
}
@After
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/MockLedgerManager.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/MockLedgerManager.java
index 398bb07d71..a73adeb4ee 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/MockLedgerManager.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/MockLedgerManager.java
@@ -72,7 +72,7 @@ private MockLedgerManager(Map<Long, Pair<LongVersion, byte[]>> metadataMap,
this.metadataMap = metadataMap;
this.executor = executor;
this.ownsExecutor = ownsExecutor;
- this.serDe = new LedgerMetadataSerDe();
+ this.serDe = new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION);
}
public MockLedgerManager newClient() {
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerLayout.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerLayout.java
index 62315fe2e8..16b30bdf07 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerLayout.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/TestLedgerLayout.java
@@ -18,8 +18,12 @@
*/
package org.apache.bookkeeper.meta;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
import org.junit.Test;
@@ -63,4 +67,43 @@ public void testGetters() {
hierarchical1.getLayoutFormatVersion());
}
+ @Test
+ public void testParseNoMaxLedgerMetadataFormatVersion() throws Exception {
+ LedgerLayout layout = LedgerLayout.parseLayout("1\nblahblahLM:3".getBytes(UTF_8));
+
+ assertEquals(layout.getMaxLedgerMetadataFormatVersion(), 2);
+ }
+
+ @Test
+ public void testParseWithMaxLedgerMetadataFormatVersion() throws Exception {
+ LedgerLayout layout = LedgerLayout.parseLayout(
+ "1\nblahblahLM:3\nMAX_LEDGER_METADATA_FORMAT_VERSION:123".getBytes(UTF_8));
+
+ assertEquals(layout.getMaxLedgerMetadataFormatVersion(), 123);
+ }
+
+ @Test
+ public void testCorruptMaxLedgerLayout() throws Exception {
+ try {
+ LedgerLayout.parseLayout("1\nblahblahLM:3\nMAXXX_LEDGER_METADATA_FORMAT_VERSION:123".getBytes(UTF_8));
+ fail("Shouldn't have been able to parse");
+ } catch (IOException ioe) {
+ // expected
+ }
+
+ try {
+ LedgerLayout.parseLayout("1\nblahblahLM:3\nMAXXX_LEDGER_METADATA_FORMAT_VERSION:blah".getBytes(UTF_8));
+ fail("Shouldn't have been able to parse");
+ } catch (IOException ioe) {
+ // expected
+ }
+ }
+
+ @Test
+ public void testMoreFieldsAdded() throws Exception {
+ LedgerLayout layout = LedgerLayout.parseLayout(
+ "1\nblahblahLM:3\nMAX_LEDGER_METADATA_FORMAT_VERSION:123\nFOO:BAR".getBytes(UTF_8));
+
+ assertEquals(layout.getMaxLedgerMetadataFormatVersion(), 123);
+ }
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java
index c4d441dbe8..e88d29d3a6 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/http/TestHttpService.java
@@ -387,7 +387,8 @@ public void testGetLedgerMetaService() throws Exception {
assertEquals(1, respBody.size());
// verify LedgerMetadata content is equal
assertTrue(respBody.get(ledgerId.toString()).toString()
- .equals(new String(new LedgerMetadataSerDe().serialize(lh[0].getLedgerMetadata()))));
+ .equals(new String(new LedgerMetadataSerDe(LedgerMetadataSerDe.CURRENT_METADATA_FORMAT_VERSION)
+ .serialize(lh[0].getLedgerMetadata()))));
}
@Test
diff --git a/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManager.java b/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManager.java
index d571bf8057..e20a9ba146 100644
--- a/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManager.java
+++ b/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManager.java
@@ -45,6 +45,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.bookkeeper.client.BKException;
import org.apache.bookkeeper.client.api.LedgerMetadata;
+import org.apache.bookkeeper.conf.AbstractConfiguration;
import org.apache.bookkeeper.meta.LedgerManager;
import org.apache.bookkeeper.meta.LedgerMetadataSerDe;
import org.apache.bookkeeper.metadata.etcd.helpers.KeyIterator;
@@ -64,19 +65,8 @@
@Slf4j
class EtcdLedgerManager implements LedgerManager {
- private final LedgerMetadataSerDe serDe = new LedgerMetadataSerDe();
- private final Function<ByteSequence, LedgerMetadata> ledgerMetadataFunction = bs -> {
- try {
- return serDe.parseConfig(
- bs.getBytes(),
- Optional.empty()
- );
- } catch (IOException ioe) {
- log.error("Could not parse ledger metadata : {}", bs.toStringUtf8(), ioe);
- throw new RuntimeException(
- "Could not parse ledger metadata : " + bs.toStringUtf8(), ioe);
- }
- };
+ private final LedgerMetadataSerDe serDe;
+ private final Function<ByteSequence, LedgerMetadata> ledgerMetadataFunction;
private final String scope;
private final Client client;
@@ -89,12 +79,24 @@
private volatile boolean closed = false;
- EtcdLedgerManager(Client client,
+ EtcdLedgerManager(AbstractConfiguration conf,
+ Client client,
String scope) {
this.client = client;
this.kvClient = client.getKVClient();
this.scope = scope;
this.watchClient = new EtcdWatchClient(client);
+ this.serDe = new LedgerMetadataSerDe(conf.getMaxLedgerMetadataFormatVersion());
+
+ this.ledgerMetadataFunction = bs -> {
+ try {
+ return serDe.parseConfig(bs.getBytes(), Optional.empty());
+ } catch (IOException ioe) {
+ log.error("Could not parse ledger metadata : {}", bs.toStringUtf8(), ioe);
+ throw new RuntimeException(
+ "Could not parse ledger metadata : " + bs.toStringUtf8(), ioe);
+ }
+ };
}
private boolean isClosed() {
diff --git a/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerFactory.java b/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerFactory.java
index dc7d1517b2..9c19df07dd 100644
--- a/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerFactory.java
+++ b/metadata-drivers/etcd/src/main/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerFactory.java
@@ -42,6 +42,7 @@
private String scope;
private Client client;
+ private AbstractConfiguration conf;
@Override
public int getCurrentVersion() {
@@ -66,6 +67,7 @@ public LedgerManagerFactory initialize(AbstractConfiguration conf,
throw new IOException("Invalid metadata service uri", e);
}
this.client = etcdLayoutManager.getClient();
+ this.conf = conf;
return this;
}
@@ -82,7 +84,7 @@ public LedgerIdGenerator newLedgerIdGenerator() {
@Override
public LedgerManager newLedgerManager() {
- return new EtcdLedgerManager(client, scope);
+ return new EtcdLedgerManager(conf, client, scope);
}
@Override
diff --git a/metadata-drivers/etcd/src/test/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerTest.java b/metadata-drivers/etcd/src/test/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerTest.java
index 984224c6b8..27dc84c24a 100644
--- a/metadata-drivers/etcd/src/test/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerTest.java
+++ b/metadata-drivers/etcd/src/test/java/org/apache/bookkeeper/metadata/etcd/EtcdLedgerManagerTest.java
@@ -53,6 +53,7 @@
import org.apache.bookkeeper.client.LedgerMetadataBuilder;
import org.apache.bookkeeper.client.api.LedgerMetadata;
import org.apache.bookkeeper.common.concurrent.FutureUtils;
+import org.apache.bookkeeper.conf.ClientConfiguration;
import org.apache.bookkeeper.meta.LedgerManager.LedgerRange;
import org.apache.bookkeeper.meta.LedgerManager.LedgerRangeIterator;
import org.apache.bookkeeper.metadata.etcd.helpers.ValueStream;
@@ -81,7 +82,7 @@
public void setUp() throws Exception {
super.setUp();
this.scope = RandomStringUtils.randomAlphabetic(8);
- this.lm = new EtcdLedgerManager(etcdClient, scope);
+ this.lm = new EtcdLedgerManager(new ClientConfiguration(), etcdClient, scope);
}
@Override
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services