@Test public void testUploadToCloud() throws Exception { String zkDir = dataDir.getAbsolutePath() + File.separator + "zookeeper/server1/data"; ZkTestServer server = new ZkTestServer(zkDir); ZkController zkController = null; try { server.run(); AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); zkController = new ZkController(server.getZkAddress(), TIMEOUT, 1000, "localhost", "8983", "/solr"); zkController.uploadToZK(new File("solr/conf"), ZkController.CONFIGS_ZKNODE + "/config1"); if (DEBUG) { zkController.printLayoutToStdOut(); } } finally { if (zkController != null) { zkController.close(); } server.shutdown(); } }
ZkConnection(boolean makeRoot) throws Exception { String zkDir = createTempDir("zkData").toFile().getAbsolutePath(); server = new ZkTestServer(zkDir); server.run(); AbstractZkTestCase.tryCleanSolrZkNode(server.getZkHost()); if (makeRoot) AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); zkClient = new SolrZkClient(server.getZkAddress(), AbstractZkTestCase.TIMEOUT); }
private void setUpZkAndDiskXml(boolean toZk, boolean leaveOnLocal) throws Exception { createTempDir(); File solrHome = new File(dataDir, "home"); copyMinConf(new File(solrHome, "myCollect")); if (leaveOnLocal) { FileUtils.copyFile( new File(SolrTestCaseJ4.TEST_HOME(), "solr-stress-new.xml"), new File(solrHome, "solr.xml")); } System.setProperty("solr.solr.home", solrHome.getAbsolutePath()); ignoreException("No UpdateLog found - cannot sync"); ignoreException("No UpdateLog found - cannot recover"); System.setProperty("zkClientTimeout", "8000"); zkDir = dataDir.getAbsolutePath() + File.separator + "zookeeper" + System.currentTimeMillis() + "/server1/data"; zkServer = new ZkTestServer(zkDir); zkServer.run(); System.setProperty("zkHost", zkServer.getZkAddress()); AbstractZkTestCase.buildZooKeeper( zkServer.getZkHost(), zkServer.getZkAddress(), "solrconfig.xml", "schema.xml"); zkClient = new SolrZkClient(zkServer.getZkAddress(), AbstractZkTestCase.TIMEOUT); if (toZk) { zkClient.makePath("solr.xml", XML_FOR_ZK.getBytes(Charsets.UTF_8), true); } zkClient.close(); log.info("####SETUP_START " + getTestName()); // set some system properties for use by tests System.setProperty("solr.test.sys.prop1", "propone"); System.setProperty("solr.test.sys.prop2", "proptwo"); Method method = SolrDispatchFilter.class.getDeclaredMethod("loadConfigSolr", SolrResourceLoader.class); method.setAccessible(true); Object obj = method.invoke(new SolrDispatchFilter(), new SolrResourceLoader(null)); cfg = (ConfigSolr) obj; log.info("####SETUP_END " + getTestName()); }
/** Shut down the cluster, including all Solr nodes and ZooKeeper */ public void shutdown() throws Exception { try { if (solrClient != null) solrClient.close(); List<Callable<JettySolrRunner>> shutdowns = new ArrayList<>(jettys.size()); for (final JettySolrRunner jetty : jettys) { shutdowns.add(() -> stopJettySolrRunner(jetty)); } jettys.clear(); Collection<Future<JettySolrRunner>> futures = executor.invokeAll(shutdowns); Exception shutdownError = checkForExceptions("Error shutting down MiniSolrCloudCluster", futures); if (shutdownError != null) { throw shutdownError; } } finally { executor.shutdown(); executor.awaitTermination(2, TimeUnit.SECONDS); try { if (!externalZkServer) { zkServer.shutdown(); } } finally { System.clearProperty("zkHost"); } } }
private void waitForAllNodes(int numServers, int timeout) throws IOException, InterruptedException { try (SolrZkClient zkClient = new SolrZkClient(zkServer.getZkHost(), AbstractZkTestCase.TIMEOUT)) { int numliveNodes = 0; int retries = timeout; String liveNodesPath = "/solr/live_nodes"; // Wait up to {timeout} seconds for number of live_nodes to match up number of servers do { if (zkClient.exists(liveNodesPath, true)) { numliveNodes = zkClient.getChildren(liveNodesPath, null, true).size(); if (numliveNodes == numServers) { break; } } retries--; if (retries == 0) { throw new IllegalStateException( "Solr servers failed to register with ZK." + " Current count: " + numliveNodes + "; Expected count: " + numServers); } Thread.sleep(1000); } while (numliveNodes != numServers); } catch (KeeperException e) { throw new IOException("Error communicating with zookeeper", e); } }
private void closeZK() throws Exception { if (zkClient != null) { zkClient.close(); } if (reader != null) { reader.close(); } zkServer.shutdown(); }
/** Make the zookeeper session on a particular jetty expire */ public void expireZkSession(JettySolrRunner jetty) { CoreContainer cores = jetty.getCoreContainer(); if (cores != null) { SolrZkClient zkClient = cores.getZkController().getZkClient(); zkClient.getSolrZooKeeper().closeCnxn(); long sessionId = zkClient.getSolrZooKeeper().getSessionId(); zkServer.expire(sessionId); log.info("Expired zookeeper session {} from node {}", sessionId, jetty.getBaseUrl()); } }
public void testZkCmdExectutor() throws Exception { String zkDir = createTempDir("zkData").toFile().getAbsolutePath(); ZkTestServer server = null; try { server = new ZkTestServer(zkDir); server.run(); AbstractZkTestCase.tryCleanSolrZkNode(server.getZkHost()); AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); final int timeout = random().nextInt(10000) + 5000; ZkCmdExecutor zkCmdExecutor = new ZkCmdExecutor(timeout); final long start = System.nanoTime(); try { zkCmdExecutor.retryOperation( new ZkOperation() { @Override public String execute() throws KeeperException, InterruptedException { if (System.nanoTime() - start > TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS)) { throw new KeeperException.SessionExpiredException(); } throw new KeeperException.ConnectionLossException(); } }); } catch (KeeperException.SessionExpiredException e) { } catch (Exception e) { fail( "Expected " + KeeperException.SessionExpiredException.class.getSimpleName() + " but got " + e.getClass().getSimpleName()); } } finally { if (server != null) { server.shutdown(); } } }
/** * Upload a config set * * @param configDir a path to the config set to upload * @param configName the name to give the configset */ public void uploadConfigSet(Path configDir, String configName) throws IOException, KeeperException, InterruptedException { try (SolrZkClient zkClient = new SolrZkClient( zkServer.getZkAddress(), AbstractZkTestCase.TIMEOUT, AbstractZkTestCase.TIMEOUT, null)) { ZkConfigManager manager = new ZkConfigManager(zkClient); manager.uploadConfigDir(configDir, configName); } }
public void injectChaos(Random random) throws Exception { // sometimes we restart one of the jetty nodes if (random.nextBoolean()) { JettySolrRunner jetty = jettys.get(random.nextInt(jettys.size())); ChaosMonkey.stop(jetty); log.info("============ Restarting jetty"); ChaosMonkey.start(jetty); } // sometimes we restart zookeeper if (random.nextBoolean()) { zkServer.shutdown(); log.info("============ Restarting zookeeper"); zkServer = new ZkTestServer(zkServer.getZkDir(), zkServer.getPort()); zkServer.run(); } // sometimes we cause a connection loss - sometimes it will hit the overseer if (random.nextBoolean()) { JettySolrRunner jetty = jettys.get(random.nextInt(jettys.size())); ChaosMonkey.causeConnectionLoss(jetty); } }
@Test public void testReadConfigName() throws Exception { String zkDir = dataDir.getAbsolutePath() + File.separator + "zookeeper/server1/data"; ZkTestServer server = new ZkTestServer(zkDir); try { server.run(); AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); SolrZkClient zkClient = new SolrZkClient(server.getZkAddress(), TIMEOUT); String actualConfigName = "firstConfig"; zkClient.makePath(ZkController.CONFIGS_ZKNODE + "/" + actualConfigName); ZkNodeProps props = new ZkNodeProps(); props.put("configName", actualConfigName); zkClient.makePath( ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION_NAME, props.store(), CreateMode.PERSISTENT); if (DEBUG) { zkClient.printLayoutToStdOut(); } zkClient.close(); ZkController zkController = new ZkController(server.getZkAddress(), TIMEOUT, TIMEOUT, "localhost", "8983", "/solr"); try { String configName = zkController.readConfigName(COLLECTION_NAME); assertEquals(configName, actualConfigName); } finally { zkController.close(); } } finally { server.shutdown(); } }
@Override public void close() throws Exception { if (zkClient != null) zkClient.close(); if (server != null) server.shutdown(); }
public void testReconnect() throws Exception { String zkDir = createTempDir("zkData").toFile().getAbsolutePath(); ZkTestServer server = null; SolrZkClient zkClient = null; try { server = new ZkTestServer(zkDir); server.run(); AbstractZkTestCase.tryCleanSolrZkNode(server.getZkHost()); AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); zkClient = new SolrZkClient(server.getZkAddress(), AbstractZkTestCase.TIMEOUT); String shardsPath = "/collections/collection1/shards"; zkClient.makePath(shardsPath, false, true); zkClient.makePath("collections/collection1", false, true); int zkServerPort = server.getPort(); // this tests disconnect state server.shutdown(); Thread.sleep(80); try { zkClient.makePath("collections/collection2", false); Assert.fail("Server should be down here"); } catch (KeeperException.ConnectionLossException e) { } // bring server back up server = new ZkTestServer(zkDir, zkServerPort); server.run(); // TODO: can we do better? // wait for reconnect Thread.sleep(600); try { zkClient.makePath("collections/collection3", true); } catch (KeeperException.ConnectionLossException e) { Thread.sleep(5000); // try again in a bit zkClient.makePath("collections/collection3", true); } if (DEBUG) { zkClient.printLayoutToStdOut(); } assertNotNull(zkClient.exists("/collections/collection3", null, true)); assertNotNull(zkClient.exists("/collections/collection1", null, true)); // simulate session expiration // one option long sessionId = zkClient.getSolrZooKeeper().getSessionId(); server.expire(sessionId); // another option // zkClient.getSolrZooKeeper().getConnection().disconnect(); // this tests expired state Thread.sleep(1000); // pause for reconnect for (int i = 0; i < 8; i++) { try { zkClient.makePath("collections/collection4", true); break; } catch (KeeperException.SessionExpiredException | KeeperException.ConnectionLossException e) { } Thread.sleep(1000 * i); } if (DEBUG) { zkClient.printLayoutToStdOut(); } assertNotNull( "Node does not exist, but it should", zkClient.exists("/collections/collection4", null, true)); } finally { if (zkClient != null) { zkClient.close(); } if (server != null) { server.shutdown(); } } }
@Test public void testReadShards() throws Exception { String zkDir = dataDir.getAbsolutePath() + File.separator + "zookeeper/server1/data"; ZkTestServer server = null; SolrZkClient zkClient = null; ZkController zkController = null; try { server = new ZkTestServer(zkDir); server.run(); AbstractZkTestCase.makeSolrZkNode(server.getZkHost()); zkClient = new SolrZkClient(server.getZkAddress(), TIMEOUT); String shardsPath = "/collections/collection1/shards/shardid1"; zkClient.makePath(shardsPath); addShardToZk(zkClient, shardsPath, SHARD1, URL1); addShardToZk(zkClient, shardsPath, SHARD2, URL2); addShardToZk(zkClient, shardsPath, SHARD3, URL3); if (DEBUG) { zkClient.printLayoutToStdOut(); } zkController = new ZkController(server.getZkAddress(), TIMEOUT, 1000, "localhost", "8983", "solr"); zkController.getZkStateReader().updateCloudState(true); CloudState cloudInfo = zkController.getCloudState(); Map<String, Slice> slices = cloudInfo.getSlices("collection1"); assertNotNull(slices); for (Slice slice : slices.values()) { Map<String, ZkNodeProps> shards = slice.getShards(); if (DEBUG) { for (String shardName : shards.keySet()) { ZkNodeProps props = shards.get(shardName); System.out.println("shard:" + shardName); System.out.println("props:" + props.toString()); } } assertNotNull(shards.get(SHARD1)); assertNotNull(shards.get(SHARD2)); assertNotNull(shards.get(SHARD3)); ZkNodeProps props = shards.get(SHARD1); assertEquals(URL1, props.get(ZkStateReader.URL_PROP)); assertEquals(TEST_NODE_NAME, props.get(ZkStateReader.NODE_NAME)); props = shards.get(SHARD2); assertEquals(URL2, props.get(ZkStateReader.URL_PROP)); assertEquals(TEST_NODE_NAME, props.get(ZkStateReader.NODE_NAME)); props = shards.get(SHARD3); assertEquals(URL3, props.get(ZkStateReader.URL_PROP)); assertEquals(TEST_NODE_NAME, props.get(ZkStateReader.NODE_NAME)); } } finally { if (zkClient != null) { zkClient.close(); } if (zkController != null) { zkController.close(); } if (server != null) { server.shutdown(); } } }
/** * Create a MiniSolrCloudCluster. Note - this constructor visibility is changed to package * protected so as to discourage its usage. Ideally *new* functionality should use {@linkplain * SolrCloudTestCase} to configure any additional parameters. * * @param numServers number of Solr servers to start * @param baseDir base directory that the mini cluster should be run from * @param solrXml solr.xml file to be uploaded to ZooKeeper * @param jettyConfig Jetty configuration * @param zkTestServer ZkTestServer to use. If null, one will be created * @param securityJson A string representation of security.json file (optional). * @throws Exception if there was an error starting the cluster */ MiniSolrCloudCluster( int numServers, Path baseDir, String solrXml, JettyConfig jettyConfig, ZkTestServer zkTestServer, Optional<String> securityJson) throws Exception { Objects.requireNonNull(securityJson); this.baseDir = Objects.requireNonNull(baseDir); this.jettyConfig = Objects.requireNonNull(jettyConfig); log.info("Starting cluster of {} servers in {}", numServers, baseDir); Files.createDirectories(baseDir); this.externalZkServer = zkTestServer != null; if (!externalZkServer) { String zkDir = baseDir.resolve("zookeeper/server1/data").toString(); zkTestServer = new ZkTestServer(zkDir); zkTestServer.run(); } this.zkServer = zkTestServer; try (SolrZkClient zkClient = new SolrZkClient(zkServer.getZkHost(), AbstractZkTestCase.TIMEOUT)) { zkClient.makePath("/solr/solr.xml", solrXml.getBytes(Charset.defaultCharset()), true); if (jettyConfig.sslConfig != null && jettyConfig.sslConfig.isSSLMode()) { zkClient.makePath( "/solr" + ZkStateReader.CLUSTER_PROPS, "{'urlScheme':'https'}".getBytes(StandardCharsets.UTF_8), true); } if (securityJson.isPresent()) { // configure Solr security zkClient.makePath( "/solr/security.json", securityJson.get().getBytes(Charset.defaultCharset()), true); } } // tell solr to look in zookeeper for solr.xml System.setProperty("zkHost", zkServer.getZkAddress()); List<Callable<JettySolrRunner>> startups = new ArrayList<>(numServers); for (int i = 0; i < numServers; ++i) { startups.add(() -> startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig)); } Collection<Future<JettySolrRunner>> futures = executor.invokeAll(startups); Exception startupError = checkForExceptions("Error starting up MiniSolrCloudCluster", futures); if (startupError != null) { try { this.shutdown(); } catch (Throwable t) { startupError.addSuppressed(t); } throw startupError; } waitForAllNodes(numServers, 60); solrClient = buildSolrClient(); }