sendIHaveSockMessage(null, local_addr, srv_sock_addr); srv_sock_sent=true; getCacheFromCoordinator(); got_cache_from_coord=true; while(pingable_mbrs != null && !pingable_mbrs.isEmpty()) { regular_sock_close=false; ping_dest=determinePingDest(); // gets the neighbor to our right if(ping_dest == null || !isPingerThreadRunning()) break; log.debug("%s: pingable_mbrs=%s, ping_dest=%s", local_addr, pingable_mbrs, ping_dest); IpAddress ping_addr=fetchPingAddress(ping_dest); if(ping_addr == null) { log.trace("%s: socket address for %s could not be fetched, retrying", local_addr, ping_dest); if(!setupPingSocket(ping_addr) && isPingerThreadRunning()) { broadcastSuspectMessage(ping_dest); pingable_mbrs.remove(ping_dest); continue; break; case ABNORMAL_TERMINATION: // -1 means EOF handleSocketClose(null); break; default:
broadcastUnuspectMessage(evt.getArg()); break; Object ret=down_prot.down(evt); try { startServerSocket(); stopServerSocket(true); // graceful close break; pingable_mbrs.addAll(new_mbrs); if(new_mbrs.size() > 1) { Address tmp_ping_dest=determinePingDest(); boolean hasNewPingDest = tmp_ping_dest != null && !tmp_ping_dest.equals(ping_dest); if(hasNewPingDest) { interruptPingerThread(false); // allows the thread to use the new socket startPingerThread(); // in case it wasn't running; only starts if not yet running stopPingerThread();
protected void sendPingTermination() { sendPingSignal(NORMAL_TERMINATION); }
/** * Interrupts the pinger thread. The Thread.interrupt() method doesn't seem to work under Linux with JDK 1.3.1 * (JDK 1.2.2 had no problems here), therefore we close the socket (setSoLinger has to be set !) if we are * running under Linux. This should be tested under Windows. (Solaris 8 and JDK 1.3.1 definitely works).<p> * Oct 29 2001 (bela): completely removed Thread.interrupt(), but used socket close on all OSs. This makes this * code portable and we don't have to check for OSs.<p/> */ protected synchronized void interruptPingerThread(boolean sendTerminationSignal) { if(isPingerThreadRunning()) { regular_sock_close=true; if (sendTerminationSignal) { sendPingTermination(); // PATCH by Bruce Schuchardt (http://jira.jboss.com/jira/browse/JGRP-246) } teardownPingSocket(); // will wake up the pinger thread. less elegant than Thread.interrupt(), but does the job } }
protected void handleSocketClose(Exception ex) { teardownPingSocket(); // make sure we have no leftovers if(!regular_sock_close) { // only suspect if socket was not closed regularly (by interruptPingerThread()) log.debug("%s: %s closed socket (%s)", local_addr, ping_dest, (ex != null ? ex.toString() : "eof")); broadcastSuspectMessage(ping_dest); pingable_mbrs.remove(ping_dest); } else { log.debug("%s: socket to %s was closed gracefully", local_addr, ping_dest); regular_sock_close=false; } }
startServerSocket(); return ret; stopServerSocket(true); // graceful close break; stopServerSocket(false); break; getCacheFromCoordinator(); got_cache_from_coord=true; sendIHaveSockMessage(null, // send to all members local_addr, srv_sock_addr); synchronized(pinger_mutex) { if(pinger_thread != null && pinger_thread.isAlive()) { Address tmp_ping_dest=determinePingDest(); if(ping_dest != null && tmp_ping_dest != null && !ping_dest.equals(tmp_ping_dest)) { interruptPingerThread(); // allows the thread to use the new socket startPingerThread(); // only starts if not yet running stopPingerThread();
tmp_ping_dest=determinePingDest(); // gets the neighbor to our right if(log.isDebugEnabled()) log.debug("determinePingDest()=" + tmp_ping_dest + ", pingable_mbrs=" + pingable_mbrs); ping_addr=fetchPingAddress(ping_dest); if(ping_addr == null) { if(!running) if(!setupPingSocket(ping_addr)) { broadcastSuspectMessage(ping_dest); pingable_mbrs.removeElement(ping_dest); continue; handleSocketClose(null); break; default: handleSocketClose(ex);
if(hdr.mbrs != null) { log.trace("%s: received SUSPECT message from %s: suspects=%s", local_addr, msg.getSrc(), hdr.mbrs); suspect(hdr.mbrs); sendIHaveSockMessage(msg.getSrc(), local_addr, srv_sock_addr); // unicast message to msg.getSrc() return null; sendIHaveSockMessage(msg.getSrc(), hdr.mbr, addr); // ucast msg break; .putHeader(this.id, new FdHeader(FdHeader.GET_CACHE_RSP)).setBuffer(marshal(cache)); down_prot.down(msg); break; Map<Address,IpAddress> cachedAddrs=unmarshal(msg.getRawBuffer(), msg.getOffset(), msg.getLength()); if(cachedAddrs != null) get_cache_promise.setResult(cachedAddrs);
void stopPingerThread() { running=false; synchronized(pinger_mutex) { if(pinger_thread != null && pinger_thread.isAlive()) { regular_sock_close=true; pinger_thread=null; sendPingTermination(); // PATCH by Bruce Schuchardt (http://jira.jboss.com/jira/browse/JGRP-246) teardownPingSocket(); ping_addr_promise.setResult(null); } } }
/** * Determines coordinator C. If C is null and we are the first member, return. Else loop: send GET_CACHE message * to coordinator and wait for GET_CACHE_RSP response. Loop until valid response has been received. */ protected void getCacheFromCoordinator() { Address coord; int attempts=num_tries; get_cache_promise.reset(); while(attempts > 0 && isPingerThreadRunning()) { if((coord=determineCoordinator()) != null) { if(coord.equals(local_addr)) { // we are the first member --> empty cache return; } Message msg=new Message(coord).setFlag(Message.Flag.INTERNAL) .putHeader(this.id, new FdHeader(FdHeader.GET_CACHE)); down_prot.down(msg); Map<Address,IpAddress> result=get_cache_promise.getResult(get_cache_timeout); if(result != null) { cache.addAll(result); log.trace("%s: got cache from %s: cache is %s", local_addr, coord, cache); return; } } --attempts; } }
protected synchronized void stopPingerThread() { ping_addr_promise.setResult(null); get_cache_promise.setResult(null); interruptPingerThread(true); if(pinger_thread != null) { try { pinger_thread.join(Global.THREAD_SHUTDOWN_WAIT_TIME); } catch(InterruptedException ignored) { Thread.currentThread().interrupt(); } pinger_thread=null; } }
if((coord=determineCoordinator()) != null) { if(coord.equals(local_addr)) { // we are the first member --> empty cache if(log.isDebugEnabled()) log.debug("first member; cache is empty");
sendIHaveSockMessage(msg.getSrc(), local_addr, srv_sock_addr); // unicast message to msg.getSrc() return null; sendIHaveSockMessage(msg.getSrc(), hdr.mbr, cache.get(hdr.mbr)); // ucast msg break;
if(hdr.mbrs != null) { log.trace("%s: received SUSPECT message from %s: suspects=%s", local_addr, msg.getSrc(), hdr.mbrs); suspect(hdr.mbrs); sendIHaveSockMessage(msg.getSrc(), local_addr, srv_sock_addr); // unicast message to msg.getSrc() return null; sendIHaveSockMessage(msg.getSrc(), hdr.mbr, addr); // ucast msg break; .putHeader(this.id, new FdHeader(FdHeader.GET_CACHE_RSP)).setBuffer(marshal(cache)); down_prot.down(msg); break; Map<Address,IpAddress> cachedAddrs=unmarshal(msg.getRawBuffer(), msg.getOffset(), msg.getLength()); if(cachedAddrs != null) get_cache_promise.setResult(cachedAddrs);
/** * Interrupts the pinger thread. The Thread.interrupt() method doesn't seem to work under Linux with JDK 1.3.1 * (JDK 1.2.2 had no problems here), therefore we close the socket (setSoLinger has to be set !) if we are * running under Linux. This should be tested under Windows. (Solaris 8 and JDK 1.3.1 definitely works).<p> * Oct 29 2001 (bela): completely removed Thread.interrupt(), but used socket close on all OSs. This makes this * code portable and we don't have to check for OSs.<p/> */ protected synchronized void interruptPingerThread(boolean sendTerminationSignal) { if(isPingerThreadRunning()) { regular_sock_close=true; if (sendTerminationSignal) { sendPingTermination(); // PATCH by Bruce Schuchardt (http://jira.jboss.com/jira/browse/JGRP-246) } teardownPingSocket(); // will wake up the pinger thread. less elegant than Thread.interrupt(), but does the job } }
void handleSocketClose(Exception ex) { teardownPingSocket(); // make sure we have no leftovers if(!regular_sock_close) { // only suspect if socket was not closed regularly (by interruptPingerThread()) if(log.isDebugEnabled()) log.debug("peer " + ping_dest + " closed socket (" + (ex != null ? ex.getClass().getName() : "eof") + ')'); broadcastSuspectMessage(ping_dest); pingable_mbrs.removeElement(ping_dest); } else { if(log.isDebugEnabled()) log.debug("socket to " + ping_dest + " was reset"); regular_sock_close=false; } }
/** * Determines coordinator C. If C is null and we are the first member, return. Else loop: send GET_CACHE message * to coordinator and wait for GET_CACHE_RSP response. Loop until valid response has been received. */ protected void getCacheFromCoordinator() { Address coord; int attempts=num_tries; get_cache_promise.reset(); while(attempts > 0 && isPingerThreadRunning()) { if((coord=determineCoordinator()) != null) { if(coord.equals(local_addr)) { // we are the first member --> empty cache return; } Message msg=new Message(coord).setFlag(Message.Flag.INTERNAL) .putHeader(this.id, new FdHeader(FdHeader.GET_CACHE)); down_prot.down(msg); Map<Address,IpAddress> result=get_cache_promise.getResult(get_cache_timeout); if(result != null) { cache.addAll(result); log.trace("%s: got cache from %s: cache is %s", local_addr, coord, cache); return; } } --attempts; } }
protected synchronized void stopPingerThread() { ping_addr_promise.setResult(null); get_cache_promise.setResult(null); interruptPingerThread(true); if(pinger_thread != null) { try { pinger_thread.join(Global.THREAD_SHUTDOWN_WAIT_TIME); } catch(InterruptedException ignored) { Thread.currentThread().interrupt(); } pinger_thread=null; } }
sendIHaveSockMessage(null, local_addr, srv_sock_addr); srv_sock_sent=true; getCacheFromCoordinator(); got_cache_from_coord=true; while(pingable_mbrs != null && !pingable_mbrs.isEmpty()) { regular_sock_close=false; ping_dest=determinePingDest(); // gets the neighbor to our right if(ping_dest == null || !isPingerThreadRunning()) break; log.debug("%s: pingable_mbrs=%s, ping_dest=%s", local_addr, pingable_mbrs, ping_dest); IpAddress ping_addr=fetchPingAddress(ping_dest); if(ping_addr == null) { log.trace("%s: socket address for %s could not be fetched, retrying", local_addr, ping_dest); if(!setupPingSocket(ping_addr) && isPingerThreadRunning()) { broadcastSuspectMessage(ping_dest); pingable_mbrs.remove(ping_dest); continue; break; case ABNORMAL_TERMINATION: // -1 means EOF handleSocketClose(null); break; default:
broadcastUnuspectMessage(evt.getArg()); break; Object ret=down_prot.down(evt); try { startServerSocket(); stopServerSocket(true); // graceful close break; pingable_mbrs.addAll(new_mbrs); if(new_mbrs.size() > 1) { Address tmp_ping_dest=determinePingDest(); boolean hasNewPingDest = tmp_ping_dest != null && !tmp_ping_dest.equals(ping_dest); if(hasNewPingDest) { interruptPingerThread(false); // allows the thread to use the new socket startPingerThread(); // in case it wasn't running; only starts if not yet running stopPingerThread();