diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TransportConnectionWriter.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TransportConnectionWriter.java index 219f33efe..4ed5ba1ed 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TransportConnectionWriter.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TransportConnectionWriter.java @@ -22,6 +22,11 @@ public interface TransportConnectionWriter { */ int getMaxIdleTime(); + /** + * Returns true if the transport is lossy and cheap. + */ + boolean isLossyAndCheap(); + /** * Returns an output stream for writing to the transport connection. */ diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/AbstractDuplexTransportConnection.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/AbstractDuplexTransportConnection.java index 27aad596a..64a13f5e1 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/AbstractDuplexTransportConnection.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/AbstractDuplexTransportConnection.java @@ -79,6 +79,11 @@ public abstract class AbstractDuplexTransportConnection return plugin.getMaxIdleTime(); } + @Override + public boolean isLossyAndCheap() { + return false; + } + @Override public OutputStream getOutputStream() throws IOException { return AbstractDuplexTransportConnection.this.getOutputStream(); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/simplex/SimplexPlugin.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/simplex/SimplexPlugin.java index 9df61968d..f7cf1e801 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/simplex/SimplexPlugin.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/simplex/SimplexPlugin.java @@ -15,6 +15,12 @@ import javax.annotation.Nullable; @NotNullByDefault public interface SimplexPlugin extends Plugin { + /** + * Returns true if the transport is likely to lose streams and the cost of + * transmitting redundant copies of data is cheap. + */ + boolean isLossyAndCheap(); + /** * Attempts to create and return a reader for the given transport * properties. Returns null if a reader cannot be created. diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncSessionFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncSessionFactory.java index a19e211fb..e863089ff 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncSessionFactory.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncSessionFactory.java @@ -16,7 +16,7 @@ public interface SyncSessionFactory { PriorityHandler handler); SyncSession createSimplexOutgoingSession(ContactId c, TransportId t, - int maxLatency, StreamWriter streamWriter); + int maxLatency, boolean eager, StreamWriter streamWriter); SyncSession createDuplexOutgoingSession(ContactId c, TransportId t, int maxLatency, int maxIdleTime, StreamWriter streamWriter, diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingSimplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingSimplexSyncConnection.java index a5ad6dfc8..9bec08193 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingSimplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingSimplexSyncConnection.java @@ -71,8 +71,10 @@ class OutgoingSimplexSyncConnection extends SyncConnection implements Runnable { StreamWriter streamWriter = streamWriterFactory.createStreamWriter( w.getOutputStream(), ctx); ContactId c = requireNonNull(ctx.getContactId()); + // Use eager retransmission if the transport is lossy and cheap return syncSessionFactory.createSimplexOutgoingSession(c, - ctx.getTransportId(), w.getMaxLatency(), streamWriter); + ctx.getTransportId(), w.getMaxLatency(), w.isLossyAndCheap(), + streamWriter); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java index 356186355..8e8d35488 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java @@ -92,6 +92,11 @@ abstract class AbstractRemovableDrivePlugin implements SimplexPlugin { throw new UnsupportedOperationException(); } + @Override + public boolean isLossyAndCheap() { + return true; + } + @Override public TransportConnectionReader createReader(TransportProperties p) { try { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java index 2ab164784..c1d9c6748 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java @@ -36,6 +36,11 @@ class FileTransportWriter implements TransportConnectionWriter { return plugin.getMaxIdleTime(); } + @Override + public boolean isLossyAndCheap() { + return plugin.isLossyAndCheap(); + } + @Override public OutputStream getOutputStream() { return out; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java index 26f5c4969..563f306fa 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java @@ -106,6 +106,11 @@ class RemovableDriveWriterTask extends RemovableDriveTaskImpl return delegate.getMaxIdleTime(); } + @Override + public boolean isLossyAndCheap() { + return delegate.isLossyAndCheap(); + } + @Override public OutputStream getOutputStream() throws IOException { return delegate.getOutputStream(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java index be40fbca0..db7ba5555 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java @@ -1,8 +1,8 @@ package org.briarproject.bramble.plugin.file; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.TransportConnectionWriter; +import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import java.io.OutputStream; import java.util.logging.Logger; @@ -17,10 +17,10 @@ class TransportOutputStreamWriter implements TransportConnectionWriter { private static final Logger LOG = getLogger(TransportOutputStreamWriter.class.getName()); - private final Plugin plugin; + private final SimplexPlugin plugin; private final OutputStream out; - TransportOutputStreamWriter(Plugin plugin, OutputStream out) { + TransportOutputStreamWriter(SimplexPlugin plugin, OutputStream out) { this.plugin = plugin; this.out = out; } @@ -35,6 +35,11 @@ class TransportOutputStreamWriter implements TransportConnectionWriter { return plugin.getMaxIdleTime(); } + @Override + public boolean isLossyAndCheap() { + return plugin.isLossyAndCheap(); + } + @Override public OutputStream getOutputStream() { return out; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncSessionFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncSessionFactoryImpl.java index 74ec3e51a..37fe1f9d1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncSessionFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncSessionFactoryImpl.java @@ -60,12 +60,12 @@ class SyncSessionFactoryImpl implements SyncSessionFactory { @Override public SyncSession createSimplexOutgoingSession(ContactId c, TransportId t, - int maxLatency, StreamWriter streamWriter) { + int maxLatency, boolean eager, StreamWriter streamWriter) { OutputStream out = streamWriter.getOutputStream(); SyncRecordWriter recordWriter = recordWriterFactory.createRecordWriter(out); return new SimplexOutgoingSession(db, dbExecutor, eventBus, c, t, - maxLatency, false, streamWriter, recordWriter); + maxLatency, eager, streamWriter, recordWriter); } @Override diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java index 238208207..bf382e8e5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java @@ -35,6 +35,11 @@ public class TestTransportConnectionWriter return 60_000; } + @Override + public boolean isLossyAndCheap() { + return false; + } + @Override public OutputStream getOutputStream() { return out;