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