From b12119c55b89ece2495e84fba229d96439e8219b Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Fri, 30 Jul 2010 14:52:40 +0000
Subject: [PATCH] Implements index analysis features. There are 2 components: Index Filter Analyzer : Part of DatabaseEnvironmentProvider, it gathers search filter statistics and displays the index filter, number of hits, max matching entries, and a message. Compound filters are broken down to their basic elements. f an index was not utilized while evaluating the search filter, max matching entries will be -1 and a diagnostic message will be included. The monitor entry also includes when the analyzer was enabled along with the number of total index and unindexed searches processed. 

---
 opends/src/server/org/opends/server/tools/DBTest.java |   95 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/DBTest.java b/opends/src/server/org/opends/server/tools/DBTest.java
index b24a540..b245ff0 100644
--- a/opends/src/server/org/opends/server/tools/DBTest.java
+++ b/opends/src/server/org/opends/server/tools/DBTest.java
@@ -962,6 +962,13 @@
       builder.appendHeading(INFO_LABEL_DBTEST_INDEX_TYPE.get());
       builder.appendHeading(INFO_LABEL_DBTEST_JE_DATABASE_NAME.get());
       builder.appendHeading(INFO_LABEL_DBTEST_INDEX_STATUS.get());
+      builder.appendHeading(INFO_LABEL_DBTEST_JE_RECORD_COUNT.get());
+      builder.appendHeading(
+          INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT.get());
+      builder.appendHeading(Message.raw("95%"));
+      builder.appendHeading(Message.raw("90%"));
+      builder.appendHeading(Message.raw("85%"));
+
 
       EntryContainer ec = rc.getEntryContainer(base);
 
@@ -974,6 +981,8 @@
 
       ArrayList<DatabaseContainer> databaseContainers =
           new ArrayList<DatabaseContainer>();
+      Map<Index, StringBuilder> undefinedKeys =
+          new HashMap<Index, StringBuilder>();
       ec.listDatabases(databaseContainers);
       for(DatabaseContainer dc : databaseContainers)
       {
@@ -994,6 +1003,86 @@
             builder.appendCell(ec.getState().getIndexTrustState(null,
                                                                ((VLVIndex)dc)));
           }
+          builder.appendCell(dc.getRecordCount());
+
+          if(dc instanceof Index)
+          {
+            Index index = (Index)dc;
+            long undefined = 0, ninetyFive = 0, ninety = 0, eighty = 0;
+            DatabaseEntry key = new DatabaseEntry();
+            DatabaseEntry data = new DatabaseEntry();
+            LockMode lockMode = LockMode.DEFAULT;
+            OperationStatus status;
+
+            Cursor cursor = dc.openCursor(null, CursorConfig.DEFAULT);
+            status = cursor.getFirst(key, data, lockMode);
+            while(status == OperationStatus.SUCCESS)
+            {
+              byte[] bytes = data.getData();
+              if (bytes.length == 0 || ((bytes[0] & 0x80) == 0x80))
+              {
+                // Entry limit has exceeded and there is no encoded
+                //  undefined set size.
+                undefined ++;
+                StringBuilder keyList = undefinedKeys.get(index);
+                if(keyList == null)
+                {
+                  keyList = new StringBuilder();
+                  undefinedKeys.put(index, keyList);
+                }
+                else
+                {
+                  keyList.append(" ");
+                }
+                if(index == ec.getID2Children() || index == ec.getID2Subtree())
+                {
+                  keyList.append("[").append(
+                    JebFormat.entryIDFromDatabase(key.getData())).append("]");
+                }
+                else
+                {
+                  keyList.append("[").append(
+                    new String(key.getData())).append("]");
+                }
+              }
+              else
+              {
+                // Seems like entry limit has not been exceeded and the bytes
+                // is a list of entry IDs.
+                double percentFull =
+                    (bytes.length / 8) / index.getIndexEntryLimit();
+                if(percentFull >= .8)
+                {
+                  if(percentFull < .9)
+                  {
+                    eighty++;
+                  }
+                  else if(percentFull < .95)
+                  {
+                    ninety++;
+                  }
+                  else
+                  {
+                    ninetyFive++;
+                  }
+                }
+              }
+              status = cursor.getNext(key, data, lockMode);
+            }
+            builder.appendCell(undefined);
+            builder.appendCell(ninetyFive);
+            builder.appendCell(ninety);
+            builder.appendCell(eighty);
+            cursor.close();
+          }
+          else
+          {
+            builder.appendCell("-");
+            builder.appendCell("-");
+            builder.appendCell("-");
+            builder.appendCell("-");
+          }
+
           count++;
         }
       }
@@ -1001,6 +1090,12 @@
       TextTablePrinter printer = new TextTablePrinter(out);
       builder.print(printer);
       out.format("%nTotal: %d%n", count);
+      for(Map.Entry<Index, StringBuilder> e : undefinedKeys.entrySet())
+      {
+        out.format("%nIndex: %s%n",
+            e.getKey().getName().replace(ec.getDatabasePrefix()+"_", ""));
+        out.format("Undefined keys: %s%n", e.getValue().toString());
+      }
       return 0;
     }
     catch(DatabaseException de)

--
Gitblit v1.10.0