You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fr...@apache.org on 2018/02/28 11:58:43 UTC

svn commit: r1825553 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/file/ test/java/org/apache/jackrabbit/oak/segment...

Author: frm
Date: Wed Feb 28 11:58:42 2018
New Revision: 1825553

URL: http://svn.apache.org/viewvc?rev=1825553&view=rev
Log:
OAK-7280 - Remove superfluous methods from SegmentWriter

Added:
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java Wed Feb 28 11:58:42 2018
@@ -139,12 +139,8 @@ public class DefaultSegmentWriter implem
         writeOperationHandler.flush(store);
     }
 
-    @Override
     @Nonnull
-    public RecordId writeMap(@Nullable final MapRecord base,
-            @Nonnull final Map<String, RecordId> changes
-    )
-            throws IOException {
+    RecordId writeMap(@Nullable final MapRecord base, @Nonnull final Map<String, RecordId> changes) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
 
             @Nonnull
@@ -152,12 +148,12 @@ public class DefaultSegmentWriter implem
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeMap(base, changes);
             }
+
         });
     }
 
-    @Override
     @Nonnull
-    public RecordId writeList(@Nonnull final List<RecordId> list) throws IOException {
+    RecordId writeList(@Nonnull final List<RecordId> list) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
 
             @Nonnull
@@ -165,12 +161,12 @@ public class DefaultSegmentWriter implem
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeList(list);
             }
+
         });
     }
 
-    @Override
     @Nonnull
-    public RecordId writeString(@Nonnull final String string) throws IOException {
+    RecordId writeString(@Nonnull final String string) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
 
             @Nonnull
@@ -178,10 +174,10 @@ public class DefaultSegmentWriter implem
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeString(string);
             }
+
         });
     }
 
-    @Override
     @Nonnull
     public RecordId writeBlob(@Nonnull final Blob blob) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
@@ -191,13 +187,12 @@ public class DefaultSegmentWriter implem
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeBlob(blob);
             }
+
         });
     }
 
-    @Override
     @Nonnull
-    public RecordId writeBlock(@Nonnull final byte[] bytes, final int offset, final int length)
-            throws IOException {
+    RecordId writeBlock(@Nonnull final byte[] bytes, final int offset, final int length) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
 
             @Nonnull
@@ -205,6 +200,7 @@ public class DefaultSegmentWriter implem
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeBlock(bytes, offset, length);
             }
+
         });
     }
 
@@ -221,9 +217,8 @@ public class DefaultSegmentWriter implem
         });
     }
 
-    @Override
     @Nonnull
-    public RecordId writeProperty(@Nonnull final PropertyState state) throws IOException {
+    RecordId writeProperty(@Nonnull final PropertyState state) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
 
             @Nonnull
@@ -236,16 +231,15 @@ public class DefaultSegmentWriter implem
 
     @Override
     @Nonnull
-    public RecordId writeNode(
-            @Nonnull final NodeState state,
-            @Nullable final ByteBuffer stableIdBytes)
-    throws IOException {
+    public RecordId writeNode(@Nonnull final NodeState state, @Nullable final ByteBuffer stableIdBytes) throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
                 return with(writer).writeNode(state, stableIdBytes);
             }
+
         });
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java Wed Feb 28 11:58:42 2018
@@ -20,14 +20,11 @@ package org.apache.jackrabbit.oak.segmen
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.apache.jackrabbit.oak.api.Blob;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
@@ -38,41 +35,6 @@ public interface SegmentWriter {
     void flush() throws IOException;
 
     /**
-     * Write a map record.
-     *
-     * @param base    base map relative to which the {@code changes} are applied
-     *                ot {@code null} for the empty map.
-     * @param changes the changed mapping to apply to the {@code base} map.
-     * @return the record id of the map written
-     * @throws IOException
-     */
-    @Nonnull
-    // TODO frm this method is only used from test code, should it be removed?
-    RecordId writeMap(@Nullable MapRecord base, @Nonnull Map<String, RecordId> changes) throws IOException;
-
-    /**
-     * Write a list record.
-     *
-     * @param list the list to write.
-     * @return the record id of the list written
-     * @throws IOException
-     */
-    @Nonnull
-    // TODO frm this method is only used from test code, should it be removed?
-    RecordId writeList(@Nonnull List<RecordId> list) throws IOException;
-
-    /**
-     * Write a string record.
-     *
-     * @param string the string to write.
-     * @return the record id of the string written.
-     * @throws IOException
-     */
-    @Nonnull
-    // TODO frm this method is only used from test code, should it be removed?
-    RecordId writeString(@Nonnull String string) throws IOException;
-
-    /**
      * Write a blob (as list of block records)
      *
      * @param blob blob to write
@@ -83,18 +45,6 @@ public interface SegmentWriter {
     RecordId writeBlob(@Nonnull Blob blob) throws IOException;
 
     /**
-     * Writes a block record containing the given block of bytes.
-     *
-     * @param bytes  source buffer
-     * @param offset offset within the source buffer
-     * @param length number of bytes to write
-     * @return the record id of the block written
-     */
-    @Nonnull
-    // TODO frm this method is only used from test code, should it be removed?
-    RecordId writeBlock(@Nonnull byte[] bytes, int offset, int length) throws IOException;
-
-    /**
      * Writes a stream value record. The given stream is consumed <em>and
      * closed</em> by this method.
      *
@@ -107,17 +57,6 @@ public interface SegmentWriter {
     RecordId writeStream(@Nonnull InputStream stream) throws IOException;
 
     /**
-     * Write a property.
-     *
-     * @param state the property to write
-     * @return the record id of the property state written
-     * @throws IOException
-     */
-    @Nonnull
-    // TODO frm this method is only used from test code, should it be removed?
-    RecordId writeProperty(@Nonnull PropertyState state) throws IOException;
-
-    /**
      * Write a node state. If non null, the passed {@code stableId} will be assigned to
      * the persisted node. Otherwise the stable id will be inferred from {@code state}.
      *
@@ -140,4 +79,5 @@ public interface SegmentWriter {
     default RecordId writeNode(@Nonnull NodeState state) throws IOException {
         return writeNode(state, null);
     }
+
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java Wed Feb 28 11:58:42 2018
@@ -34,7 +34,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.List;
-import java.util.Map;
 import java.util.Random;
 
 import javax.annotation.Nonnull;
@@ -44,7 +43,6 @@ import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
@@ -200,50 +198,17 @@ public class CompactorTest {
 
         @Nonnull
         @Override
-        public RecordId writeMap(
-                @Nullable MapRecord base, @Nonnull Map<String, RecordId> changes)
-        throws IOException {
-            return delegate.writeMap(base, changes);
-        }
-
-        @Nonnull
-        @Override
-        public RecordId writeList(@Nonnull List<RecordId> list) throws IOException {
-            return delegate.writeList(list);
-        }
-
-        @Nonnull
-        @Override
-        public RecordId writeString(@Nonnull String string) throws IOException {
-            return delegate.writeString(string);
-        }
-
-        @Nonnull
-        @Override
         public RecordId writeBlob(@Nonnull Blob blob) throws IOException {
             return delegate.writeBlob(blob);
         }
 
         @Nonnull
         @Override
-        public RecordId writeBlock(@Nonnull byte[] bytes, int offset, int length)
-        throws IOException {
-            return delegate.writeBlock(bytes, offset, length);
-        }
-
-        @Nonnull
-        @Override
         public RecordId writeStream(@Nonnull InputStream stream) throws IOException {
             return delegate.writeStream(stream);
         }
 
         @Nonnull
-        @Override
-        public RecordId writeProperty(@Nonnull PropertyState state) throws IOException {
-            return delegate.writeProperty(state);
-        }
-
-        @Nonnull
         @Override
         public RecordId writeNode(@Nonnull NodeState state, @Nullable ByteBuffer stableIdBytes)
         throws IOException {

Added: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterTest.java?rev=1825553&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterTest.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterTest.java Wed Feb 28 11:58:42 2018
@@ -0,0 +1,278 @@
+package org.apache.jackrabbit.oak.segment;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
+import static org.apache.jackrabbit.oak.segment.ListRecord.LEVEL_SIZE;
+import static org.apache.jackrabbit.oak.segment.ListRecord.MAX_ELEMENTS;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.oak.segment.test.TemporaryFileStore;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class DefaultSegmentWriterTest {
+
+    private static final String HELLO_WORLD = "Hello, World!";
+
+    private final byte[] bytes = HELLO_WORLD.getBytes(Charsets.UTF_8);
+
+    private TemporaryFolder folder = new TemporaryFolder(new File("target"));
+
+    private TemporaryFileStore store = new TemporaryFileStore(folder, false);
+
+    @Rule
+    public RuleChain rules = RuleChain.outerRule(folder).around(store);
+
+    private DefaultSegmentWriter writer;
+
+    @Before
+    public void setUp() throws Exception {
+        writer = defaultSegmentWriterBuilder("test").build(store.fileStore());
+    }
+
+    @Test
+    public void testBlockRecord() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+        BlockRecord block = new BlockRecord(blockId, bytes.length);
+
+        // Check reading with all valid positions and lengths
+        for (int n = 1; n < bytes.length; n++) {
+            for (int i = 0; i + n <= bytes.length; i++) {
+                Arrays.fill(bytes, i, i + n, (byte) '.');
+                assertEquals(n, block.read(i, bytes, i, n));
+                assertEquals(HELLO_WORLD, new String(bytes, Charsets.UTF_8));
+            }
+        }
+
+        // Check reading with a too long length
+        byte[] large = new byte[bytes.length * 2];
+        assertEquals(bytes.length, block.read(0, large, 0, large.length));
+        assertEquals(HELLO_WORLD, new String(large, 0, bytes.length, Charsets.UTF_8));
+    }
+
+    @Test
+    public void testListRecord() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+
+        ListRecord one = writeList(1, blockId);
+        ListRecord level1 = writeList(LEVEL_SIZE, blockId);
+        ListRecord level1p = writeList(LEVEL_SIZE + 1, blockId);
+        ListRecord level2 = writeList(LEVEL_SIZE * LEVEL_SIZE, blockId);
+        ListRecord level2p = writeList(LEVEL_SIZE * LEVEL_SIZE + 1, blockId);
+
+        assertEquals(1, one.size());
+        assertEquals(blockId, one.getEntry(0));
+        assertEquals(LEVEL_SIZE, level1.size());
+        assertEquals(blockId, level1.getEntry(0));
+        assertEquals(blockId, level1.getEntry(LEVEL_SIZE - 1));
+        assertEquals(LEVEL_SIZE + 1, level1p.size());
+        assertEquals(blockId, level1p.getEntry(0));
+        assertEquals(blockId, level1p.getEntry(LEVEL_SIZE));
+        assertEquals(LEVEL_SIZE * LEVEL_SIZE, level2.size());
+        assertEquals(blockId, level2.getEntry(0));
+        assertEquals(blockId, level2.getEntry(LEVEL_SIZE * LEVEL_SIZE - 1));
+        assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, level2p.size());
+        assertEquals(blockId, level2p.getEntry(0));
+        assertEquals(blockId, level2p.getEntry(LEVEL_SIZE * LEVEL_SIZE));
+
+        int count = 0;
+        for (RecordId entry : level2p.getEntries()) {
+            assertEquals(blockId, entry);
+            assertEquals(blockId, level2p.getEntry(count));
+            count++;
+        }
+        assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, count);
+    }
+
+    @Test
+    public void testLargeListRecord() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+
+        ListRecord one = writeList(MAX_ELEMENTS, blockId);
+        one.getEntry(0);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testTooLargeListRecord() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+
+        ListRecord one = writeList(MAX_ELEMENTS + 1, blockId);
+    }
+
+    private ListRecord writeList(int size, RecordId id) throws IOException {
+        List<RecordId> list = Collections.nCopies(size, id);
+        return new ListRecord(writer.writeList(list), size);
+    }
+
+    @Test
+    public void testListWithLotsOfReferences() throws IOException { // OAK-1184
+        List<RecordId> list = newArrayList();
+        for (int i = 0; i < 1000; i++) {
+            list.add(new RecordId(store.fileStore().getSegmentIdProvider().newBulkSegmentId(), 0));
+        }
+        writer.writeList(list);
+    }
+
+    @Test
+    public void testStringRecord() throws IOException {
+        RecordId empty = writer.writeString("");
+        RecordId space = writer.writeString(" ");
+        RecordId hello = writer.writeString("Hello, World!");
+
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < 2 * Segment.MAX_SEGMENT_SIZE + 1000; i++) {
+            builder.append((char) ('0' + i % 10));
+        }
+        RecordId large = writer.writeString(builder.toString());
+
+        Segment segment = large.getSegmentId().getSegment();
+
+        assertEquals("", store.fileStore().getReader().readString(empty));
+        assertEquals(" ", store.fileStore().getReader().readString(space));
+        assertEquals("Hello, World!", store.fileStore().getReader().readString(hello));
+        assertEquals(builder.toString(), store.fileStore().getReader().readString(large));
+    }
+
+    @Test
+    public void testMapRecord() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+
+        MapRecord zero = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, ImmutableMap.<String, RecordId>of()));
+        MapRecord one = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, ImmutableMap.of("one", blockId)));
+        MapRecord two = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, ImmutableMap.of("one", blockId, "two", blockId)));
+        Map<String, RecordId> map = newHashMap();
+        for (int i = 0; i < 1000; i++) {
+            map.put("key" + i, blockId);
+        }
+        MapRecord many = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, map));
+
+        Iterator<MapEntry> iterator;
+
+        assertEquals(0, zero.size());
+        assertNull(zero.getEntry("one"));
+        iterator = zero.getEntries().iterator();
+        assertFalse(iterator.hasNext());
+
+        assertEquals(1, one.size());
+        assertEquals(blockId, one.getEntry("one").getValue());
+        assertNull(one.getEntry("two"));
+        iterator = one.getEntries().iterator();
+        assertTrue(iterator.hasNext());
+        assertEquals("one", iterator.next().getName());
+        assertFalse(iterator.hasNext());
+
+        assertEquals(2, two.size());
+        assertEquals(blockId, two.getEntry("one").getValue());
+        assertEquals(blockId, two.getEntry("two").getValue());
+        assertNull(two.getEntry("three"));
+        iterator = two.getEntries().iterator();
+        assertTrue(iterator.hasNext());
+        iterator.next();
+        assertTrue(iterator.hasNext());
+        iterator.next();
+        assertFalse(iterator.hasNext());
+
+        assertEquals(1000, many.size());
+        iterator = many.getEntries().iterator();
+        for (int i = 0; i < 1000; i++) {
+            assertTrue(iterator.hasNext());
+            assertEquals(blockId, iterator.next().getValue());
+            assertEquals(blockId, many.getEntry("key" + i).getValue());
+        }
+        assertFalse(iterator.hasNext());
+        assertNull(many.getEntry("foo"));
+
+        Map<String, RecordId> changes = newHashMap();
+        changes.put("key0", null);
+        changes.put("key1000", blockId);
+        MapRecord modified = new MapRecord(store.fileStore().getReader(), writer.writeMap(many, changes));
+        assertEquals(1000, modified.size());
+        iterator = modified.getEntries().iterator();
+        for (int i = 1; i <= 1000; i++) {
+            assertTrue(iterator.hasNext());
+            assertEquals(blockId, iterator.next().getValue());
+            assertEquals(blockId, modified.getEntry("key" + i).getValue());
+        }
+        assertFalse(iterator.hasNext());
+        assertNull(many.getEntry("foo"));
+    }
+
+    @Test
+    public void testMapRemoveNonExisting() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+
+        Map<String, RecordId> changes = newHashMap();
+        changes.put("one", null);
+        MapRecord zero = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, changes));
+        assertEquals(0, zero.size());
+    }
+
+    @Test
+    public void testWorstCaseMap() throws IOException {
+        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
+        Map<String, RecordId> map = newHashMap();
+        char[] key = new char[2];
+        for (int i = 0; i <= MapRecord.BUCKETS_PER_LEVEL; i++) {
+            key[0] = (char) ('A' + i);
+            key[1] = (char) ('\u1000' - key[0] * 31);
+            map.put(new String(key), blockId);
+        }
+
+        MapRecord bad = new MapRecord(store.fileStore().getReader(), writer.writeMap(null, map));
+
+        assertEquals(map.size(), bad.size());
+        Iterator<MapEntry> iterator = bad.getEntries().iterator();
+        for (int i = 0; i < map.size(); i++) {
+            assertTrue(iterator.hasNext());
+            assertEquals('\u1000', iterator.next().getName().hashCode());
+        }
+        assertFalse(iterator.hasNext());
+    }
+
+    @Test  // See OAK-2049
+    public void segmentOverflow() throws Exception {
+        for (int n = 1; n < 255; n++) {  // 255 = ListRecord.LEVEL_SIZE
+            DefaultSegmentWriter writer = defaultSegmentWriterBuilder("test").build(store.fileStore());
+            // writer.length == 32  (from the root node)
+
+            // adding 15 strings with 16516 bytes each
+            for (int k = 0; k < 15; k++) {
+                // 16516 = (Segment.MEDIUM_LIMIT - 1 + 2 + 3)
+                // 1 byte per char, 2 byte to store the length and 3 bytes for the
+                // alignment to the integer boundary
+                writer.writeString(Strings.repeat("abcdefghijklmno".substring(k, k + 1),
+                    SegmentTestConstants.MEDIUM_LIMIT - 1));
+            }
+
+            // adding 14280 bytes. 1 byte per char, and 2 bytes to store the length
+            RecordId x = writer.writeString(Strings.repeat("x", 14278));
+            // writer.length == 262052
+
+            // Adding 765 bytes (255 recordIds)
+            // This should cause the current segment to flush
+            List<RecordId> list = Collections.nCopies(n, x);
+            writer.writeList(list);
+
+            writer.flush();
+        }
+    }
+
+}

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

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java Wed Feb 28 11:58:42 2018
@@ -19,7 +19,6 @@
 package org.apache.jackrabbit.oak.segment;
 
 import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Maps.newHashMap;
 import static java.lang.Math.min;
 import static java.util.Collections.singletonList;
 import static junit.framework.Assert.assertNotNull;
@@ -29,27 +28,16 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.api.Type.STRING;
 import static org.apache.jackrabbit.oak.api.Type.STRINGS;
 import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
-import static org.apache.jackrabbit.oak.segment.ListRecord.LEVEL_SIZE;
-import static org.apache.jackrabbit.oak.segment.ListRecord.MAX_ELEMENTS;
 import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Random;
 
-import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableMap;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -69,10 +57,6 @@ public class RecordTest {
     @Rule
     public TemporaryFolder folder = new TemporaryFolder(new File("target"));
 
-    private static final String HELLO_WORLD = "Hello, World!";
-
-    private final byte[] bytes = HELLO_WORLD.getBytes(Charsets.UTF_8);
-
     private FileStore store;
 
     private SegmentWriter writer;
@@ -91,89 +75,6 @@ public class RecordTest {
     }
 
     @Test
-    public void testBlockRecord() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-        BlockRecord block = new BlockRecord(blockId, bytes.length);
-
-        // Check reading with all valid positions and lengths
-        for (int n = 1; n < bytes.length; n++) {
-            for (int i = 0; i + n <= bytes.length; i++) {
-                Arrays.fill(bytes, i, i + n, (byte) '.');
-                assertEquals(n, block.read(i, bytes, i, n));
-                assertEquals(HELLO_WORLD, new String(bytes, Charsets.UTF_8));
-            }
-        }
-
-        // Check reading with a too long length
-        byte[] large = new byte[bytes.length * 2];
-        assertEquals(bytes.length, block.read(0, large, 0, large.length));
-        assertEquals(HELLO_WORLD, new String(large, 0, bytes.length, Charsets.UTF_8));
-    }
-
-    @Test
-    public void testListRecord() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-
-        ListRecord one = writeList(1, blockId);
-        ListRecord level1 = writeList(LEVEL_SIZE, blockId);
-        ListRecord level1p = writeList(LEVEL_SIZE + 1, blockId);
-        ListRecord level2 = writeList(LEVEL_SIZE * LEVEL_SIZE, blockId);
-        ListRecord level2p = writeList(LEVEL_SIZE * LEVEL_SIZE + 1, blockId);
-
-        assertEquals(1, one.size());
-        assertEquals(blockId, one.getEntry(0));
-        assertEquals(LEVEL_SIZE, level1.size());
-        assertEquals(blockId, level1.getEntry(0));
-        assertEquals(blockId, level1.getEntry(LEVEL_SIZE - 1));
-        assertEquals(LEVEL_SIZE + 1, level1p.size());
-        assertEquals(blockId, level1p.getEntry(0));
-        assertEquals(blockId, level1p.getEntry(LEVEL_SIZE));
-        assertEquals(LEVEL_SIZE * LEVEL_SIZE, level2.size());
-        assertEquals(blockId, level2.getEntry(0));
-        assertEquals(blockId, level2.getEntry(LEVEL_SIZE * LEVEL_SIZE - 1));
-        assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, level2p.size());
-        assertEquals(blockId, level2p.getEntry(0));
-        assertEquals(blockId, level2p.getEntry(LEVEL_SIZE * LEVEL_SIZE));
-
-        int count = 0;
-        for (RecordId entry : level2p.getEntries()) {
-            assertEquals(blockId, entry);
-            assertEquals(blockId, level2p.getEntry(count));
-            count++;
-        }
-        assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, count);
-    }
-
-    @Test
-    public void testLargeListRecord() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-
-        ListRecord one = writeList(MAX_ELEMENTS, blockId);
-        one.getEntry(0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTooLargeListRecord() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-
-        ListRecord one = writeList(MAX_ELEMENTS + 1, blockId);
-    }
-
-    private ListRecord writeList(int size, RecordId id) throws IOException {
-        List<RecordId> list = Collections.nCopies(size, id);
-        return new ListRecord(writer.writeList(list), size);
-    }
-
-    @Test
-    public void testListWithLotsOfReferences() throws IOException { // OAK-1184
-        List<RecordId> list = newArrayList();
-        for (int i = 0; i < 1000; i++) {
-            list.add(new RecordId(store.getSegmentIdProvider().newBulkSegmentId(), 0));
-        }
-        writer.writeList(list);
-    }
-
-    @Test
     public void testStreamRecord() throws IOException {
         checkRandomStreamRecord(0);
         checkRandomStreamRecord(1);
@@ -219,122 +120,6 @@ public class RecordTest {
     }
 
     @Test
-    public void testStringRecord() throws IOException {
-        RecordId empty = writer.writeString("");
-        RecordId space = writer.writeString(" ");
-        RecordId hello = writer.writeString("Hello, World!");
-
-        StringBuilder builder = new StringBuilder();
-        for (int i = 0; i < 2 * Segment.MAX_SEGMENT_SIZE + 1000; i++) {
-            builder.append((char) ('0' + i % 10));
-        }
-        RecordId large = writer.writeString(builder.toString());
-
-        Segment segment = large.getSegmentId().getSegment();
-
-        assertEquals("", store.getReader().readString(empty));
-        assertEquals(" ", store.getReader().readString(space));
-        assertEquals("Hello, World!", store.getReader().readString(hello));
-        assertEquals(builder.toString(), store.getReader().readString(large));
-    }
-
-    @Test
-    public void testMapRecord() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-
-        MapRecord zero = new MapRecord(store.getReader(), writer.writeMap(null, ImmutableMap.<String, RecordId>of()));
-        MapRecord one = new MapRecord(store.getReader(), writer.writeMap(null, ImmutableMap.of("one", blockId)));
-        MapRecord two = new MapRecord(store.getReader(), writer.writeMap(null, ImmutableMap.of("one", blockId, "two", blockId)));
-        Map<String, RecordId> map = newHashMap();
-        for (int i = 0; i < 1000; i++) {
-            map.put("key" + i, blockId);
-        }
-        MapRecord many = new MapRecord(store.getReader(), writer.writeMap(null, map));
-
-        Iterator<MapEntry> iterator;
-
-        assertEquals(0, zero.size());
-        assertNull(zero.getEntry("one"));
-        iterator = zero.getEntries().iterator();
-        assertFalse(iterator.hasNext());
-
-        assertEquals(1, one.size());
-        assertEquals(blockId, one.getEntry("one").getValue());
-        assertNull(one.getEntry("two"));
-        iterator = one.getEntries().iterator();
-        assertTrue(iterator.hasNext());
-        assertEquals("one", iterator.next().getName());
-        assertFalse(iterator.hasNext());
-
-        assertEquals(2, two.size());
-        assertEquals(blockId, two.getEntry("one").getValue());
-        assertEquals(blockId, two.getEntry("two").getValue());
-        assertNull(two.getEntry("three"));
-        iterator = two.getEntries().iterator();
-        assertTrue(iterator.hasNext());
-        iterator.next();
-        assertTrue(iterator.hasNext());
-        iterator.next();
-        assertFalse(iterator.hasNext());
-
-        assertEquals(1000, many.size());
-        iterator = many.getEntries().iterator();
-        for (int i = 0; i < 1000; i++) {
-            assertTrue(iterator.hasNext());
-            assertEquals(blockId, iterator.next().getValue());
-            assertEquals(blockId, many.getEntry("key" + i).getValue());
-        }
-        assertFalse(iterator.hasNext());
-        assertNull(many.getEntry("foo"));
-
-        Map<String, RecordId> changes = newHashMap();
-        changes.put("key0", null);
-        changes.put("key1000", blockId);
-        MapRecord modified = new MapRecord(store.getReader(), writer.writeMap(many, changes));
-        assertEquals(1000, modified.size());
-        iterator = modified.getEntries().iterator();
-        for (int i = 1; i <= 1000; i++) {
-            assertTrue(iterator.hasNext());
-            assertEquals(blockId, iterator.next().getValue());
-            assertEquals(blockId, modified.getEntry("key" + i).getValue());
-        }
-        assertFalse(iterator.hasNext());
-        assertNull(many.getEntry("foo"));
-    }
-
-    @Test
-    public void testMapRemoveNonExisting() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-
-        Map<String, RecordId> changes = newHashMap();
-        changes.put("one", null);
-        MapRecord zero = new MapRecord(store.getReader(), writer.writeMap(null, changes));
-        assertEquals(0, zero.size());
-    }
-
-    @Test
-    public void testWorstCaseMap() throws IOException {
-        RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
-        Map<String, RecordId> map = newHashMap();
-        char[] key = new char[2];
-        for (int i = 0; i <= MapRecord.BUCKETS_PER_LEVEL; i++) {
-            key[0] = (char) ('A' + i);
-            key[1] = (char) ('\u1000' - key[0] * 31);
-            map.put(new String(key), blockId);
-        }
-
-        MapRecord bad = new MapRecord(store.getReader(), writer.writeMap(null, map));
-
-        assertEquals(map.size(), bad.size());
-        Iterator<MapEntry> iterator = bad.getEntries().iterator();
-        for (int i = 0; i < map.size(); i++) {
-            assertTrue(iterator.hasNext());
-            assertEquals('\u1000', iterator.next().getName().hashCode());
-        }
-        assertFalse(iterator.hasNext());
-    }
-
-    @Test
     public void testEmptyNode() throws IOException {
         NodeState before = EMPTY_NODE;
         NodeState after = new SegmentNodeState(store.getReader(), writer, store.getBlobStore(), writer.writeNode(before));

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java Wed Feb 28 11:58:42 2018
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertNot
 import java.io.File;
 import java.util.List;
 
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
 import org.junit.Rule;
@@ -82,7 +83,7 @@ public class SegmentBufferWriterTest {
 
         try (FileStore store = openFileStore()) {
             SegmentWriter writer = defaultSegmentWriterBuilder("t").build(store);
-            writer.writeString("test");
+            writer.writeNode(EmptyNodeState.EMPTY_NODE);
             writer.flush();
         }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java Wed Feb 28 11:58:42 2018
@@ -61,7 +61,7 @@ public class SegmentParserTest {
 
     private MemoryStore store;
 
-    private SegmentWriter writer;
+    private DefaultSegmentWriter writer;
 
     private static class TestParser extends SegmentParser {
         private final String name;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java Wed Feb 28 11:58:42 2018
@@ -22,10 +22,11 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNotEquals;
 
 import java.io.File;
-import java.util.Arrays;
 
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -46,18 +47,20 @@ public class SegmentReferencesTest {
             // Write two records, one referencing the other.
 
             SegmentWriter writer = defaultSegmentWriterBuilder("test").build(store);
-            RecordId stringId = writer.writeString("test");
-            RecordId listId = writer.writeList(Arrays.asList(stringId, stringId));
+            RecordId a = writer.writeNode(EmptyNodeState.EMPTY_NODE);
+            NodeBuilder builder = EmptyNodeState.EMPTY_NODE.builder();
+            builder.setChildNode("referred", store.getReader().readNode(a));
+            RecordId b = writer.writeNode(builder.getNodeState());
             writer.flush();
 
             // The two records should be living in the same segment.
 
-            assertEquals(listId.getSegmentId(), stringId.getSegmentId());
+            assertEquals(b.getSegmentId(), a.getSegmentId());
 
             // This inter-segment reference shouldn't generate a reference from
             // this segment to itself.
 
-            assertEquals(0, listId.getSegment().getReferencedSegmentIdCount());
+            assertEquals(0, b.getSegment().getReferencedSegmentIdCount());
         }
     }
 
@@ -69,21 +72,23 @@ public class SegmentReferencesTest {
 
             SegmentWriter writer = defaultSegmentWriterBuilder("test").build(store);
 
-            RecordId stringId = writer.writeString("test");
+            RecordId a = writer.writeNode(EmptyNodeState.EMPTY_NODE);
             writer.flush();
 
-            RecordId listId = writer.writeList(Arrays.asList(stringId, stringId));
+            NodeBuilder builder = EmptyNodeState.EMPTY_NODE.builder();
+            builder.setChildNode("referred", store.getReader().readNode(a));
+            RecordId b = writer.writeNode(builder.getNodeState());
             writer.flush();
 
             // The two records should be living in two different segments.
 
-            assertNotEquals(listId.getSegmentId(), stringId.getSegmentId());
+            assertNotEquals(a.getSegmentId(), b.getSegmentId());
 
             // This intra-segment reference should generate a reference from the
             // segment containing the list to the segment containing the string.
 
-            assertEquals(1, listId.getSegment().getReferencedSegmentIdCount());
-            assertEquals(stringId.getSegmentId().asUUID(), listId.getSegment().getReferencedSegmentId(0));
+            assertEquals(1, b.getSegment().getReferencedSegmentIdCount());
+            assertEquals(a.getSegmentId().asUUID(), b.getSegment().getReferencedSegmentId(0));
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java Wed Feb 28 11:58:42 2018
@@ -25,18 +25,14 @@ import static org.junit.Assert.assertFal
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.RandomAccessFile;
-import java.util.Collections;
-import java.util.List;
 import java.util.Random;
 
-import com.google.common.base.Strings;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob;
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentTestConstants;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -132,39 +128,6 @@ public class FileStoreIT {
         store.close();
     }
 
-    @Test  // See OAK-2049
-    public void segmentOverflow() throws Exception {
-        for (int n = 1; n < 255; n++) {  // 255 = ListRecord.LEVEL_SIZE
-            FileStore store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();
-            SegmentWriter writer = store.getWriter();
-            // writer.length == 32  (from the root node)
-
-            // adding 15 strings with 16516 bytes each
-            for (int k = 0; k < 15; k++) {
-                // 16516 = (Segment.MEDIUM_LIMIT - 1 + 2 + 3)
-                // 1 byte per char, 2 byte to store the length and 3 bytes for the
-                // alignment to the integer boundary
-                writer.writeString(Strings.repeat("abcdefghijklmno".substring(k, k + 1),
-                        SegmentTestConstants.MEDIUM_LIMIT - 1));
-            }
-
-            // adding 14280 bytes. 1 byte per char, and 2 bytes to store the length
-            RecordId x = writer.writeString(Strings.repeat("x", 14278));
-            // writer.length == 262052
-
-            // Adding 765 bytes (255 recordIds)
-            // This should cause the current segment to flush
-            List<RecordId> list = Collections.nCopies(n, x);
-            writer.writeList(list);
-
-            writer.flush();
-
-            // Don't close the store in a finally clause as if a failure happens
-            // this will also fail an cover up the earlier exception
-            store.close();
-        }
-    }
-
     @Test
     public void nonBlockingROStore() throws Exception {
         FileStore store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java?rev=1825553&r1=1825552&r2=1825553&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java Wed Feb 28 11:58:42 2018
@@ -17,7 +17,6 @@
 
 package org.apache.jackrabbit.oak.segment.standby.server;
 
-import static java.util.Arrays.asList;
 import static java.util.UUID.randomUUID;
 import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
 import static org.junit.Assert.assertEquals;
@@ -28,10 +27,12 @@ import static org.junit.Assert.assertTru
 import java.io.File;
 import java.util.Iterator;
 
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -59,7 +60,7 @@ public class DefaultStandbyReferenceRead
         try (FileStore store = newFileStore()) {
             SegmentWriter writer = defaultSegmentWriterBuilder("test").build(store);
 
-            RecordId id = writer.writeString("test");
+            RecordId id = writer.writeNode(EmptyNodeState.EMPTY_NODE);
             writer.flush();
 
             DefaultStandbyReferencesReader reader = new DefaultStandbyReferencesReader(store);
@@ -73,10 +74,12 @@ public class DefaultStandbyReferenceRead
         try (FileStore store = newFileStore()) {
             SegmentWriter writer = defaultSegmentWriterBuilder("test").build(store);
 
-            RecordId a = writer.writeString("test");
+            RecordId a = writer.writeNode(EmptyNodeState.EMPTY_NODE);
             writer.flush();
 
-            RecordId b = writer.writeList(asList(a, a));
+            NodeBuilder builder = EmptyNodeState.EMPTY_NODE.builder();
+            builder.setChildNode("reference", store.getReader().readNode(a));
+            RecordId b = writer.writeNode(builder.getNodeState());
             writer.flush();
 
             DefaultStandbyReferencesReader reader = new DefaultStandbyReferencesReader(store);