From 242140c76ae803f9d876aba8d07e60a104611e6d Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Wed, 22 Apr 2015 09:52:42 +0000
Subject: [PATCH] OPENDJ-1958: Online Import doesn't work with new backend.

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportIDSet.java |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportIDSet.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportIDSet.java
index d00cfad..14fc3d3 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportIDSet.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportIDSet.java
@@ -134,17 +134,30 @@
     checkNotNull(importIdSet, "importIdSet must not be null");
 
     boolean definedBeforeMerge = isDefined();
-    final long mergedSize = size() + importIdSet.size();
+    final long mergedSize = addWithoutOverflow(entryIDSet.size(), importIdSet.entryIDSet.size());
 
-    if (!importIdSet.isDefined() || mergedSize > indexEntryLimitSize) {
+    if (!definedBeforeMerge || !importIdSet.isDefined() || mergedSize > indexEntryLimitSize)
+    {
       entryIDSet = maintainCount ? newUndefinedSetWithSize(key, mergedSize) : newUndefinedSetWithKey(key);
       return definedBeforeMerge;
-    } else if (isDefined() || maintainCount){
+    }
+    else if (isDefined() || maintainCount)
+    {
       entryIDSet.addAll(importIdSet.entryIDSet);
     }
     return false;
   }
 
+  private static long addWithoutOverflow(long a, long b) {
+    /** a and b must be > 0 */
+    final boolean willAdditionOverflow = (~(a ^ b) & (a ^ (a + b))) < 0;
+    if (willAdditionOverflow) {
+      return Long.MAX_VALUE;
+    }
+    return a + b;
+  }
+
+
   /**
    * @return The current size of an import ID set.
    * @throws IllegalStateException if this set is undefined

--
Gitblit v1.10.0