From cb5aca9520b60a90810c741e7c5c50c43597d0a8 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 20 May 2014 13:42:22 +0000
Subject: [PATCH] Code cleanup.
---
opendj3-server-dev/src/server/org/opends/server/replication/plugin/PersistentServerState.java | 188 ++++++++++++++++++----------------------------
1 files changed, 73 insertions(+), 115 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/replication/plugin/PersistentServerState.java b/opendj3-server-dev/src/server/org/opends/server/replication/plugin/PersistentServerState.java
index 5dcd99e..d02614d 100644
--- a/opendj3-server-dev/src/server/org/opends/server/replication/plugin/PersistentServerState.java
+++ b/opendj3-server-dev/src/server/org/opends/server/replication/plugin/PersistentServerState.java
@@ -32,57 +32,39 @@
import java.util.List;
import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
-import org.forgerock.opendj.ldap.ModificationType;
-import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.ldap.*;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyOperationBasis;
-import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.protocols.ldap.LDAPModification;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.common.ServerState;
import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.DN;
import static org.opends.messages.ReplicationMessages.*;
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
/**
* This class implements a ServerState that is stored in the backend
* used to store the synchronized data and that is therefore persistent
* across server reboot.
*/
-public class PersistentServerState
+class PersistentServerState
{
private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
private final DN baseDn;
- private final InternalClientConnection conn =
- InternalClientConnection.getRootConnection();
private final int serverId;
-
private final ServerState state;
/**
* The attribute name used to store the state in the backend.
*/
- protected static final String REPLICATION_STATE = "ds-sync-state";
-
- /**
- * create a new ServerState.
- * @param baseDn The baseDN for which the ServerState is created
- * @param serverId The serverId
- */
- public PersistentServerState(DN baseDn, int serverId)
- {
- this.baseDn = baseDn;
- this.serverId = serverId;
- this.state = new ServerState();
- loadState();
- }
+ private static final String REPLICATION_STATE = "ds-sync-state";
/**
* Create a new PersistentServerState based on an already existing
@@ -92,7 +74,7 @@
* @param serverId The serverId.
* @param state The serverState.
*/
- public PersistentServerState(DN baseDn, int serverId, ServerState state)
+ PersistentServerState(DN baseDn, int serverId, ServerState state)
{
this.baseDn = baseDn;
this.serverId = serverId;
@@ -107,7 +89,7 @@
* @return A boolean indicating if this ServerState contains the CSN
* given in parameter.
*/
- public boolean cover(CSN covered)
+ boolean cover(CSN covered)
{
return state.cover(covered);
}
@@ -120,7 +102,7 @@
* The committed CSN.
* @return a boolean indicating if the update was meaningful.
*/
- public boolean update(CSN csn)
+ boolean update(CSN csn)
{
return state.update(csn);
}
@@ -130,14 +112,9 @@
*/
public void save()
{
- if (state.isSaved())
- return;
-
- state.setSaved(true);
- ResultCode resultCode = updateStateEntry();
- if (resultCode != ResultCode.SUCCESS)
+ if (!state.isSaved())
{
- state.setSaved(false);
+ state.setSaved(updateStateEntry() == ResultCode.SUCCESS);
}
}
@@ -189,9 +166,8 @@
*/
LinkedHashSet<String> attributes = new LinkedHashSet<String>(1);
attributes.add(REPLICATION_STATE);
- InternalSearchOperation search = conn.processSearch(baseDn,
- SearchScope.BASE_OBJECT,
- DereferenceAliasesPolicy.NEVER,
+ final InternalSearchOperation search = getRootConnection().processSearch(
+ baseDn, SearchScope.BASE_OBJECT, DereferenceAliasesPolicy.NEVER,
0, 0, false, filter, attributes);
if (((search.getResultCode() != ResultCode.SUCCESS)) &&
((search.getResultCode() != ResultCode.NO_SUCH_OBJECT)))
@@ -200,18 +176,7 @@
search.getErrorMessage(), baseDn);
return null;
}
-
- SearchResultEntry stateEntry = null;
- if (search.getResultCode() == ResultCode.SUCCESS)
- {
- // Read the serverState from the REPLICATION_STATE attribute
- LinkedList<SearchResultEntry> result = search.getSearchEntries();
- if (!result.isEmpty())
- {
- stateEntry = result.getFirst();
- }
- }
- return stateEntry;
+ return getFirstResult(search);
}
catch (DirectoryException e)
{
@@ -230,37 +195,39 @@
{
try
{
- SearchFilter filter =
- SearchFilter.createFilterFromString(
- "(&(objectclass=ds-cfg-replication-domain)"
- +"(ds-cfg-base-dn="+baseDn+"))");
+ SearchFilter filter = SearchFilter.createFilterFromString(
+ "(&(objectclass=ds-cfg-replication-domain)"
+ + "(ds-cfg-base-dn=" + baseDn + "))");
LinkedHashSet<String> attributes = new LinkedHashSet<String>(1);
attributes.add(REPLICATION_STATE);
- InternalSearchOperation op =
- conn.processSearch(DN.valueOf("cn=config"),
+ final InternalSearchOperation op = getRootConnection().processSearch(
+ DN.valueOf("cn=config"),
SearchScope.SUBORDINATES,
DereferenceAliasesPolicy.NEVER,
1, 0, false, filter, attributes);
-
- if (op.getResultCode() == ResultCode.SUCCESS)
- {
- // Read the serverState from the REPLICATION_STATE attribute
- LinkedList<SearchResultEntry> resultEntries =
- op.getSearchEntries();
- if (!resultEntries.isEmpty())
- {
- return resultEntries.getFirst();
- }
- }
- return null;
- } catch (DirectoryException e)
+ return getFirstResult(op);
+ }
+ catch (DirectoryException e)
{
// can not happen
return null;
}
}
+ private SearchResultEntry getFirstResult(InternalSearchOperation search)
+ {
+ if (search.getResultCode() == ResultCode.SUCCESS)
+ {
+ final LinkedList<SearchResultEntry> results = search.getSearchEntries();
+ if (!results.isEmpty())
+ {
+ return results.getFirst();
+ }
+ }
+ return null;
+ }
+
/**
* Update this ServerState from the provided entry.
*
@@ -291,15 +258,12 @@
*/
private ResultCode updateStateEntry()
{
- /*
- * Generate a modify operation on the Server State baseD Entry.
- */
+ // Generate a modify operation on the Server State baseDN Entry.
ResultCode result = runUpdateStateEntry(baseDn);
-
if (result == ResultCode.NO_SUCH_OBJECT)
{
- // The base entry does not exist yet in the database or
- // has been deleted, save the state to the config entry instead.
+ // The base entry does not exist yet in the database or has been deleted,
+ // save the state to the config entry instead.
SearchResultEntry configEntry = searchConfigEntry();
if (configEntry != null)
{
@@ -322,16 +286,13 @@
{
ArrayList<ByteString> values = state.toASN1ArrayList();
- LDAPAttribute attr =
- new LDAPAttribute(REPLICATION_STATE, values);
+ LDAPAttribute attr = new LDAPAttribute(REPLICATION_STATE, values);
LDAPModification mod = new LDAPModification(ModificationType.REPLACE, attr);
ArrayList<RawModification> mods = new ArrayList<RawModification>(1);
mods.add(mod);
- ModifyOperationBasis op =
- new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
- InternalClientConnection.nextMessageID(),
- new ArrayList<Control>(0),
+ ModifyOperationBasis op = new ModifyOperationBasis(getRootConnection(),
+ nextOperationID(), nextMessageID(), null,
ByteString.valueOf(serverStateEntryDN.toString()),
mods);
op.setInternalOperation(true);
@@ -340,7 +301,7 @@
op.run();
if (op.getResultCode() != ResultCode.SUCCESS)
{
- logger.trace(DEBUG_ERROR_UPDATING_RUV,
+ logger.error(DEBUG_ERROR_UPDATING_RUV,
op.getResultCode().getName(), op, op.getErrorMessage(), baseDn);
}
return op.getResultCode();
@@ -362,7 +323,7 @@
* After this call the Server State will be in the same state
* as if it was just created.
*/
- public void clear()
+ void clear()
{
clearInMemory();
save();
@@ -378,65 +339,62 @@
* This is done by using the HistoricalCsnOrderingMatchingRule
* and an ordering index for historical attribute
*/
- public final void checkAndUpdateServerState() {
- InternalSearchOperation op;
- CSN serverStateMaxCsn;
- CSN dbMaxCsn;
+ private final void checkAndUpdateServerState()
+ {
final AttributeType histType = DirectoryServer.getAttributeType(
- EntryHistorical.HISTORICAL_ATTRIBUTE_NAME);
+ EntryHistorical.HISTORICAL_ATTRIBUTE_NAME);
// Retrieves the entries that have changed since the
// maxCsn stored in the serverState
synchronized (this)
{
- serverStateMaxCsn = state.getCSN(serverId);
-
- if (serverStateMaxCsn == null)
+ CSN serverStateMaxCSN = state.getCSN(serverId);
+ if (serverStateMaxCSN == null)
+ {
return;
+ }
- try {
+ InternalSearchOperation op;
+ try
+ {
op = LDAPReplicationDomain.searchForChangedEntries(baseDn,
- serverStateMaxCsn, null);
+ serverStateMaxCSN, null);
}
catch (Exception e)
{
return;
}
+
if (op.getResultCode() != ResultCode.SUCCESS)
{
// An error happened trying to search for the updates
// Log an error
logger.error(ERR_CANNOT_RECOVER_CHANGES, baseDn.toNormalizedString());
+ return;
}
- else
+
+ CSN dbMaxCSN = serverStateMaxCSN;
+ for (SearchResultEntry resEntry : op.getSearchEntries())
{
- dbMaxCsn = serverStateMaxCsn;
- for (SearchResultEntry resEntry : op.getSearchEntries())
+ for (ByteString attrValue : resEntry.getAttribute(histType).get(0))
{
- for (ByteString attrValue : resEntry.getAttribute(histType).get(0))
+ HistoricalAttributeValue histVal =
+ new HistoricalAttributeValue(attrValue.toString());
+ CSN csn = histVal.getCSN();
+ if (csn != null
+ && csn.getServerId() == serverId
+ && dbMaxCSN.isOlderThan(csn))
{
- HistoricalAttributeValue histVal =
- new HistoricalAttributeValue(attrValue.toString());
- CSN csn = histVal.getCSN();
- if (csn != null && csn.getServerId() == serverId)
- {
- // compare the csn regarding the maxCsn we know and
- // store the biggest
- if (CSN.compare(dbMaxCsn, csn) < 0)
- {
- dbMaxCsn = csn;
- }
- }
+ dbMaxCSN = csn;
}
}
+ }
- if (CSN.compare(dbMaxCsn, serverStateMaxCsn) > 0)
- {
- // Update the serverState with the new maxCsn
- // present in the database
- this.update(dbMaxCsn);
- logger.info(NOTE_SERVER_STATE_RECOVERY, baseDn.toNormalizedString(), dbMaxCsn);
- }
+ if (dbMaxCSN.isNewerThan(serverStateMaxCSN))
+ {
+ // Update the serverState with the new maxCsn present in the database
+ update(dbMaxCSN);
+ logger.info(NOTE_SERVER_STATE_RECOVERY, baseDn.toNormalizedString(), dbMaxCSN);
}
}
}
--
Gitblit v1.10.0