Author: frm
Date: Fri Mar  8 14:49:21 2019
New Revision: 1855048

URL: http://svn.apache.org/viewvc?rev=1855048&view=rev
Log:
OAK-7027 - Correctly test the read timeout expiration on cold standby

Added:
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerSync.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/store/StandbyStoreService.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/BrokenNetworkIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/DataStoreTestBase.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/ExternalPrivateStoreIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverIPRangeIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverMultipleClientsTestIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverSslTestIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/RecoverTestIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbySegmentBlobTestIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbyTestIT.java

Modified: 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/SegmentTarFixture.java
 Fri Mar  8 14:49:21 2019
@@ -304,8 +304,13 @@ public class SegmentTarFixture extends O
         try (ServerSocket socket = new ServerSocket(0)) {
             port = socket.getLocalPort();
         }
-        
-        serverSyncs[i] = new StandbyServerSync(port, stores[i], 1 * MB, 
secure);
+
+        serverSyncs[i] = StandbyServerSync.builder()
+            .withPort(port)
+            .withFileStore(stores[i])
+            .withBlobChunkSize(1 * MB)
+            .withSecureConnection(secure)
+            .build();
         clientSyncs[i] = new StandbyClientSync("127.0.0.1", port, stores[n + 
i], secure, DEFAULT_TIMEOUT, false, new 
File(StandardSystemProperty.JAVA_IO_TMPDIR.value()));
         
         if (!oneShotRun) {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServer.java
 Fri Mar  8 14:49:21 2019
@@ -19,6 +19,8 @@
 
 package org.apache.jackrabbit.oak.segment.standby.server;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import java.security.cert.CertificateException;
 import java.util.concurrent.TimeUnit;
 
@@ -60,8 +62,7 @@ class StandbyServer implements AutoClose
      * If a persisted head state cannot be acquired in less than this timeout,
      * the 'get head' request from the client will be discarded.
      */
-    static final long READ_HEAD_TIMEOUT =
-            Long.getLong("standby.server.timeout", 10_000L);
+    private static final long READ_HEAD_TIMEOUT = 
Long.getLong("standby.server.timeout", 10_000L);
 
     static Builder builder(int port, StoreProvider provider, int 
blobChunkSize) {
         return new Builder(port, provider, blobChunkSize);
@@ -95,6 +96,14 @@ class StandbyServer implements AutoClose
 
         private CommunicationObserver observer;
 
+        private StandbyHeadReader standbyHeadReader;
+
+        private StandbySegmentReader standbySegmentReader;
+
+        private StandbyReferencesReader standbyReferencesReader;
+
+        private StandbyBlobReader standbyBlobReader;
+
         private Builder(final int port, final StoreProvider storeProvider, 
final int blobChunkSize) {
             this.port = port;
             this.storeProvider = storeProvider;
@@ -108,23 +117,60 @@ class StandbyServer implements AutoClose
 
         Builder allowIPRanges(String[] allowedClientIPRanges) {
             this.allowedClientIPRanges = allowedClientIPRanges;
-
             return this;
         }
 
         Builder withStateConsumer(StateConsumer stateConsumer) {
             this.stateConsumer = stateConsumer;
-
             return this;
         }
 
         Builder withObserver(CommunicationObserver observer) {
             this.observer = observer;
+            return this;
+        }
+
+        Builder withStandbyHeadReader(StandbyHeadReader standbyHeadReader) {
+            this.standbyHeadReader = standbyHeadReader;
+            return this;
+        }
 
+        Builder withStandbySegmentReader(StandbySegmentReader 
standbySegmentReader) {
+            this.standbySegmentReader = standbySegmentReader;
+            return this;
+        }
+
+        Builder withStandbyReferencesReader(StandbyReferencesReader 
standbyReferencesReader) {
+            this.standbyReferencesReader = standbyReferencesReader;
+            return this;
+        }
+
+        Builder withStandbyBlobReader(StandbyBlobReader standbyBlobReader) {
+            this.standbyBlobReader = standbyBlobReader;
             return this;
         }
 
         StandbyServer build() throws CertificateException, SSLException {
+            checkState(storeProvider != null);
+
+            FileStore store = storeProvider.provideStore();
+
+            if (standbyReferencesReader == null) {
+                standbyReferencesReader = new 
DefaultStandbyReferencesReader(store);
+            }
+
+            if (standbyBlobReader == null) {
+                standbyBlobReader = new 
DefaultStandbyBlobReader(store.getBlobStore());
+            }
+
+            if (standbySegmentReader == null) {
+                standbySegmentReader = new DefaultStandbySegmentReader(store);
+            }
+
+            if (standbyHeadReader == null) {
+                standbyHeadReader = new DefaultStandbyHeadReader(store, 
READ_HEAD_TIMEOUT);
+            }
+
             return new StandbyServer(this);
         }
 
@@ -151,8 +197,9 @@ class StandbyServer implements AutoClose
         b.childOption(ChannelOption.SO_KEEPALIVE, true);
 
         b.childHandler(new ChannelInitializer<SocketChannel>() {
+
             @Override
-            public void initChannel(SocketChannel ch) throws Exception {
+            public void initChannel(SocketChannel ch) {
                 ChannelPipeline p = ch.pipeline();
 
                 p.addLast(new ClientFilterHandler(new 
ClientIpFilter(builder.allowedClientIPRanges)));
@@ -187,17 +234,16 @@ class StandbyServer implements AutoClose
 
                 // Handlers
 
-                FileStore store = builder.storeProvider.provideStore();
-
-                p.addLast(new GetHeadRequestHandler(new 
DefaultStandbyHeadReader(store, READ_HEAD_TIMEOUT)));
-                p.addLast(new GetSegmentRequestHandler(new 
DefaultStandbySegmentReader(store)));
-                p.addLast(new GetBlobRequestHandler(new 
DefaultStandbyBlobReader(store.getBlobStore())));
-                p.addLast(new GetReferencesRequestHandler(new 
DefaultStandbyReferencesReader(store)));
+                p.addLast(new 
GetHeadRequestHandler(builder.standbyHeadReader));
+                p.addLast(new 
GetSegmentRequestHandler(builder.standbySegmentReader));
+                p.addLast(new 
GetBlobRequestHandler(builder.standbyBlobReader));
+                p.addLast(new 
GetReferencesRequestHandler(builder.standbyReferencesReader));
 
                 // Exception handler
 
                 p.addLast(new ExceptionHandler());
             }
+
         });
     }
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerSync.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerSync.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerSync.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/StandbyServerSync.java
 Fri Mar  8 14:49:21 2019
@@ -19,6 +19,8 @@
 
 package org.apache.jackrabbit.oak.segment.standby.server;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.io.Closeable;
 import java.lang.management.ManagementFactory;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -37,6 +39,95 @@ import org.slf4j.LoggerFactory;
 
 public class StandbyServerSync implements StandbyStatusMBean, StateConsumer, 
StoreProvider, Closeable {
 
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static class Builder {
+
+        private int port;
+
+        private FileStore fileStore;
+
+        private int blobChunkSize;
+
+        private boolean secure;
+
+        private String[] allowedClientIPRanges;
+
+        private StandbyBlobReader standbyBlobReader;
+
+        private StandbyHeadReader standbyHeadReader;
+
+        private StandbyReferencesReader standbyReferencesReader;
+
+        private StandbySegmentReader standbySegmentReader;
+
+        private Builder() {
+            // Prevent external instantiation
+        }
+
+        public Builder withPort(int port) {
+            checkArgument(port > 0, "port");
+            this.port = port;
+            return this;
+        }
+
+        public Builder withFileStore(FileStore fileStore) {
+            checkArgument(fileStore != null, "fileStore");
+            this.fileStore = fileStore;
+            return this;
+        }
+
+        public Builder withBlobChunkSize(int blobChunkSize) {
+            checkArgument(blobChunkSize > 0, "blobChunkSize");
+            this.blobChunkSize = blobChunkSize;
+            return this;
+        }
+
+        public Builder withSecureConnection(boolean secure) {
+            this.secure = secure;
+            return this;
+        }
+
+        public Builder withAllowedClientIPRanges(String[] 
allowedClientIPRanges) {
+            this.allowedClientIPRanges = allowedClientIPRanges;
+            return this;
+        }
+
+        Builder withStandbyBlobReader(StandbyBlobReader standbyBlobReader) {
+            checkArgument(standbyBlobReader != null, "standbyBlobReader");
+            this.standbyBlobReader = standbyBlobReader;
+            return this;
+        }
+
+        Builder withStandbyHeadReader(StandbyHeadReader standbyHeadReader) {
+            checkArgument(standbyHeadReader != null, "standbyHeadReader");
+            this.standbyHeadReader = standbyHeadReader;
+            return this;
+        }
+
+        Builder withStandbyReferencesReader(StandbyReferencesReader 
standbyReferencesReader) {
+            checkArgument(standbyReferencesReader != null, 
"standbyReferencesReader");
+            this.standbyReferencesReader = standbyReferencesReader;
+            return this;
+        }
+
+        Builder withStandbySegmentReader(StandbySegmentReader 
standbySegmentReader) {
+            checkArgument(standbySegmentReader != null, 
"standbySegmentReader");
+            this.standbySegmentReader = standbySegmentReader;
+            return this;
+        }
+
+        public StandbyServerSync build() {
+            checkArgument(port > 0);
+            checkArgument(fileStore != null);
+            checkArgument(blobChunkSize > 0);
+            return new StandbyServerSync(this);
+        }
+
+    }
+
     private static final Logger log = 
LoggerFactory.getLogger(StandbyServer.class);
 
     private final FileStore fileStore;
@@ -55,26 +146,26 @@ public class StandbyServerSync implement
 
     private final AtomicBoolean running = new AtomicBoolean(false);
 
-    private StandbyServer server;
+    private final StandbyBlobReader standbyBlobReader;
 
-    public StandbyServerSync(final int port, final FileStore fileStore, final 
int blobChunkSize) {
-        this(port, fileStore, blobChunkSize, null, false);
-    }
+    private final StandbyHeadReader standbyHeadReader;
 
-    public StandbyServerSync(final int port, final FileStore fileStore, final 
int blobChunkSize, final boolean secure) {
-        this(port, fileStore, blobChunkSize, null, secure);
-    }
+    private final StandbyReferencesReader standbyReferencesReader;
 
-    public StandbyServerSync(final int port, final FileStore fileStore, final 
int blobChunkSize, final String[] allowedClientIPRanges) {
-        this(port, fileStore, blobChunkSize, allowedClientIPRanges, false);
-    }
+    private final StandbySegmentReader standbySegmentReader;
+
+    private StandbyServer server;
 
-    public StandbyServerSync(final int port, final FileStore fileStore, final 
int blobChunkSize, final String[] allowedClientIPRanges, final boolean secure) {
-        this.port = port;
-        this.fileStore = fileStore;
-        this.blobChunkSize = blobChunkSize;
-        this.allowedClientIPRanges = allowedClientIPRanges;
-        this.secure = secure;
+    private StandbyServerSync(Builder builder) {
+        this.port = builder.port;
+        this.fileStore = builder.fileStore;
+        this.blobChunkSize = builder.blobChunkSize;
+        this.allowedClientIPRanges = builder.allowedClientIPRanges;
+        this.secure = builder.secure;
+        this.standbyBlobReader = builder.standbyBlobReader;
+        this.standbyHeadReader = builder.standbyHeadReader;
+        this.standbyReferencesReader = builder.standbyReferencesReader;
+        this.standbySegmentReader = builder.standbySegmentReader;
         this.observer = new CommunicationObserver("primary");
 
         final MBeanServer jmxServer = 
ManagementFactory.getPlatformMBeanServer();
@@ -106,11 +197,15 @@ public class StandbyServerSync implement
 
         try {
             server = StandbyServer.builder(port, this, blobChunkSize)
-                    .secure(secure)
-                    .allowIPRanges(allowedClientIPRanges)
-                    .withStateConsumer(this)
-                    .withObserver(observer)
-                    .build();
+                .secure(secure)
+                .allowIPRanges(allowedClientIPRanges)
+                .withStateConsumer(this)
+                .withObserver(observer)
+                .withStandbyBlobReader(standbyBlobReader)
+                .withStandbyHeadReader(standbyHeadReader)
+                .withStandbyReferencesReader(standbyReferencesReader)
+                .withStandbySegmentReader(standbySegmentReader)
+                .build();
             server.start();
 
             state = STATUS_RUNNING;

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/store/StandbyStoreService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/store/StandbyStoreService.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/store/StandbyStoreService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/store/StandbyStoreService.java
 Fri Mar  8 14:49:21 2019
@@ -159,7 +159,14 @@ public class StandbyStoreService {
         String[] ranges = config.primary_allowed$_$client$_$ip$_$ranges();
         boolean secure = config.secure();
 
-        StandbyServerSync standbyServerSync = new StandbyServerSync(port, 
fileStore, BLOB_CHUNK_SIZE, ranges, secure);
+        StandbyServerSync standbyServerSync = StandbyServerSync.builder()
+            .withPort(port)
+            .withFileStore(fileStore)
+            .withBlobChunkSize(BLOB_CHUNK_SIZE)
+            .withAllowedClientIPRanges(ranges)
+            .withSecureConnection(secure)
+            .build();
+
         closer.register(standbyServerSync);
         standbyServerSync.start();
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/BrokenNetworkIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/BrokenNetworkIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/BrokenNetworkIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/BrokenNetworkIT.java
 Fri Mar  8 14:49:21 2019
@@ -67,7 +67,12 @@ public class BrokenNetworkIT extends Tes
         serverStore.flush();
 
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), serverStore, MB, false);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(serverStore)
+                .withBlobChunkSize(MB)
+                .withSecureConnection(false)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), clientStore, false, 
getClientTimeout(), false, folder.newFolder());
         ) {
             serverSync.start();
@@ -87,7 +92,12 @@ public class BrokenNetworkIT extends Tes
         storeS.flush();
 
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB, true);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .withSecureConnection(true)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), storeC, true, 
getClientTimeout(), false, folder.newFolder());
         ) {
             serverSync.start();
@@ -155,7 +165,14 @@ public class BrokenNetworkIT extends Tes
         addTestContent(store, "server");
         serverStore.flush();
 
-        try (StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), serverStore, MB, ssl)) {
+        try (
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(serverStore)
+                .withBlobChunkSize(MB)
+                .withSecureConnection(ssl)
+                .build()
+        ) {
             serverSync.start();
 
             File spoolFolder = folder.newFolder();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/DataStoreTestBase.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/DataStoreTestBase.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/DataStoreTestBase.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/DataStoreTestBase.java
 Fri Mar  8 14:49:21 2019
@@ -150,7 +150,11 @@ public abstract class DataStoreTestBase
 
         // run 1: unsuccessful
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync cl = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), secondary, false, 4_000, false, spoolFolder)
         ) {
             serverSync.start();
@@ -163,7 +167,11 @@ public abstract class DataStoreTestBase
 
         // run 2: successful
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync cl = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), secondary, false, 4_000, false, spoolFolder)
         ) {
             serverSync.start();
@@ -200,7 +208,11 @@ public abstract class DataStoreTestBase
         NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
         byte[] data = addTestContent(store, "server", blobSize);
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync cl = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), secondary, false, getClientTimeout(), false, 
folder.newFolder())
         ) {
             serverSync.start();
@@ -242,7 +254,11 @@ public abstract class DataStoreTestBase
         addTestContentOnTheFly(store, "server", blobSize, seed);
 
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, 8 * MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(8 * MB)
+                .build();
             StandbyClientSync cl = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), secondary, false, 2 * 60 * 1000, false, 
folder.newFolder())
         ) {
             serverSync.start();
@@ -281,7 +297,11 @@ public abstract class DataStoreTestBase
 
         NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), secondary, false, 
getClientTimeout(), false, folder.newFolder())
         ) {
             serverSync.start();
@@ -343,7 +363,13 @@ public abstract class DataStoreTestBase
         byte[] data = addTestContent(store, "server", blobSize);
         primary.flush();
 
-        try (StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB)) {
+        try (
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build()
+        ) {
             serverSync.start();
 
             File spoolFolder = folder.newFolder();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/ExternalPrivateStoreIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/ExternalPrivateStoreIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/ExternalPrivateStoreIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/ExternalPrivateStoreIT.java
 Fri Mar  8 14:49:21 2019
@@ -18,21 +18,12 @@
  */
 package org.apache.jackrabbit.oak.segment.standby;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
 import java.io.File;
 
-import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
-import org.apache.jackrabbit.oak.segment.standby.client.StandbyClientSync;
-import org.apache.jackrabbit.oak.segment.standby.server.StandbyServerSync;
 import org.apache.jackrabbit.oak.segment.test.TemporaryBlobStore;
 import org.apache.jackrabbit.oak.segment.test.TemporaryFileStore;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
-import org.junit.Ignore;
 import org.junit.Rule;
-import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TemporaryFolder;
 
@@ -70,24 +61,4 @@ public class ExternalPrivateStoreIT exte
         return true;
     }
 
-    @Test
-    @Ignore("OAK-7027") // FIXME OAK-7027
-    public void testSyncFailingDueToTooShortTimeout() throws Exception {
-        final int blobSize = 5 * MB;
-        FileStore primary = getPrimary();
-        FileStore secondary = getSecondary();
-
-        NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
-        addTestContent(store, "server", blobSize);
-        try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
-            StandbyClientSync cl = new StandbyClientSync(getServerHost(), 60, 
secondary, false, getClientTimeout(), false, folder.newFolder())
-        ) {
-            serverSync.start();
-            primary.flush();
-            cl.run();
-            assertNotEquals(primary.getHead(), secondary.getHead());
-            assertEquals(1, cl.getFailedRequests());
-        }
-    }
 }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverIPRangeIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverIPRangeIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverIPRangeIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverIPRangeIT.java
 Fri Mar  8 14:49:21 2019
@@ -157,7 +157,12 @@ public class FailoverIPRangeIT extends T
 
         NodeStore store = SegmentNodeStoreBuilders.builder(storeS).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB, ipRanges);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .withAllowedClientIPRanges(ipRanges)
+                .build();
             StandbyClientSync clientSync = new StandbyClientSync(host, 
serverPort.getPort(), storeC, false, getClientTimeout(), false, 
folder.newFolder())
         ) {
             serverSync.start();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverMultipleClientsTestIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverMultipleClientsTestIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverMultipleClientsTestIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverMultipleClientsTestIT.java
 Fri Mar  8 14:49:21 2019
@@ -63,7 +63,11 @@ public class FailoverMultipleClientsTest
 
         NodeStore store = SegmentNodeStoreBuilders.builder(storeS).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync cl1 = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), storeC, false, getClientTimeout(), false, 
folder.newFolder());
             StandbyClientSync cl2 = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), storeC2, false, getClientTimeout(), false, 
folder.newFolder())
         ) {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverSslTestIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverSslTestIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverSslTestIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/FailoverSslTestIT.java
 Fri Mar  8 14:49:21 2019
@@ -58,7 +58,12 @@ public class FailoverSslTestIT extends T
         FileStore storeS = serverFileStore.fileStore();
         FileStore storeC = clientFileStore.fileStore();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB, true);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .withSecureConnection(true)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), storeC, true, 
getClientTimeout(), false, folder.newFolder());
         ) {
             assertTrue(synchronizeAndCompareHead(serverSync, clientSync));
@@ -70,7 +75,12 @@ public class FailoverSslTestIT extends T
         FileStore storeS = serverFileStore.fileStore();
         FileStore storeC = clientFileStore.fileStore();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB, true);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .withSecureConnection(true)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), storeC, false, 
getClientTimeout(), false, folder.newFolder());
         ) {
             assertFalse(synchronizeAndCompareHead(serverSync, clientSync));
@@ -82,7 +92,11 @@ public class FailoverSslTestIT extends T
         FileStore storeS = serverFileStore.fileStore();
         FileStore storeC = clientFileStore.fileStore();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), storeC, true, 
getClientTimeout(), false, folder.newFolder());
         ) {
             assertFalse(synchronizeAndCompareHead(serverSync, clientSync));

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java
 Fri Mar  8 14:49:21 2019
@@ -61,7 +61,13 @@ public class MBeanIT extends TestBase {
     public void testServerEmptyConfig() throws Exception {
         MBeanServer jmxServer = ManagementFactory.getPlatformMBeanServer();
         ObjectName status = new ObjectName(StandbyStatusMBean.JMX_NAME + 
",id=*");
-        try (StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), serverFileStore.fileStore(), 1 * MB)) {
+        try (
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(serverFileStore.fileStore())
+                .withBlobChunkSize(1 * MB)
+                .build()
+        ) {
             serverSync.start();
 
             Set<ObjectName> instances = jmxServer.queryNames(status, null);
@@ -153,7 +159,11 @@ public class MBeanIT extends TestBase {
         MBeanServer jmxServer = ManagementFactory.getPlatformMBeanServer();
         ObjectName clientStatus, serverStatus;
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), serverFileStore.fileStore(), MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(serverFileStore.fileStore())
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), 
clientFileStore.fileStore(), false, getClientTimeout(), false, 
folder.newFolder())
         ) {
             serverSync.start();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/RecoverTestIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/RecoverTestIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/RecoverTestIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/RecoverTestIT.java
 Fri Mar  8 14:49:21 2019
@@ -62,7 +62,11 @@ public class RecoverTestIT extends TestB
         addTestContent(store, "client");
 
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), storeS, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(storeS)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync cl = new StandbyClientSync(getServerHost(), 
serverPort.getPort(), storeC, false, getClientTimeout(), false, 
folder.newFolder())
         ) {
             serverSync.start();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbySegmentBlobTestIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbySegmentBlobTestIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbySegmentBlobTestIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbySegmentBlobTestIT.java
 Fri Mar  8 14:49:21 2019
@@ -22,6 +22,8 @@ package org.apache.jackrabbit.oak.segmen
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.io.File;
+
 import org.apache.commons.io.input.NullInputStream;
 import org.apache.jackrabbit.core.data.FileDataStore;
 import org.apache.jackrabbit.oak.api.Blob;
@@ -44,8 +46,6 @@ import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TemporaryFolder;
 
-import java.io.File;
-
 public class StandbySegmentBlobTestIT extends TestBase {
 
     // `BLOB_SIZE` has to be chosen in such a way that is both:
@@ -94,7 +94,11 @@ public class StandbySegmentBlobTestIT ex
 
         NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), secondary, false, 
getClientTimeout(), false, folder.newFolder())
         ) {
             serverSync.start();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbyTestIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbyTestIT.java?rev=1855048&r1=1855047&r2=1855048&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbyTestIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/StandbyTestIT.java
 Fri Mar  8 14:49:21 2019
@@ -71,7 +71,11 @@ public class StandbyTestIT extends TestB
 
         NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), secondary, false, 
getClientTimeout(), false, folder.newFolder())
         ) {
             serverSync.start();
@@ -111,7 +115,11 @@ public class StandbyTestIT extends TestB
 
         NodeStore store = SegmentNodeStoreBuilders.builder(primary).build();
         try (
-            StandbyServerSync serverSync = new 
StandbyServerSync(serverPort.getPort(), primary, MB);
+            StandbyServerSync serverSync = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(MB)
+                .build();
             StandbyClientSync clientSync = new 
StandbyClientSync(getServerHost(), serverPort.getPort(), secondary, false, 
getClientTimeout(), false, folder.newFolder())
         ) {
             serverSync.start();

Added: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java?rev=1855048&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java
 Fri Mar  8 14:49:21 2019
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.standby.server;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.input.NullInputStream;
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.commons.junit.TemporaryPort;
+import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
+import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.segment.standby.client.StandbyClientSync;
+import org.apache.jackrabbit.oak.segment.test.TemporaryBlobStore;
+import org.apache.jackrabbit.oak.segment.test.TemporaryFileStore;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class SlowServerIT {
+
+    private TemporaryFolder folder = new TemporaryFolder(new File("target"));
+
+    private TemporaryBlobStore serverBlobStore = new 
TemporaryBlobStore(folder);
+
+    private TemporaryFileStore serverFileStore = new 
TemporaryFileStore(folder, serverBlobStore, false);
+
+    private TemporaryBlobStore clientBlobStore = new 
TemporaryBlobStore(folder);
+
+    private TemporaryFileStore clientFileStore = new 
TemporaryFileStore(folder, clientBlobStore, true);
+
+    @Rule
+    public RuleChain chain = RuleChain.outerRule(folder)
+        .around(serverBlobStore)
+        .around(serverFileStore)
+        .around(clientBlobStore)
+        .around(clientFileStore);
+
+    @Rule
+    public TemporaryPort serverPort = new TemporaryPort();
+
+    @Test
+    public void testSyncFailingDueToTooShortTimeout() throws Exception {
+        FileStore primary = serverFileStore.fileStore();
+        FileStore secondary = clientFileStore.fileStore();
+
+        // Add a node on the primary that references a 5MB binary.
+
+        createTestContent(primary);
+
+        // Configure a StandbyBlobReader that behaves like the default one, but
+        // adds a 2s delay every time a binary is fetched from the Data Store.
+
+        StandbyBlobReader blobReader = newDelayedBlobReader(2, 
TimeUnit.SECONDS, new DefaultStandbyBlobReader(primary.getBlobStore()));
+
+        try (
+
+            // The primary uses the delayed StandbyBlobReader and is configured
+            // to transfer binaries in chunks of 1MB.
+
+            StandbyServerSync server = StandbyServerSync.builder()
+                .withPort(serverPort.getPort())
+                .withFileStore(primary)
+                .withBlobChunkSize(1024 * 1024)
+                .withStandbyBlobReader(blobReader)
+                .build();
+
+            // The client expects the server to respond withing 1s. When the
+            // binary is requested, the delay on the server guarantees that the
+            // timeout on the client will expire.
+
+            StandbyClientSync client = new StandbyClientSync("localhost", 
serverPort.getPort(), secondary, false, 1000, false, folder.newFolder())
+        ) {
+            server.start();
+            client.run();
+            assertNotEquals(primary.getHead(), secondary.getHead());
+            assertEquals(1, client.getFailedRequests());
+        }
+    }
+
+    private void createTestContent(FileStore fileStore) throws 
CommitFailedException, IOException {
+        NodeStore store = SegmentNodeStoreBuilders.builder(fileStore).build();
+        NodeBuilder builder = store.getRoot().builder();
+
+        Blob blob = store.createBlob(new NullInputStream(5 * 1024 * 102));
+        builder.child("n").setProperty("data", blob);
+
+        store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        fileStore.flush();
+    }
+
+    private StandbyBlobReader newDelayedBlobReader(int delay, TimeUnit 
timeUnit, StandbyBlobReader wrapped) {
+        return new StandbyBlobReader() {
+
+            @Override
+            public InputStream readBlob(String blobId) {
+                try {
+                    Thread.sleep(timeUnit.toMillis(delay));
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+                return wrapped.readBlob(blobId);
+            }
+
+            @Override
+            public long getBlobLength(String blobId) {
+                return wrapped.getBlobLength(blobId);
+            }
+
+        };
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/SlowServerIT.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to