From 9f0904fda87bfcf921deeccdbaeafe834fbad696 Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Fri, 24 Apr 2015 14:30:47 +0000
Subject: [PATCH] OPENDJ-1725: Persistit: very long recovery and many discarded txns after addrate test

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryIDSet.java |  133 ++++++++++++--------------------------------
 1 files changed, 36 insertions(+), 97 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryIDSet.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryIDSet.java
index 5b96e85..f21f709 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryIDSet.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryIDSet.java
@@ -276,10 +276,7 @@
       {
         return new long[] { entryIDs[0], entryIDs[entryIDs.length - 1] };
       }
-      else
-      {
-        return NO_ENTRY_IDS_RANGE;
-      }
+      return NO_ENTRY_IDS_RANGE;
     }
 
     @Override
@@ -295,25 +292,19 @@
   private static final class UndefinedImpl implements EntryIDSetImplementor
   {
     /**
-     * The number of entry IDs in the set if the size is being maintained, otherwise Long.MAX_VALUE
-     */
-    private long undefinedSize;
-
-    /**
      * The database key containing this set, if the set was constructed directly from the database.
      */
     private final ByteSequence databaseKey;
 
-    UndefinedImpl(ByteSequence key, long size)
+    UndefinedImpl(ByteSequence key)
     {
       databaseKey = checkNotNull(key, "key must not be null");
-      undefinedSize = size;
     }
 
     @Override
     public long size()
     {
-      return undefinedSize;
+      return Long.MAX_VALUE;
     }
 
     @Override
@@ -323,21 +314,12 @@
       {
         buffer.append("[NOT-INDEXED]");
       }
-      else if (maintainUndefinedSize())
-      {
-        buffer.append("[LIMIT-EXCEEDED:").append(undefinedSize).append("]");
-      }
       else
       {
         buffer.append("[LIMIT-EXCEEDED]");
       }
     }
 
-    private boolean maintainUndefinedSize()
-    {
-      return undefinedSize != Long.MAX_VALUE;
-    }
-
     @Override
     public boolean isDefined()
     {
@@ -347,20 +329,12 @@
     @Override
     public boolean add(EntryID entryID)
     {
-      if (maintainUndefinedSize())
-      {
-        undefinedSize++;
-      }
       return true;
     }
 
     @Override
     public boolean remove(EntryID entryID)
     {
-      if (maintainUndefinedSize() && undefinedSize > 0)
-      {
-        undefinedSize--;
-      }
       return true;
     }
 
@@ -373,21 +347,11 @@
     @Override
     public void addAll(EntryIDSet that)
     {
-      // Assume there are no overlap between IDs in that set with this set
-      if (maintainUndefinedSize())
-      {
-        undefinedSize += that.size();
-      }
     }
 
     @Override
     public void removeAll(EntryIDSet that)
     {
-      // Assume all IDs in the given set exists in this set.
-      if (maintainUndefinedSize())
-      {
-        undefinedSize = Math.max(0, undefinedSize - that.size());
-      }
     }
 
     @Override
@@ -481,7 +445,7 @@
       else if ((value.byteAt(0) & 0x80) == 0x80)
       {
         // Entry limit has exceeded and there is an encoded undefined set size.
-        return newUndefinedSetWithSize(key, decodeUndefinedSize(value));
+        return newUndefinedSetWithKey(key);
       }
       else
       {
@@ -490,19 +454,12 @@
       }
     }
 
-    private int getEstimatedSize(EntryIDSet idSet)
+    private static int getEstimatedSize(EntryIDSet idSet)
     {
-      if (idSet.isDefined())
-      {
-        return idSet.getIDs().length * LONG_SIZE;
-      }
-      else
-      {
-        return LONG_SIZE;
-      }
+      return idSet.isDefined() ? idSet.getIDs().length * LONG_SIZE : LONG_SIZE;
     }
 
-    private long[] decodeRaw(ByteSequenceReader reader, int nbEntriesToDecode)
+    private static long[] decodeRaw(ByteSequenceReader reader, int nbEntriesToDecode)
     {
       checkNotNull(reader, "builder must not be null");
       Reject.ifFalse(nbEntriesToDecode >= 0, "nbEntriesToDecode must be >= 0");
@@ -514,7 +471,7 @@
       return ids;
     }
 
-    private ByteStringBuilder append(ByteStringBuilder builder, EntryIDSet idSet)
+    private static ByteStringBuilder append(ByteStringBuilder builder, EntryIDSet idSet)
     {
       checkNotNull(idSet, "idSet must not be null");
       checkNotNull(builder, "builder must not be null");
@@ -527,17 +484,8 @@
         }
         return builder;
       }
-      else
-      {
-        // Set top bit.
-        return builder.append(idSet.size() | Long.MIN_VALUE);
-      }
-    }
-
-    private static long decodeUndefinedSize(ByteSequence bytes)
-    {
-      // remove top bit
-      return bytes.length() == LONG_SIZE ? bytes.asReader().getLong() & Long.MAX_VALUE : Long.MAX_VALUE;
+      // Set top bit.
+      return builder.append((byte) 0x80);
     }
   }
 
@@ -564,17 +512,15 @@
     {
       checkNotNull(key, "key must not be null");
       checkNotNull(value, "value must not be null");
-
-      final ByteSequenceReader reader = value.asReader();
-      if ( reader.get() == UNDEFINED_SET) {
-          return newUndefinedSetWithSize(key, reader.getLong());
-      } else {
-          reader.rewind();
-          return newDefinedSet(decodeRaw(reader, (int) reader.getCompactUnsigned()));
+      if (value.byteAt(0) == UNDEFINED_SET)
+      {
+        return newUndefinedSetWithKey(key);
       }
+      final ByteSequenceReader reader = value.asReader();
+      return newDefinedSet(decodeRaw(reader, (int) reader.getCompactUnsigned()));
     }
 
-    private ByteStringBuilder append(ByteStringBuilder builder, EntryIDSet idSet)
+    private static ByteStringBuilder append(ByteStringBuilder builder, EntryIDSet idSet)
     {
       checkNotNull(idSet, "idSet must not be null");
       checkNotNull(builder, "builder must not be null");
@@ -592,48 +538,41 @@
       else
       {
         builder.append(UNDEFINED_SET);
-        builder.append(idSet.size());
       }
       return builder;
     }
 
-    private int getEstimatedSize(EntryIDSet idSet)
+    private static int getEstimatedSize(EntryIDSet idSet)
     {
       checkNotNull(idSet, "idSet must not be null");
       return idSet.getIDs().length * LONG_SIZE + INT_SIZE;
     }
 
-    private long[] decodeRaw(ByteSequenceReader reader, int nbEntriesToDecode)
+    private static long[] decodeRaw(ByteSequenceReader reader, int nbEntriesToDecode)
     {
       checkNotNull(reader, "reader must not be null");
       Reject.ifFalse(nbEntriesToDecode >= 0, "nbEntriesToDecode must be >= 0");
 
       if ( nbEntriesToDecode == 0 ) {
         return EMPTY_LONG_ARRAY;
-      } else {
-        final long ids[] = new long[nbEntriesToDecode];
-        ids[0] = reader.getCompactUnsigned();
-        for(int i = 1 ; i < nbEntriesToDecode ; i++) {
-          ids[i] = ids[i-1] + reader.getCompactUnsigned();
-        }
-        return ids;
       }
+      final long ids[] = new long[nbEntriesToDecode];
+      ids[0] = reader.getCompactUnsigned();
+      for(int i = 1 ; i < nbEntriesToDecode ; i++) {
+        ids[i] = ids[i-1] + reader.getCompactUnsigned();
+      }
+      return ids;
     }
   }
 
   static EntryIDSet newUndefinedSet()
   {
-    return new EntryIDSet(new UndefinedImpl(NO_KEY, Long.MAX_VALUE));
+    return newUndefinedSetWithKey(NO_KEY);
   }
 
   static EntryIDSet newUndefinedSetWithKey(ByteSequence key)
   {
-    return newUndefinedSetWithSize(key, Long.MAX_VALUE);
-  }
-
-  static EntryIDSet newUndefinedSetWithSize(ByteSequence key, long undefinedSize)
-  {
-    return new EntryIDSet(new UndefinedImpl(key, undefinedSize));
+    return new EntryIDSet(new UndefinedImpl(key));
   }
 
   /**
@@ -708,7 +647,7 @@
 
     if (containsUndefinedSet)
     {
-      return newUndefinedSetWithSize(null, count);
+      return newUndefinedSet();
     }
 
     boolean needSort = false;
@@ -742,10 +681,7 @@
     {
       return newDefinedSet(n1);
     }
-    else
-    {
-      return newDefinedSet(Arrays.copyOf(n1, j));
-    }
+    return newDefinedSet(Arrays.copyOf(n1, j));
   }
 
   private EntryIDSetImplementor concreteImpl;
@@ -878,7 +814,7 @@
         // performed by the implementation.
         concreteImpl = new DefinedImpl(that.getIDs());
       } else {
-        concreteImpl = new UndefinedImpl(NO_KEY, that.size());
+        concreteImpl = new UndefinedImpl(NO_KEY);
       }
       return;
     }
@@ -948,6 +884,12 @@
     return concreteImpl.getRange();
   }
 
+  static long addWithoutOverflow(long a, long b) {
+    /** a and b must be > 0 */
+    final long result = a + b;
+    return result >= 0 ? result : Long.MAX_VALUE;
+  }
+
   private static long[] mergeOverlappingEntryIDSet(long set1[], long set2[])
   {
     final long[] a, b;
@@ -989,10 +931,7 @@
     {
       return Arrays.copyOf(newEntryIDs, targetIndex);
     }
-    else
-    {
-      return newEntryIDs;
-    }
+    return newEntryIDs;
   }
 
   private static int copyRemainder(long[] sourceIDSet, final long[] newEntryIDs, int offset, int remainerIndex)

--
Gitblit v1.10.0