ldap/servers/plugins/replication/repl5_ruv.c | 22 +++++++++++++++++-----
ldap/servers/plugins/replication/repl5_ruv.h | 5 +++++
2 files changed, 22 insertions(+), 5 deletions(-)
New commits:
commit 01e3e3b2afc56ae051bdf74b09179efc54a39cfd
Author: Mark Reynolds <mreynolds(a)redhat.com>
Date: Thu Jan 24 14:56:51 2013 -0500
Ticket 532 - RUV is not getting updated for both Master and consumer
Bug Description: Orignal patch did not update the purl in the ruv.
Fix Description: Check if the purl has changed when adding the new
replica to the ruv. If it has, rewrite it.
https://fedorahosted.org/389/ticket/532
Reviewed by: Noriko(Thanks!!)
diff --git a/ldap/servers/plugins/replication/repl5_ruv.c
b/ldap/servers/plugins/replication/repl5_ruv.c
index 972b812..9ce9768 100644
--- a/ldap/servers/plugins/replication/repl5_ruv.c
+++ b/ldap/servers/plugins/replication/repl5_ruv.c
@@ -462,11 +462,13 @@ ruv_add_replica (RUV *ruv, ReplicaId rid, const char *replica_purl)
slapi_rwlock_wrlock (ruv->lock);
replica = ruvGetReplica (ruv, rid);
- if (replica == NULL)
- {
+ if (replica == NULL){
replica = ruvAddReplicaNoCSN (ruv, rid, replica_purl);
+ } else {
+ if(strcasecmp(replica->replica_purl, replica_purl )){ /* purls are different -
replace it */
+ ruv_replace_replica_purl_nolock(ruv, rid, replica_purl, RUV_DONT_LOCK);
+ }
}
-
slapi_rwlock_unlock (ruv->lock);
if (replica)
@@ -478,12 +480,20 @@ ruv_add_replica (RUV *ruv, ReplicaId rid, const char *replica_purl)
int
ruv_replace_replica_purl (RUV *ruv, ReplicaId rid, const char *replica_purl)
{
+ return ruv_replace_replica_purl_nolock(ruv, rid, replica_purl, RUV_LOCK);
+}
+
+int
+ruv_replace_replica_purl_nolock(RUV *ruv, ReplicaId rid, const char *replica_purl, int
lock)
+{
RUVElement* replica;
int rc = RUV_NOTFOUND;
PR_ASSERT (ruv && replica_purl);
- slapi_rwlock_wrlock (ruv->lock);
+ if(lock)
+ slapi_rwlock_wrlock (ruv->lock);
+
replica = ruvGetReplica (ruv, rid);
if (replica != NULL)
{
@@ -497,7 +507,9 @@ ruv_replace_replica_purl (RUV *ruv, ReplicaId rid, const char
*replica_purl)
rc = RUV_SUCCESS;
}
- slapi_rwlock_unlock (ruv->lock);
+ if(lock)
+ slapi_rwlock_unlock (ruv->lock);
+
return rc;
}
diff --git a/ldap/servers/plugins/replication/repl5_ruv.h
b/ldap/servers/plugins/replication/repl5_ruv.h
index 944f5ed..036951f 100644
--- a/ldap/servers/plugins/replication/repl5_ruv.h
+++ b/ldap/servers/plugins/replication/repl5_ruv.h
@@ -82,6 +82,10 @@ enum
RUV_COMP_RUV2_MISSING /* ruv1 contains replicas not in ruv2 */
};
+/* used by ruv_replace_replica_purl_nolock */
+#define RUV_LOCK 1
+#define RUV_DONT_LOCK 0
+
#define RUV_COMP_IS_FATAL(ruvcomp) (ruvcomp && (ruvcomp <
RUV_COMP_RUV1_MISSING))
typedef struct ruv_enum_data
@@ -99,6 +103,7 @@ RUV* ruv_dup (const RUV *ruv);
void ruv_destroy (RUV **ruv);
void ruv_copy_and_destroy (RUV **srcruv, RUV **destruv);
int ruv_replace_replica_purl (RUV *ruv, ReplicaId rid, const char *replica_purl);
+int ruv_replace_replica_purl_nolock(RUV *ruv, ReplicaId rid, const char *replica_purl,
int lock);
int ruv_delete_replica (RUV *ruv, ReplicaId rid);
int ruv_add_replica (RUV *ruv, ReplicaId rid, const char *replica_purl);
int ruv_add_index_replica (RUV *ruv, ReplicaId rid, const char *replica_purl, int
index);