This is an automated email from the ASF dual-hosted git repository.
sijie 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 acb4e65 Make bookie state manager & registration manager reusable
outside of bookie
acb4e65 is described below
commit acb4e653428f38337af94bcb829956b44e39312d
Author: Sijie Guo <[email protected]>
AuthorDate: Thu May 3 19:09:15 2018 -0700
Make bookie state manager & registration manager reusable outside of bookie
Descriptions of the changes in this PR:
*Motivation*
Since 4.6.0, we have already abstracted a pretty good interfaces around
registration service and state management. Most of the classes can actually be
reused for use cases that have similar service discovery and writable/readonly
state transition management.
*Solution*
The change is try to cleanup `BookieStateManager` and
`ZKRegistrationManager` to make them more generic and can be reused for other
usage.
*Result*
Registration Interfaces and StateManager can be used outside of bookie.
Author: Sijie Guo <[email protected]>
Reviewers: Enrico Olivelli <[email protected]>, Jia Zhai <None>
This closes #1373 from sijie/refactor_bookie_state_manager
---
.../bookkeeper/bookie/BookieStateManager.java | 66 +++++++++++++++-------
.../bookkeeper/discover/ZKRegistrationManager.java | 10 +++-
2 files changed, 53 insertions(+), 23 deletions(-)
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
index de2c797..370e06d 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
@@ -24,15 +24,20 @@ package org.apache.bookkeeper.bookie;
import static org.apache.bookkeeper.bookie.BookKeeperServerStats.SERVER_STATUS;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.io.File;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.net.UnknownHostException;
+import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
import lombok.extern.slf4j.Slf4j;
import org.apache.bookkeeper.conf.ServerConfiguration;
+import org.apache.bookkeeper.discover.RegistrationManager;
import org.apache.bookkeeper.meta.MetadataBookieDriver;
import org.apache.bookkeeper.stats.Gauge;
import org.apache.bookkeeper.stats.NullStatsLogger;
@@ -48,8 +53,7 @@ import org.slf4j.LoggerFactory;
public class BookieStateManager implements StateManager {
private static final Logger LOG =
LoggerFactory.getLogger(BookieStateManager.class);
private final ServerConfiguration conf;
- private final LedgerDirsManager ledgerDirsManager;
-
+ private final List<File> statusDirs;
// use an executor to execute the state changes task
final ExecutorService stateService = Executors.newSingleThreadExecutor(
@@ -67,18 +71,38 @@ public class BookieStateManager implements StateManager {
private final String bookieId;
private ShutdownHandler shutdownHandler;
- private final MetadataBookieDriver metadataDriver;
+ private final Supplier<RegistrationManager> rm;
// Expose Stats
private final StatsLogger statsLogger;
- public BookieStateManager(ServerConfiguration conf, StatsLogger
statsLogger,
- MetadataBookieDriver metadataDriver, LedgerDirsManager
ledgerDirsManager) throws IOException {
+ public BookieStateManager(ServerConfiguration conf,
+ StatsLogger statsLogger,
+ MetadataBookieDriver metadataDriver,
+ LedgerDirsManager ledgerDirsManager) throws
IOException {
+ this(
+ conf,
+ statsLogger,
+ () -> null == metadataDriver ? null :
metadataDriver.getRegistrationManager(),
+ ledgerDirsManager.getAllLedgerDirs(),
+ () -> {
+ try {
+ return Bookie.getBookieAddress(conf).toString();
+ } catch (UnknownHostException e) {
+ throw new UncheckedIOException("Failed to resolve bookie
id", e);
+ }
+ });
+ }
+ public BookieStateManager(ServerConfiguration conf,
+ StatsLogger statsLogger,
+ Supplier<RegistrationManager> rm,
+ List<File> statusDirs,
+ Supplier<String> bookieIdSupplier) throws
IOException {
this.conf = conf;
this.statsLogger = statsLogger;
- this.metadataDriver = metadataDriver;
- this.ledgerDirsManager = ledgerDirsManager;
+ this.rm = rm;
+ this.statusDirs = statusDirs;
// ZK ephemeral node for this Bookie.
- this.bookieId = getMyId();
+ this.bookieId = bookieIdSupplier.get();
// 1 : up, 0 : readonly, -1 : unregistered
statsLogger.registerGauge(SERVER_STATUS, new Gauge<Number>() {
@Override
@@ -99,6 +123,10 @@ public class BookieStateManager implements StateManager {
});
}
+ private boolean isRegistrationManagerDisabled() {
+ return null == rm || null == rm.get();
+ }
+
@VisibleForTesting
BookieStateManager(ServerConfiguration conf, MetadataBookieDriver
metadataDriver) throws IOException {
this(conf, NullStatsLogger.INSTANCE, metadataDriver, new
LedgerDirsManager(conf, conf.getLedgerDirs(),
@@ -111,7 +139,7 @@ public class BookieStateManager implements StateManager {
if (forceReadOnly.get()) {
this.bookieStatus.setToReadOnlyMode();
} else if (conf.isPersistBookieStatusEnabled()) {
-
this.bookieStatus.readFromDirectories(ledgerDirsManager.getAllLedgerDirs());
+ this.bookieStatus.readFromDirectories(statusDirs);
}
running = true;
}
@@ -215,7 +243,7 @@ public class BookieStateManager implements StateManager {
}
private void doRegisterBookie(boolean isReadOnly) throws IOException {
- if (null == metadataDriver) {
+ if (isRegistrationManagerDisabled()) {
// registration manager is null, means not register itself to
metadata store.
LOG.info("null registration manager while do register");
return;
@@ -223,7 +251,7 @@ public class BookieStateManager implements StateManager {
rmRegistered.set(false);
try {
- metadataDriver.getRegistrationManager().registerBookie(bookieId,
isReadOnly);
+ rm.get().registerBookie(bookieId, isReadOnly);
rmRegistered.set(true);
} catch (BookieException e) {
throw new IOException(e);
@@ -242,10 +270,10 @@ public class BookieStateManager implements StateManager {
}
LOG.info("Transitioning Bookie to Writable mode and will serve
read/write requests.");
if (conf.isPersistBookieStatusEnabled()) {
-
bookieStatus.writeToDirectories(ledgerDirsManager.getAllLedgerDirs());
+ bookieStatus.writeToDirectories(statusDirs);
}
// change zookeeper state only when using zookeeper
- if (null == metadataDriver) {
+ if (isRegistrationManagerDisabled()) {
return;
}
try {
@@ -257,7 +285,7 @@ public class BookieStateManager implements StateManager {
}
// clear the readonly state
try {
- metadataDriver.getRegistrationManager().unregisterBookie(bookieId,
true);
+ rm.get().unregisterBookie(bookieId, true);
} catch (BookieException e) {
// if we failed when deleting the readonly flag in zookeeper, it
is OK since client would
// already see the bookie in writable list. so just log the
exception
@@ -286,14 +314,14 @@ public class BookieStateManager implements StateManager {
+ " and will serve only read requests from clients!");
// persist the bookie status if we enable this
if (conf.isPersistBookieStatusEnabled()) {
-
this.bookieStatus.writeToDirectories(ledgerDirsManager.getAllLedgerDirs());
+ this.bookieStatus.writeToDirectories(statusDirs);
}
// change zookeeper state only when using zookeeper
- if (null == metadataDriver) {
+ if (isRegistrationManagerDisabled()) {
return;
}
try {
- metadataDriver.getRegistrationManager().registerBookie(bookieId,
true);
+ rm.get().registerBookie(bookieId, true);
} catch (BookieException e) {
LOG.error("Error in transition to ReadOnly Mode."
+ " Shutting down", e);
@@ -305,10 +333,6 @@ public class BookieStateManager implements StateManager {
shutdownHandler = handler;
}
- private String getMyId() throws UnknownHostException {
- return Bookie.getBookieAddress(conf).toString();
- }
-
@VisibleForTesting
public ShutdownHandler getShutdownHandler(){
return shutdownHandler;
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/discover/ZKRegistrationManager.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/discover/ZKRegistrationManager.java
index 15b03d5..eab9e4f 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/discover/ZKRegistrationManager.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/discover/ZKRegistrationManager.java
@@ -108,11 +108,17 @@ public class ZKRegistrationManager implements
RegistrationManager {
public ZKRegistrationManager(ServerConfiguration conf,
ZooKeeper zk,
RegistrationListener listener) {
+ this(conf, zk, ZKMetadataDriverBase.resolveZkLedgersRootPath(conf),
listener);
+ }
+
+ public ZKRegistrationManager(ServerConfiguration conf,
+ ZooKeeper zk,
+ String ledgersRootPath,
+ RegistrationListener listener) {
this.conf = conf;
this.zk = zk;
this.zkAcls = ZkUtils.getACLs(conf);
-
- this.ledgersRootPath =
ZKMetadataDriverBase.resolveZkLedgersRootPath(conf);
+ this.ledgersRootPath = ledgersRootPath;
this.cookiePath = ledgersRootPath + "/" + COOKIE_NODE;
this.bookieRegistrationPath = ledgersRootPath + "/" + AVAILABLE_NODE;
this.bookieReadonlyRegistrationPath = this.bookieRegistrationPath +
"/" + READONLY;
--
To stop receiving notification emails like this one, please contact
[email protected].