private void onStartFlush(Address flushStarter, FlushHeader fh) { if (stats) { startFlushTime = System.currentTimeMillis(); numberOfFlushes += 1; } boolean amIParticipant = false; synchronized (sharedLock) { flushCoordinator = flushStarter; flushMembers.clear(); if (fh.flushParticipants != null) { flushMembers.addAll(fh.flushParticipants); } flushMembers.removeAll(suspected); amIParticipant = flushMembers.contains(localAddress); } if (amIParticipant) { Message msg = new Message(null); msg.putHeader(getName(), new FlushHeader(FlushHeader.FLUSH_OK,fh.viewID)); down_prot.down(new Event(Event.MSG, msg)); if (log.isDebugEnabled()) log.debug("Received START_FLUSH at " + localAddress + " responded with FLUSH_OK"); } }
private void onResume() { long viewID = currentViewId(); Message msg = new Message(null, localAddress, null); msg.putHeader(getName(), new FlushHeader(FlushHeader.STOP_FLUSH, viewID)); down_prot.down(new Event(Event.MSG, msg)); if (log.isDebugEnabled()) log.debug("Received RESUME at " + localAddress + ", sent STOP_FLUSH to all"); }
FlushHeader fh = new FlushHeader(FlushHeader.FLUSH_COMPLETED,viewID); fh.addDigest(digest); m.putHeader(getName(), fh); if (log.isDebugEnabled()) log.debug(localAddress
reconcileOks.clear(); fh.addDigest(d); msg.putHeader(getName(), fh);
private void handleFlushReconcile(Message msg, FlushHeader fh) { Address requester = msg.getSrc(); Digest reconcileDigest = fh.digest; if (log.isDebugEnabled()) log.debug("Received FLUSH_RECONCILE at " + localAddress + " passing digest to NAKACK " + reconcileDigest); // Let NAKACK reconcile missing messages down_prot.down(new Event(Event.REBROADCAST, reconcileDigest)); if (log.isDebugEnabled()) log.debug("Returned from FLUSH_RECONCILE at " + localAddress + " Sending RECONCILE_OK to " + requester + ", thread " + Thread.currentThread()); Message reconcileOk = new Message(requester); reconcileOk.setFlag(Message.OOB); reconcileOk.putHeader(getName(), new FlushHeader(FlushHeader.FLUSH_RECONCILE_OK)); down_prot.down(new Event(Event.MSG, reconcileOk)); }
private void onSuspect(Address address) { boolean flushOkCompleted = false; Message m = null; long viewID = 0; synchronized (sharedLock) { suspected.add(address); flushMembers.removeAll(suspected); viewID = currentViewId(); flushOkCompleted = !flushOkSet.isEmpty() && flushOkSet.containsAll(flushMembers); if (flushOkCompleted) { m = new Message(flushCoordinator, localAddress, null); } if (log.isDebugEnabled()) log.debug("Suspect is " + address + ",completed " + flushOkCompleted + ", flushOkSet " + flushOkSet + " flushMembers " + flushMembers); } if (flushOkCompleted) { Digest digest = (Digest) down_prot.down(new Event(Event.GET_DIGEST)); FlushHeader fh = new FlushHeader(FlushHeader.FLUSH_COMPLETED,viewID); fh.addDigest(digest); m.putHeader(getName(), fh); down_prot.down(new Event(Event.MSG, m)); if (log.isDebugEnabled()) log.debug(localAddress + " sent FLUSH_COMPLETED message to " + flushCoordinator); } }
private void onSuspend(View view) { Message msg = null; Collection<Address> participantsInFlush = null; synchronized (sharedLock) { // start FLUSH only on group members that we need to flush if (view != null) { participantsInFlush = new ArrayList<Address>(view.getMembers()); participantsInFlush.retainAll(currentView.getMembers()); } else { participantsInFlush = new ArrayList<Address>(currentView.getMembers()); } msg = new Message(null, localAddress, null); msg.putHeader(getName(), new FlushHeader(FlushHeader.START_FLUSH, currentViewId(), participantsInFlush)); } if (participantsInFlush.isEmpty()) { flush_promise.setResult(Boolean.TRUE); } else { down_prot.down(new Event(Event.MSG, msg)); if (log.isDebugEnabled()) log.debug("Flush coordinator " + localAddress + " is starting FLUSH with participants " + participantsInFlush); } }
private void rejectFlush(long viewId, Address flushRequester) { Message reject = new Message(flushRequester, localAddress, null); reject.putHeader(getName(), new FlushHeader(FlushHeader.ABORT_FLUSH,viewId)); down_prot.down(new Event(Event.MSG, reject)); }
msg.putHeader(getName(), new FlushHeader(FlushHeader.STOP_FLUSH_OK,currentViewId())); down_prot.down(new Event(Event.MSG, msg)); if (log.isDebugEnabled())
public Object down(Event evt) { switch (evt.getType()) { case Event.MSG: Message msg = (Message) evt.getArg(); FlushHeader fh = (FlushHeader) msg.getHeader(getName()); if (fh != null && fh.type == FlushHeader.FLUSH_BYPASS) { return down_prot.down(evt); } else { blockMessageDuringFlush(); } break; case Event.GET_STATE: blockMessageDuringFlush(); break; case Event.CONNECT: sendBlockUpToChannel(); break; case Event.SUSPEND: return startFlush(evt, 3, false); case Event.RESUME: onResume(); return null; } return down_prot.down(evt); }
case Event.MSG: Message msg = (Message) evt.getArg(); FlushHeader fh = (FlushHeader) msg.getHeader(getName()); if (fh != null) { if (fh.type == FlushHeader.FLUSH_BYPASS) {