forked from I2P_Developers/i2p.i2p
* Streaming:
- Make flush() block less, by waiting only for "accept" into the streaming queue rather than "completion" (i.e. ACK from the far end). This prevents complete window stalls when flushing, and should help performance of apps that use flush(), like i2psnark (and SAM?). close() still does a flush that waits for completion, as i2ptunnel doesn't like a fast return from close(). - flush/close javadocs and comments * i2ptunnel: - Now that streaming flush() is fixed, use it in IRCClient, and for initial data in I2PTunnelRunner, to avoid the 250 ms passive flush delay
This commit is contained in:
@@ -9,7 +9,6 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
@@ -124,7 +123,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
if (size == 1) // skip the rand in the most common case
|
||||
return dests.get(0);
|
||||
int index = I2PAppContext.getGlobalContext().random().nextInt(size);
|
||||
int index = _context.random().nextInt(size);
|
||||
return dests.get(index);
|
||||
}
|
||||
|
||||
@@ -182,6 +181,8 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// probably doesn't do much but can't hurt
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("inbound BLOCKED: "+inmsg);
|
||||
@@ -257,6 +258,8 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
outmsg=outmsg+"\r\n"; // rfc1459 sec. 2.3
|
||||
output.write(outmsg.getBytes("ISO-8859-1"));
|
||||
// save 250 ms in streaming
|
||||
output.flush();
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("outbound BLOCKED: "+"\""+inmsg+"\"");
|
||||
|
@@ -129,7 +129,14 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
|
||||
// do NOT flush here, it will block and then onTimeout.run() won't happen on fail.
|
||||
// But if we don't flush, then we have to wait for the connectDelay timer to fire
|
||||
// in i2p socket? To be researched and/or fixed.
|
||||
//i2pout.flush();
|
||||
//
|
||||
// AS OF 0.8.1, MessageOutputStream.flush() is fixed to only wait for accept,
|
||||
// not for "completion" (i.e. an ACK from the far end).
|
||||
// So we now get a fast return from flush(), and can do it here to save 250 ms.
|
||||
// To make sure we are under the initial window size and don't hang waiting for accept,
|
||||
// only flush if it fits in one message.
|
||||
if (initialI2PData.length <= 1730) // ConnectionOptions.DEFAULT_MAX_MESSAGE_SIZE
|
||||
i2pout.flush();
|
||||
}
|
||||
}
|
||||
if (initialSocketData != null) {
|
||||
|
Reference in New Issue
Block a user