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