Index: src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java (revision 1767067) +++ src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java (working copy) @@ -164,7 +164,16 @@ @Override public boolean childNodeChanged(String name, NodeState before, NodeState after) { - return process(name, "childNodeChanged", before, after); + try { + return process(name, "childNodeChanged", before, after); + } catch (RuntimeException e) { + log.trace("Check binaries for node {} and retry to process childNodeChanged", name); + // Attempt to load the binaries and retry, see OAK-4969 + for (PropertyState propertyState : after.getProperties()) { + binaryCheck(propertyState); + } + return process(name, "childNodeChanged", before, after); + } } private boolean process(String name, String op, NodeState before, Index: src/test/java/org/apache/jackrabbit/oak/plugins/segment/standby/DataStoreTestBase.java =================================================================== --- src/test/java/org/apache/jackrabbit/oak/plugins/segment/standby/DataStoreTestBase.java (revision 1767067) +++ src/test/java/org/apache/jackrabbit/oak/plugins/segment/standby/DataStoreTestBase.java (working copy) @@ -122,7 +122,40 @@ assertArrayEquals(data, testData); } + /** + * See OAK-4969 + */ @Test + public void testSyncUpdatedBinaryProperty() throws Exception { + + final int mb = 1 * 1024 * 1024; + final int blobSize = 5 * mb; + FileStore primary = getPrimary(); + FileStore secondary = getSecondary(); + + NodeStore store = SegmentNodeStore.builder(primary).build(); + + try ( + StandbyClient client = newStandbyClient(secondary); + StandbyServer server = new StandbyServer(port, primary); + ) { + server.start(); + + addTestContent(store, "server", blobSize); + primary.flush(); + client.run(); + assertEquals(primary.getHead(), secondary.getHead()); + + addTestContent(store, "server", blobSize); + primary.flush(); + client.run(); + assertEquals(primary.getHead(), secondary.getHead()); + + } + + } + + @Test public void testProxySkippedBytes() throws Exception { useProxy(100, 1, -1, false); }