public void shutdown(){ stop = true; proposedLeader = -1; proposedZxid = -1; leadingVoteSet = null; LOG.debug("Shutting down connection manager"); manager.halt(); LOG.debug("Shutting down messenger"); messenger.halt(); LOG.debug("FLE is down"); }
@Override public void run() { receiveConnection(sock); } }
/** * Called by run() once there is a new message to send. * * @param m message to send */ void process(ToSend m) { ByteBuffer requestBuffer = buildMsg(m.state.ordinal(), m.leader, m.zxid, m.electionEpoch, m.peerEpoch, m.configData); manager.toSend(m.sid, requestBuffer); } }
/** * Invokes initiateConnection for testing purposes * * @param sid */ public void testInitiateConnection(long sid) throws Exception { LOG.debug("Opening channel to server " + sid); Socket sock = new Socket(); setSockOpts(sock); sock.connect(self.getVotingView().get(sid).electionAddr, cnxTO); initiateConnection(sock, sid); }
/** * Processes invoke this message to queue a message to send. Currently, * only leader election uses it. */ public void toSend(Long sid, ByteBuffer b) { /* * If sending message to myself, then simply enqueue it (loopback). */ if (this.mySid == sid) { b.position(0); addToRecvQueue(new Message(b.duplicate(), sid)); /* * Otherwise send to the corresponding thread to send. */ } else { /* * Start a new connection if doesn't have one already. */ ArrayBlockingQueue<ByteBuffer> bq = new ArrayBlockingQueue<ByteBuffer>( SEND_CAPACITY); ArrayBlockingQueue<ByteBuffer> oldq = queueSendMap.putIfAbsent(sid, bq); if (oldq != null) { addToSendQueue(oldq, b); } else { addToSendQueue(bq, b); } connectOne(sid); } }
/** * Flag that it is time to wrap up all activities and interrupt the listener. */ public void halt() { shutdown = true; LOG.debug("Halting listener"); listener.halt(); // Wait for the listener to terminate. try { listener.join(); } catch (InterruptedException ex) { LOG.warn("Got interrupted before joining the listener", ex); } softHalt(); // clear data structures used for auth if (connectionExecutor != null) { connectionExecutor.shutdown(); } inprogressConnections.clear(); resetConnectionThreadCount(); }
@Test public void testCnxManager() throws Exception { CnxManagerThread thread = new CnxManagerThread(); thread.start(); QuorumPeer peer = new QuorumPeer(peers, peerTmpdir[1], peerTmpdir[1], peerClientPort[1], 3, 1, 1000, 2, 2); QuorumCnxManager cnxManager = peer.createCnxnManager(); QuorumCnxManager.Listener listener = cnxManager.listener; if(listener != null){ listener.start(); } else { LOG.error("Null listener when initializing cnx manager"); } cnxManager.toSend(0L, createMsg(ServerState.LOOKING.ordinal(), 1, -1, 1)); Message m = null; int numRetries = 1; while((m == null) && (numRetries++ <= THRESHOLD)){ m = cnxManager.pollRecvQueue(3000, TimeUnit.MILLISECONDS); if(m == null) cnxManager.connectAll(); } Assert.assertTrue("Exceeded number of retries", numRetries <= THRESHOLD); thread.join(5000); if (thread.isAlive()) { Assert.fail("Thread didn't join"); } else { if(thread.failed) Assert.fail("Did not receive expected message"); } cnxManager.halt(); Assert.assertFalse(cnxManager.listener.isAlive()); }
cnxManager.toSend(sid, createMsg(ServerState.LOOKING.ordinal(), 0, -1, 1)); m = cnxManager.pollRecvQueue(3000, TimeUnit.MILLISECONDS); if(m == null) cnxManager.connectAll(); cnxManager.testInitiateConnection(sid); m = cnxManager.pollRecvQueue(3000, TimeUnit.MILLISECONDS); if(m == null){ failed = true;
if(manager.haveDelivered()){ sendNotifications(); } else { manager.connectAll(); manager.getConnectionThreadCount());
if (self.isSslQuorum()) { SSLSocket sslSock = self.getX509Util().createSSLSocket(); setSockOpts(sslSock); sslSock.connect(electionAddr, cnxTO); sslSock.startHandshake(); } else { sock = new Socket(); setSockOpts(sock); sock.connect(electionAddr, cnxTO); initiateConnectionAsync(sock, sid); } else { initiateConnection(sock, sid); closeSocket(sock); throw e; } catch (X509Exception e) { LOG.warn("Cannot open secure channel to " + sid + " at election address " + electionAddr, e); closeSocket(sock); return false; } catch (IOException e) { + " at election address " + electionAddr, e); closeSocket(sock); return false;
if (!connectedToPeer(sid)){ InetSocketAddress electionAddr; if (view.containsKey(sid)) { setSockOpts(sock); sock.connect(view.get(sid).electionAddr, cnxTO); LOG.debug("Connected to server " + sid); initiateConnectionAsync(sock, sid); } else { initiateConnection(sock, sid);
@Test public void testSocketTimeout() throws Exception { QuorumPeer peer = new QuorumPeer(peers, peerTmpdir[1], peerTmpdir[1], peerClientPort[1], 3, 1, 2000, 2, 2); QuorumCnxManager cnxManager = peer.createCnxnManager(); QuorumCnxManager.Listener listener = cnxManager.listener; if(listener != null){ listener.start(); } else { LOG.error("Null listener when initializing cnx manager"); } int port = peers.get(peer.getId()).electionAddr.getPort(); LOG.info("Election port: " + port); Thread.sleep(1000); Socket sock = new Socket(); sock.connect(peers.get(1L).electionAddr, 5000); long begin = Time.currentElapsedTime(); // Read without sending data. Verify timeout. cnxManager.receiveConnection(sock); long end = Time.currentElapsedTime(); if((end - begin) > ((peer.getSyncLimit() * peer.getTickTime()) + 500)) Assert.fail("Waited more than necessary"); cnxManager.halt(); Assert.assertFalse(cnxManager.listener.isAlive()); }
@Test public void testCnxManagerTimeout() throws Exception { Random rand = new Random(); byte b = (byte) rand.nextInt(); int deadPort = PortAssignment.unique(); String deadAddress = "10.1.1." + b; LOG.info("This is the dead address I'm trying: " + deadAddress); peers.put(Long.valueOf(2), new QuorumServer(2, new InetSocketAddress(deadAddress, deadPort), new InetSocketAddress(deadAddress, PortAssignment.unique()), new InetSocketAddress(deadAddress, PortAssignment.unique()))); peerTmpdir[2] = ClientBase.createTmpDir(); QuorumPeer peer = new QuorumPeer(peers, peerTmpdir[1], peerTmpdir[1], peerClientPort[1], 3, 1, 1000, 2, 2); QuorumCnxManager cnxManager = peer.createCnxnManager(); QuorumCnxManager.Listener listener = cnxManager.listener; if(listener != null){ listener.start(); } else { LOG.error("Null listener when initializing cnx manager"); } long begin = Time.currentElapsedTime(); cnxManager.toSend(2L, createMsg(ServerState.LOOKING.ordinal(), 1, -1, 1)); long end = Time.currentElapsedTime(); if((end - begin) > 6000) Assert.fail("Waited more than necessary"); cnxManager.halt(); Assert.assertFalse(cnxManager.listener.isAlive()); }
receiveConnectionAsync(client); } else { receiveConnection(client);
sc.write(msgBuffer); Message m = cnxManager.pollRecvQueue(1000, TimeUnit.MILLISECONDS); Assert.assertNotNull(m); cnxManager.halt(); Assert.assertFalse(cnxManager.listener.isAlive());
public QuorumCnxManager createCnxnManager() { return new QuorumCnxManager(this, this.getId(), this.getView(), this.authServer, this.authLearner, this.tickTime * this.syncLimit, this.getQuorumListenOnAllIPs(), this.quorumCnxnThreadsSize, this.isQuorumSaslAuthEnabled()); }
/** * Try to establish a connection with each server if one * doesn't exist. */ public void connectAll(){ long sid; for(Enumeration<Long> en = queueSendMap.keys(); en.hasMoreElements();){ sid = en.nextElement(); connectOne(sid); } }
} catch (InitialMessage.InitialMessageException ex) { LOG.error(ex.toString()); closeSocket(sock); return; closeSocket(sock); return; closeSocket(sock); connectOne(sid, electionAddr); } else { connectOne(sid);
if(manager.haveDelivered()){ sendNotifications(); } else { manager.connectAll();
@Override public void run() { try{ initiateConnection(sock, sid); } finally { inprogressConnections.remove(sid); } } }