public boolean ack(int start, int end) { return ack(start, end, null); }
public void lost() { Iterator<MessageWrapper> msgIt = messages.iterator(); Iterator<int[]> rangeIt = ranges.iterator(); while(msgIt.hasNext()) { MessageWrapper wrapper = msgIt.next(); int[] range = rangeIt.next(); wrapper.lost(range[0], range[1]); } }
for(Map<Integer, MessageWrapper> started : startedByPrio) { for(MessageWrapper wrapper : started.values()) { if(wrapper.allSent()) continue; long d = wrapper.getItem().getDeadline(); if(d > 0) ret = Math.min(ret, d); else Logger.error(this, "Started sending message "+wrapper.getItem()+" but deadline is "+d);
@Override public List<MessageItem> onDisconnect() { int messageSize = 0; final List<MessageItem> items = new ArrayList<>(); // LOCKING: No packet may be sent while connected = false. // So we guarantee that no more packets are sent by setting this here. synchronized(sendBufferLock) { for(Map<Integer, MessageWrapper> queue : startedByPrio) { for(MessageWrapper wrapper : queue.values()) { items.add(wrapper.getItem()); messageSize += wrapper.getLength(); } queue.clear(); } sendBufferUsed -= messageSize; // This is just a check for logging/debugging purposes. if(sendBufferUsed != 0) { Logger.warning(this, "Possible leak in transport code: Buffer size not empty after disconnecting on "+this+" for "+pn+" after removing "+messageSize+" total was "+sendBufferUsed); sendBufferUsed = 0; } } return items; }
public void testLost() { MessageItem item = new MessageItem(new byte[363], null, false, null, (short) 0, false, false); MessageWrapper wrapper = new MessageWrapper(item, 0); MessageFragment frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertEquals(121, frag.fragmentLength); wrapper.ack(frag.fragmentOffset, frag.fragmentOffset + frag.fragmentLength - 1); frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertEquals(121, frag.fragmentLength); assertEquals(121, wrapper.lost(frag.fragmentOffset, frag.fragmentOffset + frag.fragmentLength - 1)); // 0->120 should still be sent and acked, 121->241 should not for(int[] range : wrapper.getSent()) { if(range[0] >= 121 || range[1] >= 121) { fail("Expected 0->120, but got " + wrapper.getSent()); } } for(int[] range : wrapper.getAcks()) { if(range[0] >= 121 || range[1] >= 121) { fail("Expected 0->120, but got " + wrapper.getSent()); } } } }
public void testGetFragmentWithLoss() { MessageItem item = new MessageItem(new byte[363], null, false, null, (short) 0, false, false); MessageWrapper wrapper = new MessageWrapper(item, 0); MessageFragment frag1 = wrapper.getMessageFragment(128); assertNotNull(frag1); assertTrue(frag1.firstFragment); assertSame(wrapper, frag1.wrapper); MessageFragment frag2 = wrapper.getMessageFragment(128); assertNotNull(frag2); assertFalse(frag2.firstFragment); assertSame(wrapper, frag2.wrapper); MessageFragment frag3 = wrapper.getMessageFragment(128); assertNotNull(frag3); assertFalse(frag3.firstFragment); assertSame(wrapper, frag3.wrapper); wrapper.ack(0, 120); // frag1 wrapper.ack(242, 262); // frag3 wrapper.lost(121, 241); // frag 2 MessageFragment frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertFalse(frag.firstFragment);
MessageWrapper wrapper = it.next(); while(packet.getLength() < maxPacketSize) { MessageFragment frag = wrapper.getMessageFragment(maxPacketSize - packet.getLength()); if(frag == null) break; mustSend = true; packet.addMessageFragment(frag); sentPacket.addFragment(frag); if(wrapper.allSent()) { if((haveAddedStatsBulk == null) && wrapper.getItem().sendLoadBulk) { addStatsBulk = true; if((haveAddedStatsRT == null) && wrapper.getItem().sendLoadRT) { addStatsRT = true; MessageWrapper wrapper = new MessageWrapper(item, messageID); MessageFragment frag = wrapper.getMessageFragment(maxPacketSize - packet.getLength()); if(frag == null) { messageQueue.pushfrontPrioritizedMessageItem(item); if(wrapper.allSent()) { if((haveAddedStatsBulk == null) && wrapper.getItem().sendLoadBulk) { addStatsBulk = true; break; if((haveAddedStatsRT == null) && wrapper.getItem().sendLoadRT) { addStatsRT = true; break;
Logger.debug(this, "Acknowledging "+range[0]+" to "+range[1]+" on "+wrapper.getMessageID()); if(wrapper.ack(range[0], range[1], npf.pn)) { Map<Integer, MessageWrapper> started = npf.startedByPrio.get(wrapper.getPriority()); MessageWrapper removed = null; synchronized(npf.sendBufferLock) { removed = started.remove(wrapper.getMessageID()); if(removed != null) { int size = wrapper.getLength(); npf.sendBufferUsed -= size; if(logDEBUG) Logger.debug(this, "Removed " + size + " from remote buffer. Total is now " + npf.sendBufferUsed); Logger.minor(this, "Completed message "+wrapper.getMessageID()+" but it is not in the map from "+wrapper); if(logDEBUG) Logger.debug(this, "Completed message "+wrapper.getMessageID()+" from "+wrapper); int id = wrapper.getMessageID(); synchronized(npf) { npf.ackedMessages.add(id, id);
public void testGetFragment() { MessageItem item = new MessageItem(new byte[1024], null, false, null, (short) 0, false, false); MessageWrapper wrapper = new MessageWrapper(item, 0); MessageFragment frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertTrue(frag.firstFragment); assertSame(wrapper, frag.wrapper); frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertFalse(frag.firstFragment); frag = wrapper.getMessageFragment(782); assertNotNull(frag); assertEquals(775, frag.fragmentLength); assertEquals(242, frag.fragmentOffset); frag = wrapper.getMessageFragment(128); assertNotNull(frag); assertFalse(frag.firstFragment);
for(Map<Integer, MessageWrapper> started : startedByPrio) { for(MessageWrapper wrapper : started.values()) { if(!wrapper.allSent()) return true;