From 715bf2629d654ce0427a7edf564bbdd390c5bc88 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 23 Dec 2013 13:54:49 +0000
Subject: [PATCH] Fix OPENDJ-1115: Internal errors from ModifyOperation - change number was not found in pending list
---
opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java | 43 ++++++++++++++++++++++++++++---------------
1 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index b3c75db..754dcec 100644
--- a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -2129,14 +2129,8 @@
return;
}
- try
- {
- addEntryAttributesForCL(msg,op);
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
+ addEntryAttributesForCL(msg,op);
+
// If assured replication is configured, this will prepare blocking
// mechanism. If assured replication is disabled, this returns
// immediately
@@ -3783,12 +3777,17 @@
return DirectoryServer.getBackend(baseDN);
}
+
+
/**
* Process backend before import.
- * @param backend The backend.
- * @throws Exception
+ *
+ * @param backend
+ * The backend.
+ * @throws DirectoryException
+ * If the backend could not be disabled or locked exclusively.
*/
- private void preBackendImport(Backend backend) throws Exception
+ private void preBackendImport(Backend backend) throws DirectoryException
{
// Stop saving state
stateSavingDisabled = true;
@@ -4549,8 +4548,23 @@
{
LDAPUpdateMsg msg = (LDAPUpdateMsg) updateMsg;
- // put the UpdateMsg in the RemotePendingChanges list.
- remotePendingChanges.putRemoteUpdate(msg);
+ // Put the UpdateMsg in the RemotePendingChanges list.
+ if (!remotePendingChanges.putRemoteUpdate(msg))
+ {
+ /*
+ * Already received this change so ignore it. This may happen if there
+ * are uncommitted changes in the queue and session failover occurs
+ * causing a recovery of all changes since the current committed server
+ * state. See OPENDJ-1115.
+ */
+ if (debugEnabled())
+ {
+ TRACER.debugInfo(
+ "LDAPReplicationDomain.processUpdate: ignoring "
+ + "duplicate change %s", msg.getCSN());
+ }
+ return true;
+ }
// Put update message into the replay queue
// (block until some place in the queue is available)
@@ -4646,10 +4660,9 @@
* attributes to the UpdateMsg.
* @param msg an replication update message
* @param op the operation in progress
- * @throws DirectoryException
*/
private void addEntryAttributesForCL(UpdateMsg msg,
- PostOperationOperation op) throws DirectoryException
+ PostOperationOperation op)
{
if (op instanceof PostOperationDeleteOperation)
{
--
Gitblit v1.10.0