public void handle(Address state_requester) { handleStateReq(state_requester); }
public Object up(Message msg) { StateHeader hdr=msg.getHeader(this.id); if(hdr == null) return up_prot.up(msg); switch(hdr.type) { case StateHeader.STATE_REQ: state_requesters.add(msg.getSrc()); break; case StateHeader.STATE_RSP: handleStateRsp(hdr.getDigest(), msg.getSrc(), msg.getBuffer()); break; case StateHeader.STATE_EX: closeHoleFor(msg.getSrc()); try { handleException(Util.exceptionFromBuffer(msg.getRawBuffer(), msg.getOffset(), msg.getLength())); } catch(Throwable t) { log.error("failed deserializaing state exception", t); } break; default: log.error("%s: type %s not known in StateHeader", local_addr, hdr.type); break; } return null; }
public Object up(Event evt) { switch(evt.getType()) { case Event.TMP_VIEW: case Event.VIEW_CHANGE: handleViewChange(evt.getArg()); break; case Event.CONFIG: Map<String,Object> config=evt.getArg(); if(config != null && config.containsKey("state_transfer")) log.error(Util.getMessage("ProtocolStackCannotContainTwoStateTransferProtocolsRemoveEitherOneOfThem")); break; } return up_prot.up(evt); }
if(isDigestNeeded()) { try { punchHoleFor(requester); closeBarrierAndSuspendStable(); digest=(Digest)down_prot.down(Event.GET_DIGEST_EVT); sendException(requester, t); resumeStable(); closeHoleFor(requester); return; openBarrier(); getStateFromApplication(requester, digest); sendException(requester, t); if(isDigestNeeded()) { closeHoleFor(requester); resumeStable();
protected void handleException(Throwable exception) { if(isDigestNeeded()) openBarrierAndResumeStable(); up_prot.up(new Event(Event.GET_STATE_OK, new StateTransferResult(exception))); }
/** Set the digest and the send the state up to the application */ protected void handleStateRsp(final Digest digest, Address sender, byte[] state) { try { if(isDigestNeeded()) { punchHoleFor(sender); closeBarrierAndSuspendStable(); // fix for https://jira.jboss.org/jira/browse/JGRP-1013 if(digest != null) down_prot.down(new Event(Event.OVERWRITE_DIGEST, digest)); // set the digest (e.g. in NAKACK) } waiting_for_state_response=false; stop=System.currentTimeMillis(); log.debug("%s: received state, size=%s, time=%d milliseconds", local_addr, (state == null? "0" : Util.printBytes(state.length)), stop - start); StateTransferResult result=new StateTransferResult(state); up_prot.up(new Event(Event.GET_STATE_OK, result)); down_prot.down(new Event(Event.GET_VIEW_FROM_COORD)); // https://issues.jboss.org/browse/JGRP-1751 } catch(Throwable t) { handleException(t); } finally { if(isDigestNeeded()) { closeHoleFor(sender); openBarrierAndResumeStable(); } } }
handleStateReq(hdr); break; case StateHeader.STATE_RSP: handleStateRsp(hdr, msg.getBuffer()); if(flushProtocolInStack) { up_prot.up(new Event(Event.RESUME)); handleViewChange((View)evt.getArg()); break;
handleViewChange(evt.getArg()); break; StateTransferInfo info=evt.getArg(); if(info.target == null) { target=determineCoordinator();
public void openBarrier() { if(!isDigestNeeded()) return; log.trace("%s: sending down OPEN_BARRIER", local_addr); down_prot.down(new Event(Event.OPEN_BARRIER)); }
protected void sendException(Address requester, Throwable exception) { try { Message ex_msg=new Message(requester).setBuffer(Util.exceptionToBuffer(exception)) .putHeader(getId(), new StateHeader(StateHeader.STATE_EX)); down(ex_msg); } catch(Throwable t) { log.error("%s: failed sending exception %s to %s", local_addr, exception, requester); } }
if(!isDigestNeeded()) { // state transfer is in progress, digest was already requested requestApplicationStates(sender, false); log.debug("digest is " + digest + ", getting application state"); try { requestApplicationStates(sender, !flushProtocolInStack);
private void handleViewChange(View v) { Address old_coord; Vector new_members=v.getMembers(); boolean send_up_null_state_rsp=false; synchronized(members) { old_coord=(Address)(!members.isEmpty()? members.firstElement() : null); members.clear(); members.addAll(new_members); // this handles the case where a coord dies during a state transfer; prevents clients from hanging forever // Note this only takes a coordinator crash into account, a getState(target, timeout), where target is not // null is not handled ! (Usually we get the state from the coordinator) // http://jira.jboss.com/jira/browse/JGRP-148 if(waiting_for_state_response && old_coord != null && !members.contains(old_coord)) { send_up_null_state_rsp=true; } } if(send_up_null_state_rsp) { if(log.isWarnEnabled()) log.warn("discovered that the state provider (" + old_coord + ") crashed; will return null state to application"); StateHeader hdr=new StateHeader(StateHeader.STATE_RSP, local_addr, 0, null, null); handleStateRsp(hdr, null); // sends up null GET_STATE_OK } }
if(isDigestNeeded()) { try { punchHoleFor(requester); closeBarrierAndSuspendStable(); digest=(Digest)down_prot.down(Event.GET_DIGEST_EVT); sendException(requester, t); resumeStable(); closeHoleFor(requester); return; openBarrier(); getStateFromApplication(requester, digest); sendException(requester, t); if(isDigestNeeded()) { closeHoleFor(requester); resumeStable();
/** Set the digest and the send the state up to the application */ protected void handleStateRsp(final Digest digest, Address sender, byte[] state) { try { if(isDigestNeeded()) { punchHoleFor(sender); closeBarrierAndSuspendStable(); // fix for https://jira.jboss.org/jira/browse/JGRP-1013 if(digest != null) down_prot.down(new Event(Event.OVERWRITE_DIGEST, digest)); // set the digest (e.g. in NAKACK) } waiting_for_state_response=false; stop=System.currentTimeMillis(); log.debug("%s: received state, size=%s, time=%d milliseconds", local_addr, (state == null? "0" : Util.printBytes(state.length)), stop - start); StateTransferResult result=new StateTransferResult(state); up_prot.up(new Event(Event.GET_STATE_OK, result)); down_prot.down(new Event(Event.GET_VIEW_FROM_COORD)); // https://issues.jboss.org/browse/JGRP-1751 } catch(Throwable t) { handleException(t); } finally { if(isDigestNeeded()) { closeHoleFor(sender); openBarrierAndResumeStable(); } } }
handleViewChange((View)evt.getArg()); break; StateTransferInfo info=(StateTransferInfo)evt.getArg(); if(info.target == null) { target=determineCoordinator();
@ManagedOperation(description="Opens BARRIER and resumes STABLE") public void openBarrierAndResumeStable() { if(!isDigestNeeded()) return; log.trace("%s: sending down OPEN_BARRIER and RESUME_STABLE", local_addr); down_prot.down(new Event(Event.OPEN_BARRIER)); down_prot.down(new Event(Event.RESUME_STABLE)); }
protected void handleException(Throwable exception) { if(isDigestNeeded()) openBarrierAndResumeStable(); up_prot.up(new Event(Event.GET_STATE_OK, new StateTransferResult(exception))); }
protected void sendException(Address requester, Throwable exception) { try { Message ex_msg=new Message(requester).setBuffer(Util.exceptionToBuffer(exception)) .putHeader(getId(), new StateHeader(StateHeader.STATE_EX)); down(ex_msg); } catch(Throwable t) { log.error("%s: failed sending exception %s to %s", local_addr, exception, requester); } }
handleViewChange(evt.getArg()); break; StateTransferInfo info=evt.getArg(); if(info.target == null) { target=determineCoordinator();
public Object up(Message msg) { StateHeader hdr=msg.getHeader(this.id); if(hdr == null) return up_prot.up(msg); switch(hdr.type) { case StateHeader.STATE_REQ: state_requesters.add(msg.getSrc()); break; case StateHeader.STATE_RSP: handleStateRsp(hdr.getDigest(), msg.getSrc(), msg.getBuffer()); break; case StateHeader.STATE_EX: closeHoleFor(msg.getSrc()); try { handleException(Util.exceptionFromBuffer(msg.getRawBuffer(), msg.getOffset(), msg.getLength())); } catch(Throwable t) { log.error("failed deserializaing state exception", t); } break; default: log.error("%s: type %s not known in StateHeader", local_addr, hdr.type); break; } return null; }