SOLR-9194: Enhance the bin/solr script to perform file operations to/from Zookeeper. More Windows fixes

This commit is contained in:
Erick Erickson 2016-07-03 17:14:25 -07:00
parent 961eaf9add
commit 65c34857f8
2 changed files with 14 additions and 30 deletions

View File

@ -11,9 +11,9 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor; import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.Set;
import org.apache.solr.common.cloud.SolrZkClient; import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkMaintenanceUtils;
import org.apache.solr.util.SolrCLI; import org.apache.solr.util.SolrCLI;
import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException;
import org.junit.AfterClass; import org.junit.AfterClass;
@ -554,13 +554,6 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
assertFalse("Should fail when trying to remove /.", res == 0); assertFalse("Should fail when trying to remove /.", res == 0);
} }
private void getAllKids(String zkRoot, Set<String> paths) throws KeeperException, InterruptedException {
for (String node : zkClient.getChildren(zkRoot, null, true)) {
paths.add(node);
getAllKids(zkRoot + "/" + node, paths);
}
}
// We can use this for testing since the goal is to move "some stuff" up to ZK. // We can use this for testing since the goal is to move "some stuff" up to ZK.
// The fact that they're in configsets is irrelevant. // The fact that they're in configsets is irrelevant.
private void copyConfigUp(Path configSetDir, String srcConfigSet, String dstConfigName) throws Exception { private void copyConfigUp(Path configSetDir, String srcConfigSet, String dstConfigName) throws Exception {
@ -597,8 +590,8 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
void verifyAllFilesAreZNodes(Path fileRoot, String zkRoot) throws IOException { void verifyAllFilesAreZNodes(Path fileRoot, String zkRoot) throws IOException {
Files.walkFileTree(fileRoot, new SimpleFileVisitor<Path>() { Files.walkFileTree(fileRoot, new SimpleFileVisitor<Path>() {
void checkPathOnZk(Path path) { void checkPathOnZk(Path path) {
String znode = zkRoot + path.toAbsolutePath().toString().substring(fileRoot.toAbsolutePath().toString().length()); String znode = ZkMaintenanceUtils.createZkNodeName(zkRoot, fileRoot, path);
try { try { // It's easier to catch this exception and fail than catch it everywher eles.
assertTrue("Should have found " + znode + " on Zookeeper", zkClient.exists(znode, true)); assertTrue("Should have found " + znode + " on Zookeeper", zkClient.exists(znode, true));
} catch (Exception e) { } catch (Exception e) {
fail("Caught unexpected exception " + e.getMessage() + " Znode we were checking " + znode); fail("Caught unexpected exception " + e.getMessage() + " Znode we were checking " + znode);
@ -623,27 +616,17 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
// Insure that all znodes in first are in second and vice-versa // Insure that all znodes in first are in second and vice-versa
private void verifyZnodesMatch(String first, String second) throws KeeperException, InterruptedException { private void verifyZnodesMatch(String first, String second) throws KeeperException, InterruptedException {
verifyFirstNodesInSecond(first, second); verifyFirstZNodesInSecond(first, second);
verifyFirstNodesInSecond(second, first); verifyFirstZNodesInSecond(second, first);
} }
private void verifyFirstNodesInSecond(String first, String second) throws KeeperException, InterruptedException { // Note, no folderol here with Windows path names.
private void verifyFirstZNodesInSecond(String first, String second) throws KeeperException, InterruptedException {
for (String node : zkClient.getChildren(first, null, true)) { for (String node : zkClient.getChildren(first, null, true)) {
String fNode = first + "/" + node; String fNode = first + "/" + node;
String sNode = second + "/" + node; String sNode = second + "/" + node;
assertTrue("Node " + sNode + " not found. Exists on " + fNode, zkClient.exists(sNode, true)); assertTrue("Node " + sNode + " not found. Exists on " + fNode, zkClient.exists(sNode, true));
verifyFirstNodesInSecond(fNode, sNode); verifyFirstZNodesInSecond(fNode, sNode);
} }
} }
public static String createZkNodeName(String zkRoot, Path root, Path file) {
String relativePath = root.relativize(file).toString();
// Windows shenanigans
String separator = root.getFileSystem().getSeparator();
if ("\\".equals(separator))
relativePath = relativePath.replaceAll("\\\\", "/");
return zkRoot + "/" + relativePath;
}
} }

View File

@ -38,7 +38,7 @@ import org.slf4j.LoggerFactory;
* Class to hold ZK upload/download/move common code. With the advent of the upconfig/downconfig/cp/ls/mv commands * Class to hold ZK upload/download/move common code. With the advent of the upconfig/downconfig/cp/ls/mv commands
* in bin/solr it made sense to keep the individual transfer methods in a central place, so here it is. * in bin/solr it made sense to keep the individual transfer methods in a central place, so here it is.
*/ */
class ZkMaintenanceUtils { public class ZkMaintenanceUtils {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private ZkMaintenanceUtils() {} // don't let it be instantiated, all methods are static. private ZkMaintenanceUtils() {} // don't let it be instantiated, all methods are static.
@ -50,7 +50,7 @@ class ZkMaintenanceUtils {
* @throws KeeperException Could not perform the Zookeeper operation. * @throws KeeperException Could not perform the Zookeeper operation.
* @throws InterruptedException Thread interrupted * @throws InterruptedException Thread interrupted
* @throws SolrServerException zookeeper node has children and recurse not specified. * @throws SolrServerException zookeeper node has children and recurse not specified.
* @returns an indented list of the znodes suitable for display * @return an indented list of the znodes suitable for display
*/ */
public static String listZnode(SolrZkClient zkClient, String path, Boolean recurse) throws KeeperException, InterruptedException, SolrServerException { public static String listZnode(SolrZkClient zkClient, String path, Boolean recurse) throws KeeperException, InterruptedException, SolrServerException {
String root = path; String root = path;
@ -335,6 +335,10 @@ class ZkMaintenanceUtils {
String separator = root.getFileSystem().getSeparator(); String separator = root.getFileSystem().getSeparator();
if ("\\".equals(separator)) if ("\\".equals(separator))
relativePath = relativePath.replaceAll("\\\\", "/"); relativePath = relativePath.replaceAll("\\\\", "/");
// It's possible that the relative path and file are the same, in which case
// adding the bare slash is A Bad Idea
if (relativePath.length() == 0) return zkRoot;
return zkRoot + "/" + relativePath; return zkRoot + "/" + relativePath;
} }
} }
@ -358,9 +362,6 @@ class ZkCopier implements ZkMaintenanceUtils.ZkVisitor {
public void visit(String path) throws InterruptedException, KeeperException { public void visit(String path) throws InterruptedException, KeeperException {
String finalDestination = dest; String finalDestination = dest;
if (path.equals(source) == false) finalDestination += "/" + path.substring(source.length() + 1); if (path.equals(source) == false) finalDestination += "/" + path.substring(source.length() + 1);
if (finalDestination.endsWith("/") || path.endsWith("/")) {
int eoe = 99;
}
zkClient.makePath(finalDestination, false, true); zkClient.makePath(finalDestination, false, true);
zkClient.setData(finalDestination, zkClient.getData(path, null, null, true), true); zkClient.setData(finalDestination, zkClient.getData(path, null, null, true), true);
} }