public NakAckHeader2 copy() { NakAckHeader2 ret=new NakAckHeader2(); ret.type=type; ret.seqno=seqno; ret.sender=sender; return ret; }
protected Message msgFromXmitRsp(Message msg, NakAckHeader2 hdr) { if(msg == null) return null; if(stats) xmit_rsps_received.increment(); msg.setDest(null); NakAckHeader2 newhdr=hdr.copy(); newhdr.type=NakAckHeader2.MSG; // change the type back from XMIT_RSP --> MSG msg.putHeader(id,newhdr); return msg; }
public String toString() { StringBuilder ret=new StringBuilder(); ret.append("[").append(type2Str(type)); switch(type) { case MSG: case XMIT_RSP: // seqno and sender case HIGHEST_SEQNO: ret.append(", seqno=").append(seqno); break; case XMIT_REQ: // range and sender break; } if(sender != null) ret.append(", sender=").append(sender); ret.append(']'); return ret.toString(); }
/** * ensure that multicast events are recorded in DMStats */ @Test public void testMulticastStats() throws Exception { Message msg = mock(Message.class); when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createMessageHeader(1L)); when(msg.size()).thenReturn(150L); Event evt = new Event(Event.MSG, msg); recorder.up(evt); assertTrue("mcastMessagesReceived = " + stats.mcastMessagesReceived, stats.mcastMessagesReceived == 1); assertEquals(stats.mcastMessageBytesReceived, 150); recorder.down(evt); assertTrue("mcastMessagesSent = " + stats.mcastMessagesSent, stats.mcastMessagesSent == 1); assertEquals(stats.mcastMessageBytesSent, 150); msg = mock(Message.class); when(msg.size()).thenReturn(150L); when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitRequestHeader(null)); evt = new Event(Event.MSG, msg); recorder.down(evt); assertTrue("mcastRetransmitRequests = " + stats.mcastRetransmitRequests, stats.mcastRetransmitRequests == 1); msg = mock(Message.class); when(msg.size()).thenReturn(150L); when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitResponseHeader()); evt = new Event(Event.MSG, msg); recorder.down(evt); assertTrue("mcastRetransmits = " + stats.mcastRetransmits, stats.mcastRetransmits == 1); }
protected void retransmit(SeqnoList missing_msgs, final Address sender, boolean multicast_xmit_request) { Address dest=(multicast_xmit_request || this.use_mcast_xmit_req)? null : sender; // to whom do we send the XMIT request ? if(xmit_from_random_member && !local_addr.equals(sender)) { Address random_member=Util.pickRandomElement(members); if(random_member != null && !local_addr.equals(random_member)) dest=random_member; } Message retransmit_msg=new Message(dest).setBuffer(Util.streamableToBuffer(missing_msgs)) .setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(this.id, NakAckHeader2.createXmitRequestHeader(sender)); log.trace("%s: sending XMIT_REQ (%s) to %s", local_addr, missing_msgs, dest); down_prot.down(retransmit_msg); if(stats) xmit_reqs_sent.add(missing_msgs.size()); }
do { try { msg.putHeader(this.id, NakAckHeader2.createMessageHeader(msg_id)); buf.add(msg_id, msg, dont_loopback_set? dont_loopback_filter : null); break;
protected void execute(long seqno) { if(seqno == 0 || skip_next_resend.compareAndSet(true,false)) return; if(seqno == last_seqno_resent && num_resends >= resend_last_seqno_max_times) return; if(seqno > last_seqno_resent) { last_seqno_resent=seqno; num_resends=1; } else num_resends++; Message msg=new Message(null).putHeader(id, NakAckHeader2.createHighestSeqnoHeader(seqno)) .setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .setTransientFlag(Message.TransientFlag.DONT_LOOPBACK); // we don't need to receive our own broadcast down_prot.down(msg); } }
private void processForMulticast(Message msg, int direction) { Object o = msg.getHeader(nakackHeaderId); if (o instanceof NakAckHeader2 && stats != null) { NakAckHeader2 hdr = (NakAckHeader2) o; switch (direction) { case INCOMING: stats.incMcastReadBytes((int) msg.size()); break; case OUTGOING: stats.incMcastWriteBytes((int) msg.size()); switch (hdr.getType()) { case NakAckHeader2.XMIT_RSP: stats.incMcastRetransmits(); break; case NakAckHeader2.XMIT_REQ: stats.incMcastRetransmitRequests(); break; } break; } } }
recordScheduledSeqno(msg.getSender(), header.getSeqno());
protected void retransmit(SeqnoList missing_msgs, final Address sender, boolean multicast_xmit_request) { Address dest=(multicast_xmit_request || this.use_mcast_xmit_req)? null : sender; // to whom do we send the XMIT request ? if(xmit_from_random_member && !local_addr.equals(sender)) { Address random_member=Util.pickRandomElement(members); if(random_member != null && !local_addr.equals(random_member)) dest=random_member; } Message retransmit_msg=new Message(dest).setBuffer(Util.streamableToBuffer(missing_msgs)) .setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .putHeader(this.id, NakAckHeader2.createXmitRequestHeader(sender)); log.trace("%s: sending XMIT_REQ (%s) to %s", local_addr, missing_msgs, dest); down_prot.down(retransmit_msg); if(stats) xmit_reqs_sent.add(missing_msgs.size()); }
do { try { msg.putHeader(this.id, NakAckHeader2.createMessageHeader(msg_id)); buf.add(msg_id, msg, dont_loopback_set? dont_loopback_filter : null); break;
protected void execute(long seqno) { if(seqno == 0 || skip_next_resend.compareAndSet(true,false)) return; if(seqno == last_seqno_resent && num_resends >= resend_last_seqno_max_times) return; if(seqno > last_seqno_resent) { last_seqno_resent=seqno; num_resends=1; } else num_resends++; Message msg=new Message(null).putHeader(id, NakAckHeader2.createHighestSeqnoHeader(seqno)) .setFlag(Message.Flag.OOB, Message.Flag.INTERNAL) .setTransientFlag(Message.TransientFlag.DONT_LOOPBACK); // we don't need to receive our own broadcast down_prot.down(msg); } }
private void processForMulticast(Message msg, int direction) { Object o = msg.getHeader(nakackHeaderId); // logger.debug("sending message with NakAck header {}: {}", o, msg); if (o instanceof NakAckHeader2 && stats != null) { NakAckHeader2 hdr = (NakAckHeader2)o; switch (direction) { case INCOMING: stats.incMcastReadBytes((int)msg.size()); break; case OUTGOING: stats.incMcastWriteBytes((int)msg.size()); switch (hdr.getType()) { case NakAckHeader2.XMIT_RSP: stats.incMcastRetransmits(); break; case NakAckHeader2.XMIT_REQ: stats.incMcastRetransmitRequests(); break; } break; } } }
public static NakAckHeader2 createMessageHeader(long seqno) { return new NakAckHeader2(MSG, seqno); }
protected void handleXmitRsp(Message msg, NakAckHeader2 hdr) { if(msg == null) return; try { if(stats) xmit_rsps_received.increment(); msg.setDest(null); NakAckHeader2 newhdr=hdr.copy(); newhdr.type=NakAckHeader2.MSG; // change the type back from XMIT_RSP --> MSG msg.putHeader(id, newhdr); handleMessage(msg, newhdr); if(rebroadcasting) checkForRebroadcasts(); } catch(Exception ex) { log.error(Util.getMessage("FailedToDeliverMsg"), local_addr, "retransmitted message", msg, ex); } }
public String toString() { StringBuilder ret=new StringBuilder(); ret.append("[").append(type2Str(type)); switch(type) { case MSG: case XMIT_RSP: // seqno and sender case HIGHEST_SEQNO: ret.append(", seqno=").append(seqno); break; case XMIT_REQ: // range and sender break; } if(sender != null) ret.append(", sender=").append(sender); ret.append(']'); return ret.toString(); }
public static NakAckHeader2 createXmitRequestHeader(Address orginal_sender) { return new NakAckHeader2(XMIT_REQ, orginal_sender); }
/** * Sends a message msg to the requester. We have to wrap the original message into a retransmit message, as we need * to preserve the original message's properties, such as src, headers etc. * @param dest * @param msg */ protected void sendXmitRsp(Address dest, Message msg) { if(msg == null) return; if(stats) xmit_rsps_sent.increment(); if(msg.getSrc() == null) msg.setSrc(local_addr); if(use_mcast_xmit) { // we simply send the original multicast message down_prot.down(msg); return; } Message xmit_msg=msg.copy(true, true).dest(dest); // copy payload and headers NakAckHeader2 hdr=xmit_msg.getHeader(id); NakAckHeader2 newhdr=hdr.copy(); newhdr.type=NakAckHeader2.XMIT_RSP; // change the type in the copy from MSG --> XMIT_RSP xmit_msg.putHeader(id, newhdr); down_prot.down(xmit_msg); }
public static NakAckHeader2 createXmitResponseHeader() { return new NakAckHeader2(XMIT_RSP, -1); }
protected Message msgFromXmitRsp(Message msg, NakAckHeader2 hdr) { if(msg == null) return null; if(stats) xmit_rsps_received.increment(); msg.setDest(null); NakAckHeader2 newhdr=hdr.copy(); newhdr.type=NakAckHeader2.MSG; // change the type back from XMIT_RSP --> MSG msg.putHeader(id,newhdr); return msg; }