Thursday, July 10, 2014

[389-commits] Branch '389-ds-base-1.3.2' - ldap/servers

ldap/servers/plugins/replication/urp.c | 3
ldap/servers/plugins/replication/urp.h | 2
ldap/servers/plugins/replication/urp_glue.c | 2
ldap/servers/plugins/replication/urp_tombstone.c | 59 +++++++++-----
ldap/servers/slapd/add.c | 2
ldap/servers/slapd/attrlist.c | 7 +
ldap/servers/slapd/back-ldbm/cache.c | 91 ++++++++++++++++++-----
ldap/servers/slapd/back-ldbm/ldbm_add.c | 35 +++++++-
ldap/servers/slapd/back-ldbm/ldbm_delete.c | 66 ++++++++++++++--
ldap/servers/slapd/back-ldbm/ldbm_modify.c | 2
ldap/servers/slapd/back-ldbm/ldbm_modrdn.c | 54 +++++++++++--
ldap/servers/slapd/back-ldbm/proto-back-ldbm.h | 3
ldap/servers/slapd/dn.c | 6 +
ldap/servers/slapd/rdn.c | 22 ++++-
ldap/servers/slapd/slapi-plugin.h | 4 -
15 files changed, 288 insertions(+), 70 deletions(-)

New commits:
commit 513788ce60ef4f3742bfdb5442a92887735367c9
Author: Noriko Hosoi <nhosoi@redhat.com>
Date: Tue Jun 24 16:39:24 2014 -0700

Ticket #47834 - Tombstone_to_glue: if parents are also converted to glue, the target entry's DN must be adjusted.

Bug description: tombstone_to_glue resolves parents recursively if
they are also a tombstone entry, which may change the DN of the
target entry, but the DN change was not adjusted.

Fix description: Added a new argument newparentdn to tombstone_to_
glue_resolve_parent to return the new parent DN if it has been updated.
If a new parent DN is returned, set it to the target DN.

This patch also adds a cache debugging function: check_entry_cache,
which is disabled by default (in #ifdef CACHE_DEBUG)

Note: this bug is a left over of ticket #47750.

https://fedorahosted.org/389/ticket/47834

Reviewed by rmeggins@redhat.com (Thank you, Rich!!)
(cherry picked from commit 708a56b8d524131362e2d71b7fbc2eb257075e14)

diff --git a/ldap/servers/plugins/replication/urp.c b/ldap/servers/plugins/replication/urp.c
index d867274..c7d60e2 100644
--- a/ldap/servers/plugins/replication/urp.c
+++ b/ldap/servers/plugins/replication/urp.c
@@ -966,7 +966,8 @@ urp_add_resolve_parententry (Slapi_PBlock *pb, char *sessionid, Slapi_Entry *ent
if(is_tombstone_entry(parententry)) /* The parent is a tombstone */
{
/* The parent entry must be resurected from the dead. */
- ldap_rc = tombstone_to_glue (pb, sessionid, parententry, parentdn, REASON_RESURRECT_ENTRY, opcsn);
+ /* parentdn retrieved from entry is not tombstone dn. */
+ ldap_rc = tombstone_to_glue (pb, sessionid, parententry, parentdn, REASON_RESURRECT_ENTRY, opcsn, NULL);
if ( ldap_rc != LDAP_SUCCESS )
{
ldap_rc= LDAP_OPERATIONS_ERROR;
diff --git a/ldap/servers/plugins/replication/urp.h b/ldap/servers/plugins/replication/urp.h
index 8afd7d1..678a2cc 100644
--- a/ldap/servers/plugins/replication/urp.h
+++ b/ldap/servers/plugins/replication/urp.h
@@ -79,6 +79,6 @@ PRBool get_glue_csn(const Slapi_Entry *entry, const CSN **gluecsn);
* urp_tombstone.c
*/
int is_tombstone_entry(const Slapi_Entry* entry);
-int tombstone_to_glue(Slapi_PBlock *pb, char *sessionid, Slapi_Entry *entry, const Slapi_DN *parentdn, const char *reason, CSN *opcsn);
+int tombstone_to_glue(Slapi_PBlock *pb, char *sessionid, Slapi_Entry *entry, const Slapi_DN *parentdn, const char *reason, CSN *opcsn, Slapi_DN **newparentdn);
int entry_to_tombstone ( Slapi_PBlock *pb, Slapi_Entry *entry );
PRBool get_tombstone_csn(const Slapi_Entry *entry, const CSN **delcsn);
diff --git a/ldap/servers/plugins/replication/urp_glue.c b/ldap/servers/plugins/replication/urp_glue.c
index 199d4de..a13c0be 100644
--- a/ldap/servers/plugins/replication/urp_glue.c
+++ b/ldap/servers/plugins/replication/urp_glue.c
@@ -230,7 +230,7 @@ create_glue_entry ( Slapi_PBlock *pb, char *sessionid, Slapi_DN *dn, const char

slapi_pblock_get( pb, SLAPI_BACKEND, &backend );
slapi_sdn_get_backend_parent ( dn, superiordn, backend );
- slapi_rdn_set_dn_ext(rdn, slapi_sdn_get_dn(dn), 1/* skip nsuniqeid=..., in dn */);
+ slapi_rdn_set_dn_ext(rdn, slapi_sdn_get_dn(dn), SLAPI_RDN_SET_DN_SKIP_UNIQUEID);

while(!done)
{
diff --git a/ldap/servers/plugins/replication/urp_tombstone.c b/ldap/servers/plugins/replication/urp_tombstone.c
index 5a37ca8..db7fa00 100644
--- a/ldap/servers/plugins/replication/urp_tombstone.c
+++ b/ldap/servers/plugins/replication/urp_tombstone.c
@@ -87,17 +87,18 @@ tombstone_to_glue_resolve_parent (
char *sessionid,
const Slapi_DN *parentdn,
const char *parentuniqueid,
- CSN *opcsn)
+ CSN *opcsn,
+ Slapi_DN **newparentdn)
{
/* Let's have a look at the parent of this entry... */
if(!slapi_sdn_isempty(parentdn) && parentuniqueid!=NULL)
{
int op_result;
- Slapi_PBlock *newpb= slapi_pblock_new();
- slapi_search_internal_set_pb(
- newpb,
- slapi_sdn_get_dn(parentdn), /* JCM - This DN just identifies the backend to be searched. */
- LDAP_SCOPE_BASE,
+ Slapi_PBlock *newpb= slapi_pblock_new();
+ slapi_search_internal_set_pb(
+ newpb,
+ slapi_sdn_get_dn(parentdn), /* JCM - This DN just identifies the backend to be searched. */
+ LDAP_SCOPE_BASE,
"objectclass=*",
NULL, /*attrs*/
0, /*attrsonly*/
@@ -106,7 +107,7 @@ tombstone_to_glue_resolve_parent (
repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION),
0);
slapi_search_internal_pb(newpb);
- slapi_pblock_get(newpb, SLAPI_PLUGIN_INTOP_RESULT, &op_result);
+ slapi_pblock_get(newpb, SLAPI_PLUGIN_INTOP_RESULT, &op_result);
switch(op_result)
{
case LDAP_SUCCESS:
@@ -118,7 +119,8 @@ tombstone_to_glue_resolve_parent (
{
if(is_tombstone_entry(entries[0]))
{
- tombstone_to_glue (pb, sessionid, entries[0], parentdn, REASON_RESURRECT_ENTRY, opcsn);
+ tombstone_to_glue(pb, sessionid, entries[0], parentdn,
+ REASON_RESURRECT_ENTRY, opcsn, newparentdn);
}
}
else
@@ -146,14 +148,16 @@ tombstone_to_glue (
Slapi_PBlock *pb,
char *sessionid,
Slapi_Entry *tombstoneentry,
- const Slapi_DN *tombstonedn,
+ const Slapi_DN *gluedn, /* does not start with uniqueid= */
const char *reason,
- CSN *opcsn)
+ CSN *opcsn,
+ Slapi_DN **newparentdn)
{
Slapi_DN *parentdn;
char *parentuniqueid;
const char *tombstoneuniqueid;
- Slapi_Entry *addingentry;
+ Slapi_Entry *addingentry = NULL;
+ Slapi_Entry *addingentry_bakup = NULL;
const char *addingdn;
int op_result;
int rdn_is_conflict = 0;
@@ -164,23 +168,35 @@ tombstone_to_glue (
* must attach the entry to the Operation
*/

-
/* Resurrect the parent entry first */

/* JCM - This DN calculation is odd. It could resolve to NULL
* which won't help us identify the correct backend to search.
*/
- is_suffix_dn_ext (pb, tombstonedn, &parentdn, 1 /* is_tombstone */);
- parentuniqueid= slapi_entry_attr_get_charptr (tombstoneentry, SLAPI_ATTR_VALUE_PARENT_UNIQUEID); /* Allocated */
- tombstone_to_glue_resolve_parent (pb, sessionid, parentdn, parentuniqueid, opcsn);
+ is_suffix_dn_ext (pb, gluedn, &parentdn, 1 /* is_tombstone */);
+ parentuniqueid = slapi_entry_attr_get_charptr (tombstoneentry, SLAPI_ATTR_VALUE_PARENT_UNIQUEID); /* Allocated */
+ tombstone_to_glue_resolve_parent (pb, sessionid, parentdn, parentuniqueid, opcsn, newparentdn);

/* Submit an Add operation to turn the tombstone entry into glue. */
/*
* The tombstone is stored with an invalid DN, we must fix this.
*/
addingentry = slapi_entry_dup(tombstoneentry);
- addingdn = slapi_sdn_get_dn(tombstonedn);
- slapi_entry_set_sdn(addingentry, tombstonedn);
+
+ if (newparentdn && *newparentdn && slapi_sdn_compare(parentdn, *newparentdn)) {
+ /* If the parents are resolved, the tombstone's DN is going to be different... */
+ /* Update DN in addingentry */
+ Slapi_RDN *rdn = slapi_rdn_new();
+ slapi_rdn_set_dn_ext(rdn, slapi_sdn_get_dn(gluedn), SLAPI_RDN_SET_DN_INCLUDE_UNIQUEID);
+ addingdn = slapi_moddn_get_newdn(slapi_entry_get_sdn(addingentry), slapi_rdn_get_rdn(rdn),
+ slapi_sdn_get_dn(*newparentdn));
+ slapi_rdn_free(&rdn);
+ slapi_sdn_init_normdn_passin(*newparentdn, addingdn); /* to return the new parentdn to the caller */
+ } else {
+ slapi_sdn_free(newparentdn); /* no change in parentdn; returning NULL */
+ addingdn = slapi_sdn_get_dn(gluedn);
+ }
+ slapi_sdn_set_normdn_byval(slapi_entry_get_sdn(addingentry), addingdn);
/* not just e_sdn, e_rsdn needs to be updated. */
slapi_rdn_set_all_dn(slapi_entry_get_srdn(addingentry), slapi_entry_get_dn_const(addingentry));
rdn_is_conflict = slapi_rdn_is_conflict(slapi_entry_get_srdn(addingentry));
@@ -198,6 +214,7 @@ tombstone_to_glue (
* tombstoneentry from DB/entry cache is duplicated and turned to be a glue.
* This addingentry is freed in op_shared_add.
*/
+ addingentry_bakup = slapi_entry_dup(addingentry);
op_result = urp_fixup_add_entry (addingentry, tombstoneuniqueid, slapi_ch_strdup(parentuniqueid), opcsn, OP_FLAG_RESURECT_ENTRY);
if ((LDAP_ALREADY_EXISTS == op_result) && !rdn_is_conflict) {
/* conflict -- there's already the same named entry added.
@@ -207,7 +224,8 @@ tombstone_to_glue (
* */
char *conflictrdn = get_rdn_plus_uniqueid(sessionid, addingdn, tombstoneuniqueid);
if (conflictrdn) {
- addingentry = slapi_entry_dup(tombstoneentry);
+ addingentry = addingentry_bakup;
+ addingentry_bakup = NULL;
if (!slapi_entry_attr_hasvalue(addingentry, ATTR_NSDS5_REPLCONFLICT, reason)) {
/* Add the reason of turning it to glue - The backend code will use it*/
slapi_entry_add_string(addingentry, ATTR_NSDS5_REPLCONFLICT, reason);
@@ -223,15 +241,16 @@ tombstone_to_glue (
addingentry = NULL;
}
}
+ slapi_entry_free(addingentry_bakup);
slapi_ch_free_string(&parentuniqueid);
if (op_result == LDAP_SUCCESS)
{
- slapi_log_error (slapi_log_urp, repl_plugin_name,
+ slapi_log_error (/*slapi_log_urp*/SLAPI_LOG_FATAL, repl_plugin_name,
"%s: Resurrected tombstone %s to glue reason '%s'\n", sessionid, addingdn, reason);
}
else if (LDAP_ALREADY_EXISTS == op_result)
{
- slapi_log_error(slapi_log_urp, repl_plugin_name,
+ slapi_log_error(/*slapi_log_urp*/SLAPI_LOG_FATAL, repl_plugin_name,
"%s: No need to turn tombstone %s to glue; it was already resurrected.\n",
sessionid, addingdn);
op_result = LDAP_SUCCESS;
diff --git a/ldap/servers/slapd/add.c b/ldap/servers/slapd/add.c
index 875ad22..170e28b 100644
--- a/ldap/servers/slapd/add.c
+++ b/ldap/servers/slapd/add.c
@@ -732,9 +732,9 @@ static void op_shared_add (Slapi_PBlock *pb)

if (be->be_add != NULL)
{
- rc = (*be->be_add)(pb);
/* backend may change this if errors and not consumed */
slapi_pblock_get(pb, SLAPI_ADD_ENTRY, &save_e);
+ rc = (*be->be_add)(pb);
slapi_pblock_set(pb, SLAPI_ADD_ENTRY, ec);
if (rc == 0)
{
diff --git a/ldap/servers/slapd/attrlist.c b/ldap/servers/slapd/attrlist.c
index 8825e2b..6743bde 100644
--- a/ldap/servers/slapd/attrlist.c
+++ b/ldap/servers/slapd/attrlist.c
@@ -312,6 +312,13 @@ int attrlist_replace(Slapi_Attr **alist, const char *type, struct berval **vals)
(*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
}
rc = attr_replace(*a, values);
+ if (rc) {
+ slapi_log_error(SLAPI_LOG_FATAL, "attrlist_replace",
+ "attr_replace (%s, %s) failed.\n",
+ type, vals[0]->bv_val);
+ valuearray_free(&values);
+ slapi_attr_free(a);
+ }
}
return rc;
}
diff --git a/ldap/servers/slapd/back-ldbm/cache.c b/ldap/servers/slapd/back-ldbm/cache.c
index 0309fcf..0732415 100644
--- a/ldap/servers/slapd/back-ldbm/cache.c
+++ b/ldap/servers/slapd/back-ldbm/cache.c
@@ -47,6 +47,7 @@
#ifdef DEBUG
#define LDAP_CACHE_DEBUG
/* #define LDAP_CACHE_DEBUG_LRU * causes slowdown */
+/* #define CACHE_DEBUG * causes slowdown */

No comments:

Post a Comment