From ae6f8ddb99bda4ed034ec8310aef18403b18e9a2 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 09 Apr 2015 16:57:19 +0000
Subject: [PATCH] IndexOutputBuffer.java: Prevent too many allocations

---
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java |   34 +++++++++++++++++++++++-----------
 1 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
index 5310350..5eeaf92 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexOutputBuffer.java
@@ -462,12 +462,12 @@
 
   private int med3(int a, int b, int c)
   {
-    ImportRecord pa = toRecord(a);
-    ImportRecord pb = toRecord(b);
-    ImportRecord pc = toRecord(c);
-    return pa.compareTo(pb) < 0
-        ? (pb.compareTo(pc) < 0 ? b : pa.compareTo(pc) < 0 ? c : a)
-        : (pb.compareTo(pc) > 0 ? b : pa.compareTo(pc) > 0 ? c : a);
+    ImportRecord ra = toRecord(a);
+    ImportRecord rb = toRecord(b);
+    ImportRecord rc = toRecord(c);
+    return ra.compareTo(rb) < 0
+        ? (rb.compareTo(rc) < 0 ? b : ra.compareTo(rc) < 0 ? c : a)
+        : (rb.compareTo(rc) > 0 ? b : ra.compareTo(rc) > 0 ? c : a);
   }
 
   private void sort(int off, int len)
@@ -499,22 +499,34 @@
     int a = off, b = a, c = off + len - 1, d = c;
     while(true)
     {
-      while (b <= c && toRecord(b).compareTo(toRecord(m)) <= 0)
+      ImportRecord rm = toRecord(m);
+      while (b <= c)
       {
-        if (toRecord(b).equals(toRecord(m)))
+        int cmp = toRecord(b).compareTo(rm);
+        if (cmp > 0)
+        {
+          break;
+        }
+        else if (cmp == 0)
         {
           swap(a++, b);
         }
         b++;
       }
-      while (c >= b && toRecord(c).compareTo(toRecord(m)) >= 0)
-      {
-        if (toRecord(c).equals(toRecord(m)))
+
+      while (c >= b) {
+        int cmp = toRecord(c).compareTo(rm);
+        if (cmp < 0)
+        {
+          break;
+        }
+        else if (cmp == 0)
         {
           swap(c, d--);
         }
         c--;
       }
+
       if (b > c)
       {
         break;

--
Gitblit v1.10.0