ddanielr commented on code in PR #5383:
URL: https://github.com/apache/accumulo/pull/5383#discussion_r1988393512
##########
server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java:
##########
@@ -80,6 +84,10 @@ static class Opts extends Help {
boolean zapScanServers = false;
@Parameter(names = "-verbose", description = "print out messages about
progress")
boolean verbose = false;
+ @Parameter(names = "-prepare-for-upgrade", description = "prepare Accumulo
for an upgrade to the next non bug fix release")
Review Comment:
Not 100% sure on this one so feel free to take or drop.
```suggestion
@Parameter(names = "-prepare-for-upgrade", description = "prepare
Accumulo for an upgrade to the next non-bugfix release")
```
##########
server/base/src/main/java/org/apache/accumulo/server/util/upgrade/PreUpgradeCheck.java:
##########
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.accumulo.server.util.upgrade;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.fate.ReadOnlyTStore;
+import org.apache.accumulo.core.fate.ZooStore;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil.NodeMissingPolicy;
+import org.apache.accumulo.core.zookeeper.ZooSession;
+import org.apache.accumulo.server.AccumuloDataVersion;
+import org.apache.accumulo.server.ServerContext;
+import org.apache.accumulo.server.cli.ServerUtilOpts;
+import org.apache.accumulo.start.spi.KeywordExecutable;
+import org.apache.zookeeper.KeeperException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PreUpgradeCheck implements KeywordExecutable {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(PreUpgradeCheck.class);
+
+ @Override
+ public String keyword() {
+ return "pre-upgrade";
+ }
+
+ @Override
+ public String description() {
+ return "Utility that prepares an instance to be upgraded to a new version."
+ + " This utility must be run before starting any servers.";
+ }
+
+ @Override
+ public void execute(String[] args) throws Exception {
+
+ ServerUtilOpts opts = new ServerUtilOpts();
+ opts.parseArgs(PreUpgradeCheck.class.getName(), args);
+
+ final ServerContext context = opts.getServerContext();
+
+ final int persistentVersion =
AccumuloDataVersion.getCurrentVersion(context);
+ final int thisVersion = AccumuloDataVersion.get();
+ if (persistentVersion == thisVersion) {
+ throw new IllegalStateException("Running this utility is unnecessary,
this instance"
+ + " has already been upgraded to version " + thisVersion);
+ }
+
+ final String zkRoot = context.getZooKeeperRoot();
+ final ZooSession zs = context.getZooSession();
+ final String prepUpgradePath = context.getZooKeeperRoot() +
Constants.ZPREPARE_FOR_UPGRADE;
+
+ if (!zs.asReader().exists(prepUpgradePath)) {
+ LOG.info("{} node not found in ZooKeeper, 'ZooZap -prepare-for-upgrade'
was likely"
+ + " not run when after shutting down instance for upgrade. Removing"
+ + " server locks and checking for fate transactions.");
Review Comment:
```suggestion
LOG.info("{} node not found in ZooKeeper, 'ZooZap
-prepare-for-upgrade' was likely"
+ " not run after shutting down instance for upgrade. Removing"
+ " server locks and checking for fate transactions.",
prepUpgradePath);
```
##########
server/base/src/main/java/org/apache/accumulo/server/AbstractServer.java:
##########
@@ -72,6 +73,21 @@ protected AbstractServer(String appName, ConfigOpts opts,
String[] args) {
this.hostname = siteConfig.get(Property.GENERAL_PROCESS_BIND_ADDRESS);
SecurityUtil.serverLogin(siteConfig);
context = new ServerContext(siteConfig);
+
+ final String upgradePrepNode = context.getZooKeeperRoot() +
Constants.ZPREPARE_FOR_UPGRADE;
+ try {
+ if (context.getZooSession().asReader().exists(upgradePrepNode)) {
+ throw new IllegalStateException(
+ "Instance has been prepared for upgrade, no servers can be
started."
+ + " To undo this state and abort upgrade preparations delete
the zookeeper node: "
+ + upgradePrepNode);
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException(
+ "Error checking for upgrade prepararation node (" + upgradePrepNode
+ ") in zookeeper",
Review Comment:
```suggestion
"Error checking for upgrade preparation node (" + upgradePrepNode
+ ") in zookeeper",
```
##########
test/src/main/java/org/apache/accumulo/test/upgrade/UpgradeProgressTrackerIT.java:
##########
@@ -154,7 +153,7 @@ public void testGetInitial() throws KeeperException,
InterruptedException {
assertFalse(upgradeNodeExists());
assertThrows(NullPointerException.class, () ->
progressTracker.getProgress());
assertFalse(upgradeNodeExists());
- progressTracker.startOrContinueUpgrade();
+ progressTracker.continueUpgrade();
Review Comment:
```suggestion
progressTracker.initialize();
progressTracker.continueUpgrade();
```
##########
test/src/main/java/org/apache/accumulo/test/upgrade/UpgradeProgressTrackerIT.java:
##########
@@ -169,7 +168,7 @@ public void testGetInitial() throws KeeperException,
InterruptedException {
public void testUpdates() throws KeeperException, InterruptedException {
expectVersion(AccumuloDataVersion.get() - 1);
assertFalse(upgradeNodeExists());
- progressTracker.startOrContinueUpgrade();
+ progressTracker.continueUpgrade();
assertTrue(upgradeNodeExists());
Review Comment:
```suggestion
progressTracker.initialize();
assertTrue(upgradeNodeExists());
progressTracker.continueUpgrade();
```
##########
test/src/main/java/org/apache/accumulo/test/upgrade/UpgradeProgressTrackerIT.java:
##########
@@ -225,7 +224,7 @@ public void testUpdates() throws KeeperException,
InterruptedException {
public void testCompleteUpgrade() throws KeeperException,
InterruptedException {
expectVersion(AccumuloDataVersion.get());
assertFalse(upgradeNodeExists());
- progressTracker.startOrContinueUpgrade();
+ progressTracker.continueUpgrade();
assertTrue(upgradeNodeExists());
Review Comment:
```suggestion
progressTracker.initialize();
assertTrue(upgradeNodeExists());
progressTracker.continueUpgrade();
```
##########
server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java:
##########
@@ -115,13 +123,77 @@ public void zap(SiteConfiguration siteConf, String...
args) {
SecurityUtil.serverLogin(siteConf);
}
- String volDir =
VolumeConfiguration.getVolumeUris(siteConf).iterator().next();
- Path instanceDir = new Path(volDir, "instance_id");
- InstanceId iid = VolumeManager.getInstanceIDFromHdfs(instanceDir, new
Configuration());
- var zrw = zk.asReaderWriter();
+ final String volDir =
VolumeConfiguration.getVolumeUris(siteConf).iterator().next();
+ final Path instanceDir = new Path(volDir, "instance_id");
+ final InstanceId iid = VolumeManager.getInstanceIDFromHdfs(instanceDir,
new Configuration());
+ final String zkRoot = ZooUtil.getRoot(iid);
+ final var zrw = zk.asReaderWriter();
+ final String upgradePath = zkRoot + Constants.ZPREPARE_FOR_UPGRADE;
+
+ if (opts.upgrade) {
+
+ try {
+ if (zrw.exists(upgradePath)) {
+ if (!opts.forceUpgradePrep) {
+ throw new IllegalStateException(
+ "'ZooZap -prepare-for-upgrade' must have already been run."
+ + " To run again use the 'ZooZap -prepare-for-upgrade
-force'");
+ } else {
+ zrw.delete(upgradePath);
+ }
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error creating or checking for " +
upgradePath
+ + " node in zookeeper: " + e.getMessage(), e);
+ }
+
+ log.info("Upgrade specified, validating that Manager is stopped");
+ AdminUtil<Admin> admin = new AdminUtil<>(false);
+ if (!admin.checkGlobalLock(zk, ServiceLock.path(zkRoot +
Constants.ZMANAGER_LOCK))) {
+ throw new IllegalStateException(
+ "Manager is running, shut it down and retry this operation");
+ }
+
+ log.info("Checking for existing fate transactions");
+ try {
+ final String fatePath = zkRoot + Constants.ZFATE;
+ // Adapted from UpgradeCoordinator.abortIfFateTransactions
+ final ReadOnlyTStore<ZooZap> fate = new ZooStore<>(fatePath, zk);
+ if (!fate.list().isEmpty()) {
+ throw new IllegalStateException("Cannot complete upgrade
preparation"
+ + " because FATE transactions exist. You can start a tserver,
but"
+ + " not the Manager, then use the shell to delete completed"
+ + " transactions and fail pending or in-progress transactions."
+ + " Once all of the FATE transactions have been removed you
can"
+ + " retry this operation.");
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error checking for existing FATE
transactions", e);
+ }
+
+ log.info("Creating {} node in zookeeper, servers will be prevented
from"
+ + " starting while this node exists", upgradePath);
+ try {
+ zrw.putPersistentData(upgradePath, new byte[0],
NodeExistsPolicy.SKIP);
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error creating " + upgradePath
+ + " node in zookeeper. Check for any issues and retry.", e);
+ }
+ log.info("Instance {} prepared for upgrade. Server processes will not
start while"
+ + " in this state. To undo this state and abort upgrade
preparations delete"
+ + " the zookeeper node: {}", iid.canonical(), upgradePath);
+
+ log.info("Forcing removal of all server locks");
+ // modify the options to remove all locks
+ opts.zapCompactors = true;
+ opts.zapCoordinators = true;
+ opts.zapManager = true;
+ opts.zapScanServers = true;
+ opts.zapTservers = true;
Review Comment:
Should we also be removing the locks for the monitor
(`Constants.ZMONITOR_LOCK`) and gc
(`Constants.ZGC_LOCK`)?
##########
test/src/main/java/org/apache/accumulo/test/upgrade/UpgradeProgressTrackerIT.java:
##########
@@ -139,8 +139,7 @@ public void testUpgradeAlreadyStarted() throws
KeeperException, InterruptedExcep
zk.create(zRoot + Constants.ZUPGRADE_PROGRESS,
GSON.get().toJson(progress).getBytes(UTF_8),
ZooUtil.PUBLIC, CreateMode.PERSISTENT);
assertTrue(upgradeNodeExists());
- var ise =
- assertThrows(IllegalStateException.class, () ->
progressTracker.startOrContinueUpgrade());
+ var ise = assertThrows(IllegalStateException.class, () ->
progressTracker.continueUpgrade());
assertTrue(ise.getMessage()
.startsWith("Upgrade was already started with a different version of
software"));
var npe = assertThrows(NullPointerException.class, () ->
progressTracker.getProgress());
Review Comment:
Next line down is still looking for the old method name in the assert test.
Needs to be updated to the following
`assertEquals("Must call continueUpgrade() before checking the progress",`
##########
server/base/src/main/java/org/apache/accumulo/server/util/upgrade/PreUpgradeCheck.java:
##########
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.accumulo.server.util.upgrade;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.fate.ReadOnlyTStore;
+import org.apache.accumulo.core.fate.ZooStore;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil.NodeMissingPolicy;
+import org.apache.accumulo.core.zookeeper.ZooSession;
+import org.apache.accumulo.server.AccumuloDataVersion;
+import org.apache.accumulo.server.ServerContext;
+import org.apache.accumulo.server.cli.ServerUtilOpts;
+import org.apache.accumulo.start.spi.KeywordExecutable;
+import org.apache.zookeeper.KeeperException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PreUpgradeCheck implements KeywordExecutable {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(PreUpgradeCheck.class);
+
+ @Override
+ public String keyword() {
+ return "pre-upgrade";
+ }
+
+ @Override
+ public String description() {
+ return "Utility that prepares an instance to be upgraded to a new version."
+ + " This utility must be run before starting any servers.";
+ }
+
+ @Override
+ public void execute(String[] args) throws Exception {
+
+ ServerUtilOpts opts = new ServerUtilOpts();
+ opts.parseArgs(PreUpgradeCheck.class.getName(), args);
+
+ final ServerContext context = opts.getServerContext();
+
+ final int persistentVersion =
AccumuloDataVersion.getCurrentVersion(context);
+ final int thisVersion = AccumuloDataVersion.get();
+ if (persistentVersion == thisVersion) {
+ throw new IllegalStateException("Running this utility is unnecessary,
this instance"
+ + " has already been upgraded to version " + thisVersion);
+ }
+
+ final String zkRoot = context.getZooKeeperRoot();
+ final ZooSession zs = context.getZooSession();
+ final String prepUpgradePath = context.getZooKeeperRoot() +
Constants.ZPREPARE_FOR_UPGRADE;
+
+ if (!zs.asReader().exists(prepUpgradePath)) {
+ LOG.info("{} node not found in ZooKeeper, 'ZooZap -prepare-for-upgrade'
was likely"
+ + " not run when after shutting down instance for upgrade. Removing"
+ + " server locks and checking for fate transactions.");
+
+ try {
+ final String fatePath = zkRoot + Constants.ZFATE;
+ // Adapted from UpgradeCoordinator.abortIfFateTransactions
+ final ReadOnlyTStore<PreUpgradeCheck> fate = new ZooStore<>(fatePath,
zs);
+ if (!fate.list().isEmpty()) {
+ throw new IllegalStateException("Cannot continue pre-upgrade checks"
+ + " because FATE transactions exist. You can start a tserver,
but"
+ + " not the Manager, with the old version of Accumulo then use "
+ + " the shell to delete completed transactions and fail pending"
+ + " or in-progress transactions. Once all of the FATE
transactions"
+ + " have been removed you can retry this operation.");
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error checking for existing FATE
transactions", e);
+ }
+ LOG.info("No FATE transactions found");
+
+ // Forcefully delete all server locks
+ Set<String> serviceLockPaths = Set.of(zkRoot + Constants.ZCOMPACTORS,
+ zkRoot + Constants.ZCOORDINATOR_LOCK, zkRoot + Constants.ZGC_LOCK,
+ zkRoot + Constants.ZMANAGER_LOCK, zkRoot + Constants.ZMONITOR_LOCK,
+ zkRoot + Constants.ZSSERVERS, zkRoot + Constants.ZTSERVERS);
+ for (String slp : serviceLockPaths) {
+ LOG.info("Deleting all zookeeper entries under {}", slp);
+ try {
+ List<String> children = zs.asReader().getChildren(slp);
+ for (String child : children) {
+ LOG.debug("Performing recursive delete on node: " + child);
+ ZooUtil.recursiveDelete(zs, slp + "/" + child,
NodeMissingPolicy.SKIP);
+ }
+ } catch (KeeperException.NoNodeException e) {
+ LOG.warn(slp + " path does not exist in zookeeper");
Review Comment:
```suggestion
LOG.warn("{} path does not exist in zookeeper", slp);
```
##########
server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java:
##########
@@ -115,13 +123,77 @@ public void zap(SiteConfiguration siteConf, String...
args) {
SecurityUtil.serverLogin(siteConf);
}
- String volDir =
VolumeConfiguration.getVolumeUris(siteConf).iterator().next();
- Path instanceDir = new Path(volDir, "instance_id");
- InstanceId iid = VolumeManager.getInstanceIDFromHdfs(instanceDir, new
Configuration());
- var zrw = zk.asReaderWriter();
+ final String volDir =
VolumeConfiguration.getVolumeUris(siteConf).iterator().next();
+ final Path instanceDir = new Path(volDir, "instance_id");
+ final InstanceId iid = VolumeManager.getInstanceIDFromHdfs(instanceDir,
new Configuration());
+ final String zkRoot = ZooUtil.getRoot(iid);
+ final var zrw = zk.asReaderWriter();
+ final String upgradePath = zkRoot + Constants.ZPREPARE_FOR_UPGRADE;
+
+ if (opts.upgrade) {
+
+ try {
+ if (zrw.exists(upgradePath)) {
+ if (!opts.forceUpgradePrep) {
+ throw new IllegalStateException(
+ "'ZooZap -prepare-for-upgrade' must have already been run."
+ + " To run again use the 'ZooZap -prepare-for-upgrade
-force'");
+ } else {
+ zrw.delete(upgradePath);
+ }
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error creating or checking for " +
upgradePath
+ + " node in zookeeper: " + e.getMessage(), e);
+ }
+
+ log.info("Upgrade specified, validating that Manager is stopped");
+ AdminUtil<Admin> admin = new AdminUtil<>(false);
+ if (!admin.checkGlobalLock(zk, ServiceLock.path(zkRoot +
Constants.ZMANAGER_LOCK))) {
+ throw new IllegalStateException(
+ "Manager is running, shut it down and retry this operation");
+ }
+
+ log.info("Checking for existing fate transactions");
+ try {
+ final String fatePath = zkRoot + Constants.ZFATE;
+ // Adapted from UpgradeCoordinator.abortIfFateTransactions
+ final ReadOnlyTStore<ZooZap> fate = new ZooStore<>(fatePath, zk);
+ if (!fate.list().isEmpty()) {
+ throw new IllegalStateException("Cannot complete upgrade
preparation"
+ + " because FATE transactions exist. You can start a tserver,
but"
+ + " not the Manager, then use the shell to delete completed"
+ + " transactions and fail pending or in-progress transactions."
Review Comment:
Do we want to point to some other documentation instead of trying to kick
everything out in this Exception message? "go read the admin guide or javadoc
entry for some upgrader code?"
The current guidance seems correct for all fate types other than failed.
##########
server/base/src/main/java/org/apache/accumulo/server/util/upgrade/PreUpgradeCheck.java:
##########
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.accumulo.server.util.upgrade;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.fate.ReadOnlyTStore;
+import org.apache.accumulo.core.fate.ZooStore;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil;
+import org.apache.accumulo.core.fate.zookeeper.ZooUtil.NodeMissingPolicy;
+import org.apache.accumulo.core.zookeeper.ZooSession;
+import org.apache.accumulo.server.AccumuloDataVersion;
+import org.apache.accumulo.server.ServerContext;
+import org.apache.accumulo.server.cli.ServerUtilOpts;
+import org.apache.accumulo.start.spi.KeywordExecutable;
+import org.apache.zookeeper.KeeperException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PreUpgradeCheck implements KeywordExecutable {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(PreUpgradeCheck.class);
+
+ @Override
+ public String keyword() {
+ return "pre-upgrade";
+ }
+
+ @Override
+ public String description() {
+ return "Utility that prepares an instance to be upgraded to a new version."
+ + " This utility must be run before starting any servers.";
+ }
+
+ @Override
+ public void execute(String[] args) throws Exception {
+
+ ServerUtilOpts opts = new ServerUtilOpts();
+ opts.parseArgs(PreUpgradeCheck.class.getName(), args);
+
+ final ServerContext context = opts.getServerContext();
+
+ final int persistentVersion =
AccumuloDataVersion.getCurrentVersion(context);
+ final int thisVersion = AccumuloDataVersion.get();
+ if (persistentVersion == thisVersion) {
+ throw new IllegalStateException("Running this utility is unnecessary,
this instance"
+ + " has already been upgraded to version " + thisVersion);
+ }
+
+ final String zkRoot = context.getZooKeeperRoot();
+ final ZooSession zs = context.getZooSession();
+ final String prepUpgradePath = context.getZooKeeperRoot() +
Constants.ZPREPARE_FOR_UPGRADE;
+
+ if (!zs.asReader().exists(prepUpgradePath)) {
+ LOG.info("{} node not found in ZooKeeper, 'ZooZap -prepare-for-upgrade'
was likely"
+ + " not run when after shutting down instance for upgrade. Removing"
+ + " server locks and checking for fate transactions.");
+
+ try {
+ final String fatePath = zkRoot + Constants.ZFATE;
+ // Adapted from UpgradeCoordinator.abortIfFateTransactions
+ final ReadOnlyTStore<PreUpgradeCheck> fate = new ZooStore<>(fatePath,
zs);
+ if (!fate.list().isEmpty()) {
+ throw new IllegalStateException("Cannot continue pre-upgrade checks"
+ + " because FATE transactions exist. You can start a tserver,
but"
+ + " not the Manager, with the old version of Accumulo then use "
+ + " the shell to delete completed transactions and fail pending"
+ + " or in-progress transactions. Once all of the FATE
transactions"
+ + " have been removed you can retry this operation.");
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new IllegalStateException("Error checking for existing FATE
transactions", e);
+ }
+ LOG.info("No FATE transactions found");
+
+ // Forcefully delete all server locks
+ Set<String> serviceLockPaths = Set.of(zkRoot + Constants.ZCOMPACTORS,
+ zkRoot + Constants.ZCOORDINATOR_LOCK, zkRoot + Constants.ZGC_LOCK,
+ zkRoot + Constants.ZMANAGER_LOCK, zkRoot + Constants.ZMONITOR_LOCK,
+ zkRoot + Constants.ZSSERVERS, zkRoot + Constants.ZTSERVERS);
+ for (String slp : serviceLockPaths) {
+ LOG.info("Deleting all zookeeper entries under {}", slp);
+ try {
+ List<String> children = zs.asReader().getChildren(slp);
+ for (String child : children) {
+ LOG.debug("Performing recursive delete on node: " + child);
Review Comment:
```suggestion
LOG.debug("Performing recursive delete on node: {}", child);
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]