/** 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 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(); } } }