From 513ebdd59d01800ac6567c240b8cb27959b93174 Mon Sep 17 00:00:00 2001 From: Ludwig Krispenz Date: Wed, 14 Feb 2018 11:44:39 +0100 Subject: [PATCH] Additional fix for ticket 49551 - correctly handle subordinates and tombstone numsubordinates for direct add or resurrect of tombstones --- ldap/servers/slapd/back-ldbm/ldbm_add.c | 7 ++++++- ldap/servers/slapd/back-ldbm/parents.c | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ldap/servers/slapd/back-ldbm/ldbm_add.c b/ldap/servers/slapd/back-ldbm/ldbm_add.c index b487181..753e018 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_add.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_add.c @@ -849,7 +849,12 @@ ldbm_back_add(Slapi_PBlock *pb) subordinate count specifically */ if (parententry) { int op = is_resurect_operation ? PARENTUPDATE_RESURECT : PARENTUPDATE_ADD; - if (is_cenotaph_operation ) op |= PARENTUPDATE_CREATE_TOMBSTONE; + if (is_cenotaph_operation || (is_tombstone_operation && !is_ruv)) { + /* if we directly add a tombstone the tombstone numsubordinates have to be increased + * (does not apply to adding the RUV) + */ + op |= PARENTUPDATE_CREATE_TOMBSTONE; + } retval = parent_update_on_childchange(&parent_modify_c, op, NULL); slapi_log_err(SLAPI_LOG_ERR, "ldbm_back_add", "conn=%lu op=%d parent_update_on_childchange: old_entry=0x%p, new_entry=0x%p, rc=%d\n", diff --git a/ldap/servers/slapd/back-ldbm/parents.c b/ldap/servers/slapd/back-ldbm/parents.c index d2d3d9c..8923bba 100644 --- a/ldap/servers/slapd/back-ldbm/parents.c +++ b/ldap/servers/slapd/back-ldbm/parents.c @@ -147,9 +147,11 @@ parent_update_on_childchange(modify_context *mc, int op, size_t *new_sub_count) } /* tombstoneNumSubordinates has to be updated if a tombstone child has been - * deleted or a tombstone has been directly added (cenotaph) */ + * deleted or a tombstone has been directly added (cenotaph) + * or a tombstone is resurrected + */ current_sub_count = LDAP_MAXINT; - if (repl_op) { + if (repl_op || (PARENTUPDATE_RESURECT == op)) { ret = slapi_entry_attr_find(mc->old_entry->ep_entry, tombstone_numsubordinates, &read_attr); if (0 == ret) { -- 2.9.5