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 <si...@apache.org> 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 <si...@apache.org> Reviewers: Enrico Olivelli <eolive...@gmail.com>, 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 si...@apache.org.