From 81c0eef4f2ae79b193c55ec6b75137425bb3afea Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Fri, 09 Nov 2007 22:20:28 +0000
Subject: [PATCH] This set of updates fix several issues related to the JEB backend:

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java |   27 ++++++++
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VLVIndex.java       |    2 
 opendj-sdk/opends/src/messages/messages/jeb.properties                          |    4 +
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/RootContainer.java  |  126 +++++++++++++++++++++++++++++++++++++++++-
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java          |    2 
 5 files changed, 155 insertions(+), 6 deletions(-)

diff --git a/opendj-sdk/opends/src/messages/messages/jeb.properties b/opendj-sdk/opends/src/messages/messages/jeb.properties
index 0e322aa..ba6716e 100644
--- a/opendj-sdk/opends/src/messages/messages/jeb.properties
+++ b/opendj-sdk/opends/src/messages/messages/jeb.properties
@@ -333,4 +333,8 @@
 SEVERE_ERR_JEB_COMPSCHEMA_UNRECOGNIZED_AD_TOKEN_171=Unable to decode the \
  provided attribute because it used an undefined attribute description token \
  %s
+INFO_JEB_CONFIG_DB_DIR_REQUIRES_RESTART_172=The change to the DB directory \
+  will not take effect until the backend is restarted. The DB files from the \
+  previous directory %s must be moved to the new directory %s after shutting \
+  down the backend to retain the existing data
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index 7073463..e810c93 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -3831,7 +3831,32 @@
    */
   public long getEntryCount() throws DatabaseException
   {
-    return id2entry.getRecordCount();
+    EntryID entryID = dn2id.get(null, baseDN);
+    if (entryID != null)
+    {
+      DatabaseEntry key =
+          new DatabaseEntry(JebFormat.entryIDToDatabase(entryID.longValue()));
+      EntryIDSet entryIDSet;
+      entryIDSet = id2subtree.readKey(key, null, LockMode.DEFAULT);
+
+      long count = entryIDSet.size();
+      if(count != Long.MAX_VALUE)
+      {
+        // Add the base entry itself
+        return ++count;
+      }
+      else
+      {
+        // The count is not maintained. Fall back to the slow method
+        return id2entry.getRecordCount();
+      }
+    }
+    else
+    {
+      // Base entry doesn't not exist so this entry container
+      // must not have any entries
+      return 0;
+    }
   }
 
   /**
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
index 8e8fe1c..9f00700 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -153,7 +153,7 @@
     this.state = state;
 
     this.trusted = state.getIndexTrustState(null, this);
-    if(!trusted && entryContainer.getEntryCount() <= 0)
+    if(!trusted && entryContainer.getHighestEntryID().equals(new EntryID(0)))
     {
       // If there are no entries in the entry container then there
       // is no reason why this index can't be upgraded to trusted.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/RootContainer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/RootContainer.java
index b483d58..2fbd12b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/RootContainer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/RootContainer.java
@@ -145,8 +145,18 @@
     // Determine the backend database directory.
     File backendDirectory = getFileForPath(config.getDBDirectory());
 
+    // Create the directory if it doesn't exist.
+    if (!backendDirectory.exists())
+    {
+      if(!backendDirectory.mkdirs())
+      {
+        Message message =
+            ERR_JEB_DIRECTORY_INVALID.get(backendDirectory.getPath());
+        throw new ConfigException(message);
+      }
+    }
     //Make sure the directory is valid.
-    if (!backendDirectory.isDirectory())
+    else if (!backendDirectory.isDirectory())
     {
       Message message =
           ERR_JEB_DIRECTORY_INVALID.get(backendDirectory.getPath());
@@ -714,11 +724,26 @@
     boolean acceptable = true;
 
     File backendDirectory = getFileForPath(cfg.getDBDirectory());
+    //Make sure the directory either alreadly exists or is able to create.
+    if (!backendDirectory.exists())
+    {
+      if(!backendDirectory.mkdirs())
+      {
+        Message message =
+            ERR_JEB_DIRECTORY_INVALID.get(backendDirectory.getPath());
+        unacceptableReasons.add(message);
+        acceptable = false;
+      }
+      else
+      {
+        backendDirectory.delete();
+      }
+    }
     //Make sure the directory is valid.
-    if (!backendDirectory.isDirectory())
+    else if (!backendDirectory.isDirectory())
     {
       Message message =
-              ERR_JEB_DIRECTORY_INVALID.get(backendDirectory.getPath());
+          ERR_JEB_DIRECTORY_INVALID.get(backendDirectory.getPath());
       unacceptableReasons.add(message);
       acceptable = false;
     }
@@ -844,6 +869,101 @@
           TRACER.debugInfo(env.getConfig().toString());
         }
       }
+
+      // Create the directory if it doesn't exist.
+      if(!cfg.getDBDirectory().equals(this.config.getDBDirectory()))
+      {
+        File backendDirectory = getFileForPath(cfg.getDBDirectory());
+
+        if (!backendDirectory.exists())
+        {
+          if(!backendDirectory.mkdirs())
+          {
+            messages.add(ERR_JEB_DIRECTORY_INVALID.get(
+                backendDirectory.getPath()));
+            ccr = new ConfigChangeResult(
+                DirectoryServer.getServerErrorResultCode(),
+                adminActionRequired,
+                messages);
+            return ccr;
+          }
+        }
+        //Make sure the directory is valid.
+        else if (!backendDirectory.isDirectory())
+        {
+          messages.add(ERR_JEB_DIRECTORY_INVALID.get(
+              backendDirectory.getPath()));
+          ccr = new ConfigChangeResult(
+              DirectoryServer.getServerErrorResultCode(),
+              adminActionRequired,
+              messages);
+          return ccr;
+        }
+
+        adminActionRequired = true;
+        messages.add(INFO_JEB_CONFIG_DB_DIR_REQUIRES_RESTART.get(
+                        this.config.getDBDirectory(), cfg.getDBDirectory()));
+      }
+
+      if(!cfg.getDBDirectoryPermissions().equalsIgnoreCase(
+          config.getDBDirectoryPermissions()) ||
+          !cfg.getDBDirectory().equals(this.config.getDBDirectory()))
+      {
+        FilePermission backendPermission;
+        try
+        {
+          backendPermission =
+              FilePermission.decodeUNIXMode(cfg.getDBDirectoryPermissions());
+        }
+        catch(Exception e)
+        {
+          messages.add(ERR_CONFIG_BACKEND_MODE_INVALID.get(
+              config.dn().toString()));
+          ccr = new ConfigChangeResult(
+              DirectoryServer.getServerErrorResultCode(),
+              adminActionRequired,
+              messages);
+          return ccr;
+        }
+
+        //Make sure the mode will allow the server itself access to
+        //the database
+        if(!backendPermission.isOwnerWritable() ||
+            !backendPermission.isOwnerReadable() ||
+            !backendPermission.isOwnerExecutable())
+        {
+          messages.add(WARN_CONFIG_BACKEND_INSANE_MODE.get());
+          ccr = new ConfigChangeResult(
+              DirectoryServer.getServerErrorResultCode(),
+              adminActionRequired,
+              messages);
+          return ccr;
+        }
+
+        // Get the backend database backendDirectory permissions and apply
+        if(FilePermission.canSetPermissions())
+        {
+          File backendDirectory = getFileForPath(cfg.getDBDirectory());
+          try
+          {
+            if(!FilePermission.setPermissions(backendDirectory,
+                backendPermission))
+            {
+              Message message = WARN_JEB_UNABLE_SET_PERMISSIONS.get(
+                  backendPermission.toString(), backendDirectory.toString());
+              logError(message);
+            }
+          }
+          catch(Exception e)
+          {
+            // Log an warning that the permissions were not set.
+            Message message = WARN_JEB_SET_PERMISSIONS_FAILED.get(
+                backendDirectory.toString(), e.toString());
+            logError(message);
+          }
+        }
+      }
+
       this.config = cfg;
     }
     catch (Exception e)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VLVIndex.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VLVIndex.java
index 00de153..aa637ac 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VLVIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VLVIndex.java
@@ -240,7 +240,7 @@
     this.state = state;
 
     this.trusted = state.getIndexTrustState(null, this);
-    if(!trusted && entryContainer.getEntryCount() <= 0)
+    if(!trusted && entryContainer.getHighestEntryID().equals(new EntryID(0)))
     {
       // If there are no entries in the entry container then there
       // is no reason why this vlvIndex can't be upgraded to trusted.

--
Gitblit v1.10.0