From 680ab44626b229f93b535f4e8e7b64165490a591 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Fri, 21 Jun 2013 17:32:34 +0000
Subject: [PATCH] Fix to OPENDJ-746. CR-1904. We now request IndexOutputBuffer with the space needed, and allocate a specific temp one, if the key is too large to fit in default buffer. Minor code cleanup and clarification in the IndexOutputBuffer class.

---
 opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java |   35 ++++++++++++++++++++++-------------
 1 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
index 2bf4cdc..efc5095 100644
--- a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
@@ -1782,21 +1782,20 @@
         IndexOutputBuffer.ComparatorBuffer<byte[]> comparator,
         IndexKey indexKey, boolean insert) throws InterruptedException
     {
+      int sizeNeeded = IndexOutputBuffer.getRequiredSize(
+          key.length, entryID.longValue());
       IndexOutputBuffer indexBuffer = indexBufferMap.get(indexKey);
       if (indexBuffer == null)
       {
-        indexBuffer = getNewIndexBuffer();
+        indexBuffer = getNewIndexBuffer(sizeNeeded);
         indexBufferMap.put(indexKey, indexBuffer);
       }
-
-      if (!indexBuffer.isSpaceAvailable(key, entryID.longValue()))
+      else if (!indexBuffer.isSpaceAvailable(key, entryID.longValue()))
       {
-        // TODO Make sure the new indexBuffer has enough space for the
-        // key and ID. cf Bug OPENDJ-746
         indexBuffer.setComparator(comparator);
         indexBuffer.setIndexKey(indexKey);
         bufferSortService.submit(new SortTask(indexBuffer));
-        indexBuffer = getNewIndexBuffer();
+        indexBuffer = getNewIndexBuffer(sizeNeeded);
         indexBufferMap.put(indexKey, indexBuffer);
       }
       int id = System.identityHashCode(container);
@@ -1804,15 +1803,25 @@
       return id;
     }
 
-    IndexOutputBuffer getNewIndexBuffer() throws InterruptedException
+    IndexOutputBuffer getNewIndexBuffer(int size)
+        throws InterruptedException
     {
-      IndexOutputBuffer indexBuffer = freeBufferQueue.take();
-      if (indexBuffer == null)
+      IndexOutputBuffer indexBuffer;
+      if (size > bufferSize)
       {
-        Message message =
-            Message.raw(Category.JEB, Severity.SEVERE_ERROR,
-                "Index buffer processing error.");
-        throw new InterruptedException(message.toString());
+        indexBuffer = new IndexOutputBuffer(size);
+        indexBuffer.setDiscard();
+      }
+      else
+      {
+        indexBuffer = freeBufferQueue.take();
+        if (indexBuffer == null)
+        {
+          Message message =
+              Message.raw(Category.JEB, Severity.SEVERE_ERROR,
+                  "Index buffer processing error.");
+          throw new InterruptedException(message.toString());
+        }
       }
       if (indexBuffer.isPoison())
       {

--
Gitblit v1.10.0