mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Nicolas Capponi
11.35.2016 d8a0693ee610f39d28ccaf139869578b08c307ec
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java
@@ -11,7 +11,7 @@
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2014-2015 ForgeRock AS.
 * Copyright 2014-2016 ForgeRock AS.
 */
package org.opends.server.replication.server.changelog.file;
@@ -613,7 +613,13 @@
Record<K, V> getNewestRecord() throws ChangelogException
 {
   try {
     final long lastBlockStart = getClosestBlockStartBeforeOrAtPosition(getFileLength());
     final long fileLength = getFileLength();
     long lastBlockStart = getClosestBlockStartBeforeOrAtPosition(fileLength);
     if (lastBlockStart == fileLength)
     {
       // this is not a valid block start, find the previous block start
       lastBlockStart = getClosestBlockStartBeforeOrAtPosition(fileLength-1);
     }
     positionToRecordFromBlockStart(lastBlockStart);
     ByteString candidate = readNextRecord();
     ByteString record = candidate;
opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java
@@ -264,6 +264,37 @@
    assertThat(reader.getClosestBlockStartBeforeOrAtPosition(20)).isEqualTo(20);
  }
  @DataProvider
  Object[][] recordsForNewest()
  {
    return new Object[][]
    {
      // raw size taken by each record is: 4 (record size) + 4 (key) + 4 (value) = 12 bytes
      // size of block, records to write
      { 12, records(1) }, // zero block marker
      { 10, records(1) }, // one block marker
      { 8, records(1) },  // one block marker
      { 7, records(1) },  // two block markers
      { 6, records(1) },  // three block markers
      { 5, records(1) },  // seven block markers
      { 16, records(1,2) }, // one block marker
      { 12, records(1,2) }, // two block markers
      { 10, records(1,2) }, // three block markers
    };
  }
  @Test(dataProvider="recordsForNewest")
  public void testGetNewestRecord(int blockSize, List<Record<Integer, Integer>> records) throws Exception
  {
    writeRecords(blockSize, records);
    try(BlockLogReader<Integer, Integer> reader = newReader(blockSize))
    {
      assertThat(reader.getNewestRecord()).isEqualTo(records.get(records.size()-1));
    }
  }
  @Test
  public void testGetClosestMarkerStrictlyAfterPosition() throws Exception
  {