protected void sendEof(Address requester) { try { Message eof_msg=new Message(requester).putHeader(getId(), new StateHeader(StateHeader.STATE_EOF)); log.trace("%s --> EOF --> %s", local_addr, requester); down(eof_msg); } catch(Throwable t) { log.error("%s: failed sending EOF to %s", local_addr, requester); } }
private void forwardTo(Address destination, Message msg) { HTotalHeader hdr=(HTotalHeader)msg.getHeader(getName()); if(hdr == null) { hdr=new HTotalHeader(msg.getDest(), msg.getSrc()); msg.putHeader(getName(), hdr); } msg.setDest(destination); if(log.isTraceEnabled()) log.trace("forwarding message to " + destination + ", hdr=" + hdr); down_prot.down(new Event(Event.MSG, msg)); }
protected void sendResponse(Message rsp, long req_id, boolean is_exception) { Header rsp_hdr=new Header(is_exception? Header.EXC_RSP : Header.RSP, req_id, corr_id); rsp.putHeader(corr_id, rsp_hdr); if(log.isTraceEnabled()) log.trace("sending rsp for %d to %s", req_id, rsp.getDest()); transport.down(rsp); }
public Object down(Message msg) { if(msg.getDest() != null) return down_prot.down(msg); // only process multicast messages if(next == null) // view hasn'<></> been received yet, use the normal transport return down_prot.down(msg); // we need to copy the message, as we cannot do a msg.setSrc(next): the next retransmission // would use 'next' as destination ! Message copy=msg.copy(true); short hdr_ttl=(short)(loopback? view_size -1 : view_size); DaisyHeader hdr=new DaisyHeader(hdr_ttl); copy.setDest(next); copy.putHeader(getId(), hdr); msgs_sent++; if(loopback) { if(log.isTraceEnabled()) log.trace(new StringBuilder("looping back message ").append(msg)); if(msg.getSrc() == null) msg.setSrc(local_addr); default_pool.execute(() -> up_prot.up(msg)); } return down_prot.down(copy); }
protected synchronized boolean handleMessage(Address sender, byte msg_bit) { boolean retval=false; if(this.bit == msg_bit) { this.bit^=1; retval=true; } byte ack_bit=(byte)(this.bit ^ 1); Message ack=new Message(sender).putHeader(id, new ABPHeader(Type.ack, ack_bit)); log.trace("%s: --> %s.ack(%d)", local_addr, sender, ack_bit); down_prot.down(ack); return retval; }
protected void sendRequestForFirstSeqno(Address dest) { if(last_sync_sent.addIfAbsentOrExpired(dest)) { Message msg=new Message(dest).setFlag(Message.Flag.OOB) .putHeader(this.id, UnicastHeader3.createSendFirstSeqnoHeader(timestamper.incrementAndGet())); log.trace("%s --> SEND_FIRST_SEQNO(%s)", local_addr, dest); down_prot.down(msg); } }
protected void sendLockInfoRequestTo(Buffer buf, Address[] mbrs, Address exclude) { Stream.of(mbrs).filter(m -> m != null && !Objects.equals(m, exclude)).forEach(dest -> { Message msg=new Message(dest, buf).putHeader(id, new LockingHeader()); if(bypass_bundling) msg.setFlag(Message.Flag.DONT_BUNDLE); try { down_prot.down(msg); } catch(Throwable t) { log.error("%s: failed sending LOCK_INFO_REQ to %s: %s", local_addr, dest, t); } }); }
public void run() { FD.FdHeader hdr; synchronized(suspected_members) { if(suspected_members.isEmpty()) { stop(); return; } hdr=new FdHeader(FdHeader.SUSPECT); hdr.mbrs=new ArrayList<>(suspected_members); hdr.from=local_addr; } Message suspect_msg=new Message().setFlag(Message.Flag.INTERNAL).putHeader(id, hdr); log.trace("%s: broadcasting SUSPECT message (suspects=%s)", local_addr, suspected_members); down_prot.down(suspect_msg); }
/** Sends or broadcasts a I_HAVE_SOCK response. If 'dst' is null, the reponse will be broadcast, otherwise it will be unicast back to the requester */ protected void sendIHaveSockMessage(Address dst, Address mbr, IpAddress addr) { Message msg=new Message(dst).setFlag(Message.Flag.INTERNAL).setTransientFlag(Message.TransientFlag.DONT_LOOPBACK); FdHeader hdr=new FdHeader(FdHeader.I_HAVE_SOCK, mbr); hdr.sock_addr=addr; msg.putHeader(this.id, hdr); down_prot.down(msg); }
protected void sendSeqnoResponse(Address original_sender,long seqno, int num_seqnos) { SequencerHeader hdr = new SequencerHeader(SequencerHeader.RESPONSE, seqno, num_seqnos); Message ucast_msg = new Message(original_sender).putHeader(this.id, hdr); if (log.isTraceEnabled()) log.trace(local_addr + ": sending seqno response to " + original_sender + ":: new_seqno=" + seqno + ", num_seqnos=" + num_seqnos); down_prot.down(ucast_msg); sent_responses++; }
public void run() { log.trace("%s: broadcasting SUSPECT message (suspected_mbrs=%s)", local_addr, suspects); FdHeader hdr; synchronized(suspects) { if(suspects.isEmpty()) { stopTask(); return; } hdr=new FdHeader(FdHeader.SUSPECT).mbrs(new HashSet<>(suspects)); } Message suspect_msg=new Message().setFlag(Message.Flag.INTERNAL).putHeader(id, hdr); // mcast SUSPECT to all members down_prot.down(suspect_msg); }
protected void sendCredit(Address dest, long credits) { if(log.isTraceEnabled()) log.trace("sending %d credits to %s", credits, dest); Message msg=new Message(dest, longToBuffer(credits)) .setFlag(Message.Flag.OOB, Message.Flag.INTERNAL, Message.Flag.DONT_BUNDLE) .putHeader(this.id,getReplenishHeader()); down_prot.down(msg); num_credit_responses_sent++; }