if(coord != null) { ViewId view_id=view != null? view.getViewId() : null; Message msg=new Message(coord).putHeader(id, new GmsHeader(GmsHeader.GET_CURRENT_VIEW)) .setBuffer(marshal(view_id)).setFlag(OOB, Message.Flag.INTERNAL); down_prot.down(msg);
protected boolean serverChallenge(GmsHeader gmsHeader, SaslHeader saslHeader, Message msg) { switch (gmsHeader.getType()) { case GmsHeader.JOIN_REQ: case GmsHeader.JOIN_REQ_WITH_STATE_TRANSFER: } else { log.warn("failed to validate SaslHeader from %s, header: %s", msg.getSrc(), saslHeader); sendRejectionMessage(gmsHeader.getType(), msg.getSrc(), "authentication failed"); return false; sendRejectionMessage(gmsHeader.getType(), msg.getSrc(), "authentication failed"); } catch (InterruptedException e) { return false;
public String toString() { StringBuilder sb=new StringBuilder("GmsHeader[").append(type2String(type) + ']'); switch(type) { case JOIN_REQ: case LEAVE_REQ: case GET_DIGEST_REQ: sb.append(": mbr=" + mbr); break; case MERGE_REQ: sb.append(": merge_id=" + merge_id); break; case MERGE_RSP: sb.append("merge_id=" + merge_id); if(merge_rejected) sb.append(", merge_rejected=" + merge_rejected); break; case CANCEL_MERGE: sb.append(", merge_id=" + merge_id); break; } return sb.toString(); }
log.trace("%s: sending request for full view to %s", local_addr, msg.src()); Message full_view_req=new Message(msg.src()) .putHeader(id, new GmsHeader(GmsHeader.GET_CURRENT_VIEW)).setFlag(OOB, INTERNAL); down_prot.down(full_view_req); return null; Message get_digest_rsp=new Message(msg.getSrc()) .setFlag(OOB, Message.Flag.INTERNAL) .putHeader(this.id, new GmsHeader(GmsHeader.GET_DIGEST_RSP)) .setBuffer(marshal(null, digest)); down_prot.down(get_digest_rsp); Message view_msg=new Message(msg.getSrc()).putHeader(id,new GmsHeader(GmsHeader.VIEW)) .setBuffer(marshal(view, null)).setFlag(OOB, Message.Flag.INTERNAL); down_prot.down(view_msg);
GMS.GmsHeader tmphdr=new GMS.GmsHeader(GMS.GmsHeader.VIEW_ACK); view_ack.putHeader(GMS.name, tmphdr); if(!gms.members.contains(coord))
hdr=new GMS.GmsHeader(GMS.GmsHeader.MERGE_REQ); hdr.mbr=gms.local_addr; hdr.merge_id=merge_id;
if(coord != null) { ViewId view_id=view != null? view.getViewId() : null; Message msg=new Message(coord).putHeader(id, new GmsHeader(GmsHeader.GET_CURRENT_VIEW)) .setBuffer(marshal(view_id)).setFlag(OOB, Message.Flag.INTERNAL); down_prot.down(msg);
if((hdr != null) && (hdr.getType() == GMS.GmsHeader.JOIN_REQ)){ if(log.isDebugEnabled()){ log.debug("AUTH got up event");
Message view_change_msg=new Message().putHeader(this.id, new GmsHeader(GmsHeader.VIEW)) .setBuffer(marshal(new_view, digest)).setTransientFlag(Message.TransientFlag.DONT_LOOPBACK); if(new_view instanceof MergeView) // https://issues.jboss.org/browse/JGRP-1484
for(Address coord: coords) { Message msg=new Message(coord).setBuffer(GMS.marshal(view, digest)) .putHeader(gms.getId(),new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW).mergeId(merge_id)); gms.getDownProtocol().down(msg);
hdr=new GmsHeader(GmsHeader.VIEW, new_view); hdr.my_digest=digest; view_change_msg.putHeader(name, hdr);
protected boolean serverChallenge(GmsHeader gmsHeader, SaslHeader saslHeader, Message msg) { switch (gmsHeader.getType()) { case GmsHeader.JOIN_REQ: case GmsHeader.JOIN_REQ_WITH_STATE_TRANSFER: } else { log.warn("failed to validate SaslHeader from %s, header: %s", msg.getSrc(), saslHeader); sendRejectionMessage(gmsHeader.getType(), msg.getSrc(), "authentication failed"); return false; sendRejectionMessage(gmsHeader.getType(), msg.getSrc(), "authentication failed"); } catch (InterruptedException e) { return false;
coord=(Address)coords.elementAt(i); msg=new Message(coord, null, null); hdr=new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW); hdr.view=v; hdr.my_digest=d;
public String toString() { StringBuilder sb=new StringBuilder("GmsHeader"); sb.append('[' + type2String(type) + ']'); switch(type) { case JOIN_REQ:
.putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.GET_DIGEST_REQ).mergeId(merge_id));
/** * Sends a MERGE_REQ to all coords and populates a list of MergeData (in merge_rsps). Returns after coords.size() * response have been received, or timeout msecs have elapsed (whichever is first).<p> * If a subgroup coordinator rejects the MERGE_REQ (e.g. because of participation in a different merge), * <em>that member will be removed from coords !</em> * @param coords A map of coordinatgor addresses and associated membership lists * @param new_merge_id The new merge id * @param timeout Max number of msecs to wait for the merge responses from the subgroup coords */ protected boolean getMergeDataFromSubgroupCoordinators(Map<Address,Collection<Address>> coords, MergeId new_merge_id, long timeout) { boolean gotAllResponses; long start=System.currentTimeMillis(); merge_rsps.reset(coords.keySet()); log.trace("%s: sending MERGE_REQ to %s", gms.local_addr, coords.keySet()); for(Map.Entry<Address,Collection<Address>> entry: coords.entrySet()) { Address coord=entry.getKey(); Collection<Address> mbrs=entry.getValue(); Message msg=new Message(coord).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.MERGE_REQ).mbr(gms.local_addr).mergeId(new_merge_id)) .setBuffer(GMS.marshal(mbrs)); gms.getDownProtocol().down(msg); } // wait until num_rsps_expected >= num_rsps or timeout elapsed merge_rsps.waitForAllResponses(timeout); gotAllResponses=merge_rsps.hasAllResponses(); long time=System.currentTimeMillis() - start; log.trace("%s: collected %d merge response(s) in %d ms", gms.local_addr, merge_rsps.numberOfValidResponses(), time); return gotAllResponses; }
/** * An event is to be sent down the stack. The layer may want to examine its type and perform * some action on it, depending on the event's type. If the event is a message MSG, then * the layer may need to add a header to it (or do nothing at all) before sending it down * the stack using <code>down_prot.down()</code>. In case of a GET_ADDRESS event (which tries to * retrieve the stack's address from one of the bottom layers), the layer may need to send * a new response event back up the stack using <code>up_prot.up()</code>. */ public Object down(Event evt) { GMS.GmsHeader hdr = isJoinMessage(evt); if((hdr != null) && (hdr.getType() == GMS.GmsHeader.JOIN_REQ)){ if(log.isDebugEnabled()){ log.debug("AUTH got down event"); } //we found a join request message - now add an AUTH Header Message msg = (Message)evt.getArg(); AuthHeader authHeader = new AuthHeader(); authHeader.setToken(this.serverSideToken); msg.putHeader(AUTH.NAME, authHeader); if(log.isDebugEnabled()){ log.debug("AUTH passing down event"); } } if((hdr != null) && (hdr.getType() == GMS.GmsHeader.JOIN_RSP)){ if(log.isDebugEnabled()){ log.debug(hdr.toString()); } } return down_prot.down(evt); }
/** * If merge_id is not equal to this.merge_id then discard. Else cast the view/digest to all members of this group. */ public void handleMergeView(final MergeData data, final MergeId merge_id) { if(!matchMergeId(merge_id)) { log.trace("%s: merge_ids (mine: %s, received: %s) don't match; merge view %s is discarded", gms.local_addr, this.merge_id, merge_id, data.view.getViewId()); return; } // only send to our *current* members, if we have A and B being merged (we are B), then we would *not* // want to block on a VIEW_ACK from A because A doesn't see us in the pre-merge view yet and discards the view List<Address> expected_acks=gms.members.getMembers(); try { gms.castViewChangeAndSendJoinRsps(data.view, data.digest, expected_acks, null, null); // if we have flush in stack send ack back to merge coordinator if(gms.flushProtocolInStack) { //[JGRP-700] - FLUSH: flushing should span merge Message ack=new Message(data.getSender()).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW_OK)); gms.getDownProtocol().down(ack); } } finally { cancelMerge(merge_id); } }
/** * An event was received from the layer below. Usually the current layer will want to examine the event type and * - depending on its type - perform some computation (e.g. removing headers from a MSG event type, or updating * the internal membership list when receiving a VIEW_CHANGE event). * Finally the event is either a) discarded, or b) an event is sent down the stack using {@code down_prot.down()} * or c) the event (or another event) is sent up the stack using {@code up_prot.up()}. */ public Object up(Message msg) { // If we have a join or merge request --> authenticate, else pass up GMS.GmsHeader gms_hdr=getGMSHeader(msg); if(gms_hdr != null && needsAuthentication(gms_hdr)) { AuthHeader auth_hdr=msg.getHeader(id); if(auth_hdr == null) { sendRejectionMessage(gms_hdr.getType(), msg.src(), "no AUTH header found in message"); throw new IllegalStateException(String.format("found %s from %s but no AUTH header", gms_hdr, msg.src())); } if(!handleAuthHeader(gms_hdr, auth_hdr, msg)) // authentication failed return null; // don't pass up } if(!callUpHandlers(msg)) return null; return up_prot.up(msg); }
private void handleView(View v, Address sender) { Vector members=v.getMembers(); if(!members.contains(local_addr)) { if(log.isWarnEnabled()) log.warn("discarding view as I (" + local_addr + ") am not member of view (" + v + ")"); return; } ViewId vid=v.getVid(); int rc=vid.compareTo(my_vid); if(rc > 0) { // foreign view is greater than my own view; update my own view ! if(log.isTraceEnabled()) log.trace("view from " + sender + " (" + vid + ") is greater than my own view (" + my_vid + ");" + " will update my own view"); Message view_change=new Message(local_addr, local_addr, null); org.jgroups.protocols.pbcast.GMS.GmsHeader hdr; hdr=new org.jgroups.protocols.pbcast.GMS.GmsHeader(org.jgroups.protocols.pbcast.GMS.GmsHeader.VIEW, v); view_change.putHeader(GMS.name, hdr); up_prot.up(new Event(Event.MSG, view_change)); num_views_adjusted++; } }