From 2dc2216b94bcce8ec42ec4873661282e3ed6e9ed Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Fri, 17 Jun 2016 09:30:46 +0000
Subject: [PATCH] OPENDJ-2992: Windows: rebuild-index sometimes fails with BufferUnderflowException

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
index 22a85f6..ff9bfc7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
@@ -1564,10 +1564,10 @@
            * performed by the CollectorCursor.
            */
           checkThreadNotInterrupted();
-          final FileRegion region = new FileRegion(channel, startOffset, chunk.size());
           final int regionSize;
-          try (final SequentialCursor<ByteString, ByteString> source =
-              new CollectorCursor<>(chunk.flip(), phaseOneDeduplicator))
+          try (final FileRegion region = new FileRegion(channel, startOffset, chunk.size());
+               final SequentialCursor<ByteString, ByteString> source =
+                new CollectorCursor<>(chunk.flip(), phaseOneDeduplicator))
           {
             regionSize = region.write(source);
           }
@@ -1827,7 +1827,7 @@
      * +------------+--------------+--------------+----------------+
      * </pre>
      */
-    static final class FileRegion
+    static final class FileRegion implements Closeable
     {
       private final MappedByteBuffer mmapBuffer;
       private final OutputStream mmapBufferOS = new OutputStream()
@@ -1865,6 +1865,15 @@
         return mmapBuffer.position();
       }
 
+      @Override
+      public void close()
+      {
+        // Since this mmapBuffer will be GC'd, we have to ensure that the modified data
+        // are synced to disk. Indeed, there is no guarantee that these data
+        // will otherwise be available for the future File.map(READ).
+        mmapBuffer.force();
+      }
+
       /** Cursor through the specific memory-mapped file's region. */
       static final class Cursor implements MeteredCursor<ByteString, ByteString>
       {

--
Gitblit v1.10.0