From 31e832ff7b784de050bfe98404829c3d966d47c2 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Tue, 15 Dec 2009 00:10:26 +0000
Subject: [PATCH] Import scalabilty improvements.
---
opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java | 73 ++++++++++++++++++++++--------------
1 files changed, 45 insertions(+), 28 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java b/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
index 6e26ed2..ca2f76e 100644
--- a/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
+++ b/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
@@ -29,9 +29,15 @@
import org.opends.server.backends.jeb.EntryID;
import org.opends.server.backends.jeb.JebFormat;
+import java.nio.ByteBuffer;
+
/**
- * An import ID set backed by an array of integers.
+ * This class manages the set of ID that are to be eventually added to an index
+ * database. It is responsible for determining if the number of IDs is above
+ * the configured ID limit. If the limit it reached, the class stops tracking
+ * individual IDs and marks the set as undefined. This class is not thread
+ * safe.
*/
public class ImportIDSet {
@@ -46,17 +52,19 @@
*/
private int count = 0;
-
//Boolean to keep track if the instance is defined or not.
private boolean isDefined=true;
-
//Size of the undefined if count is kept.
private long undefinedSize = 0;
//Key related to an ID set.
- private byte[] key;
+ private ByteBuffer key;
+
+ //The entry limit size.
private int limit = -1;
+
+ //Set to true if a count of ids above the entry limit should be kept.
private boolean doCount = false;
@@ -75,14 +83,16 @@
this.doCount = doCount;
}
+
/**
* Create an empty import instance.
- */
+ */
public ImportIDSet()
{
}
+
/**
* Clear the set so it can be reused again. The boolean indexParam specifies
* if the index parameters should be cleared also.
@@ -102,6 +112,7 @@
}
}
+
/**
* Return if an import ID set is defined or not.
*
@@ -112,6 +123,7 @@
return isDefined;
}
+
/**
* Return the undefined size of an import ID set.
*
@@ -122,6 +134,7 @@
return undefinedSize;
}
+
/**
* Set an import ID set to undefined.
*/
@@ -157,7 +170,7 @@
{
if(doCount)
{
- undefinedSize += importIDSet.size();
+ undefinedSize += importIDSet.size();
}
}
else if(!importIDSet.isDefined()) //other undefined
@@ -197,7 +210,8 @@
addEntryID(entryID.longValue());
}
- /**
+
+ /**
* Add the specified long value to an import ID set.
*
* @param l The long value to add to an import ID set.
@@ -209,7 +223,8 @@
}
return;
}
- if(isDefined() && ((count + 1) > limit)) {
+ if((l < 0) || (isDefined() && ((count + 1) > limit)))
+ {
isDefined = false;
array = null;
if(doCount) {
@@ -230,24 +245,24 @@
boolean dbUndefined = ((dBbytes[0] & 0x80) == 0x80);
if(dbUndefined && (!importIdSet.isDefined())) {
- undefinedSize = JebFormat.entryIDUndefinedSizeFromDatabase(dBbytes) +
- importIdSet.getUndefinedSize();
- isDefined=false;
+ undefinedSize = JebFormat.entryIDUndefinedSizeFromDatabase(dBbytes) +
+ importIdSet.getUndefinedSize();
+ isDefined=false;
} else if(dbUndefined && (importIdSet.isDefined())) {
- undefinedSize = JebFormat.entryIDUndefinedSizeFromDatabase(dBbytes) +
- importIdSet.size();
- isDefined=false;
+ undefinedSize = JebFormat.entryIDUndefinedSizeFromDatabase(dBbytes) +
+ importIdSet.size();
+ isDefined=false;
} else if(!importIdSet.isDefined()) {
- int dbSize = JebFormat.entryIDListFromDatabase(dBbytes).length;
- undefinedSize = dbSize + importIdSet.getUndefinedSize();
- isDefined = false;
- incrementLimitCount = true;
+ int dbSize = JebFormat.entryIDListFromDatabase(dBbytes).length;
+ undefinedSize = dbSize + importIdSet.getUndefinedSize();
+ isDefined = false;
+ incrementLimitCount = true;
} else {
array = JebFormat.entryIDListFromDatabase(dBbytes);
if(array.length + importIdSet.size() > limit) {
- undefinedSize = array.length + importIdSet.size();
- isDefined=false;
- incrementLimitCount=true;
+ undefinedSize = array.length + importIdSet.size();
+ isDefined=false;
+ incrementLimitCount=true;
} else {
count = array.length;
addAll(importIdSet);
@@ -525,11 +540,11 @@
public byte[] toDatabase()
{
if(isDefined) {
- return encode(null);
- } else {
- return JebFormat.entryIDUndefinedSizeToDatabase(undefinedSize);
- }
- }
+ return encode(null);
+ } else {
+ return JebFormat.entryIDUndefinedSizeToDatabase(undefinedSize);
+ }
+ }
private byte[] encode(byte[] bytes)
@@ -552,22 +567,24 @@
return bytes;
}
+
/**
* Set the DB key related to an import ID set.
*
* @param key Byte array containing the key.
*/
- public void setKey(byte[] key)
+ public void setKey(ByteBuffer key)
{
this.key = key;
}
+
/**
* Return the DB key related to an import ID set.
*
* @return The byte array containing the key.
*/
- public byte[] getKey()
+ public ByteBuffer getKey()
{
return key;
}
--
Gitblit v1.10.0