浏览代码

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!!)
Mark Reynolds 13 年之前
父节点
当前提交
01e3e3b2af
共有 2 个文件被更改,包括 22 次插入5 次删除
  1. 17 5
      ldap/servers/plugins/replication/repl5_ruv.c
  2. 5 0
      ldap/servers/plugins/replication/repl5_ruv.h

+ 17 - 5
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);
     slapi_rwlock_wrlock (ruv->lock);
     replica = ruvGetReplica (ruv, rid);
     replica = ruvGetReplica (ruv, rid);
-    if (replica == NULL)
-    {
+    if (replica == NULL){
         replica = ruvAddReplicaNoCSN (ruv, rid, replica_purl);
         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);
     slapi_rwlock_unlock (ruv->lock);
 
 
     if (replica)
     if (replica)
@@ -477,13 +479,21 @@ ruv_add_replica (RUV *ruv, ReplicaId rid, const char *replica_purl)
 
 
 int 
 int 
 ruv_replace_replica_purl (RUV *ruv, ReplicaId rid, const char *replica_purl)
 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;
     RUVElement* replica;
     int rc = RUV_NOTFOUND;
     int rc = RUV_NOTFOUND;
 
 
     PR_ASSERT (ruv && replica_purl);
     PR_ASSERT (ruv && replica_purl);
 
 
-    slapi_rwlock_wrlock (ruv->lock);
+    if(lock)
+        slapi_rwlock_wrlock (ruv->lock);
+
     replica = ruvGetReplica (ruv, rid);
     replica = ruvGetReplica (ruv, rid);
     if (replica != NULL)
     if (replica != NULL)
     {
     {
@@ -497,7 +507,9 @@ ruv_replace_replica_purl (RUV *ruv, ReplicaId rid, const char *replica_purl)
         rc = RUV_SUCCESS;
         rc = RUV_SUCCESS;
     }
     }
 
 
-    slapi_rwlock_unlock (ruv->lock);
+    if(lock)
+        slapi_rwlock_unlock (ruv->lock);
+
     return rc;
     return rc;
 }
 }
 
 

+ 5 - 0
ldap/servers/plugins/replication/repl5_ruv.h

@@ -82,6 +82,10 @@ enum
 	RUV_COMP_RUV2_MISSING /* ruv1 contains replicas not in ruv2 */
 	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))
 #define RUV_COMP_IS_FATAL(ruvcomp) (ruvcomp && (ruvcomp < RUV_COMP_RUV1_MISSING))
 
 
 typedef struct ruv_enum_data
 typedef struct ruv_enum_data
@@ -99,6 +103,7 @@ RUV* ruv_dup (const RUV *ruv);
 void ruv_destroy (RUV **ruv);
 void ruv_destroy (RUV **ruv);
 void ruv_copy_and_destroy (RUV **srcruv, RUV **destruv);
 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 (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_delete_replica (RUV *ruv, ReplicaId rid); 
 int ruv_add_replica (RUV *ruv, ReplicaId rid, const char *replica_purl);
 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);
 int ruv_add_index_replica (RUV *ruv, ReplicaId rid, const char *replica_purl, int index);