[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: 2.4.29 memberof: entry_encode: Assertion `i == a->a_numvals' failed.
On 02/22/2012 10:23 AM, Colin Hudler wrote:
Greetings,
Haven't used OpenLDAP since 2.1; I see it has come a long way. I have
a few hundred static groups and am using the memberOf overlay. There's
a hundred thousand or so people entries and thousands of memberships.
The overlay is configured thusly:
<snip>
4f450e2d syncrepl_entry: rid=004
cn=uc:org:nsit:integration:techag,ou=groups,dc=uchicago,dc=edu
4f450e2d conn=-1 op=0:
memberof_op_add("cn=uc:org:nsit:integration:techag,ou=groups,dc=uchicago,dc=edu"):
member="uid=chudler,ou=people,dc=uchicago,dc=edu" does not exist
(stripping...)
slapd: entry.c:773: entry_encode: Assertion `i == a->a_numvals' failed.
The member ("uid=chudler") does exist in the master, I can find it
with ldapsearch. I believe it does not yet exist in the replica. I'd
like for total replication to succeed without doing an initial
slapcat. Has anyone encountered this before? I am happy to debug if
you need more information.
Version 2.4.29, also using the refint overlay if that matters.
Attached is a one line patch. I figured this is related to bug #6508
<http://www.openldap.org/its/index.cgi/Software%20Bugs?id=6508>. The fix
there still does not decrement a->a_numvals when the loop terminate
early. So this patch addresses that. I haven't done testing except "make
test".
There's something higher wrong with what I'm doing, however. As
configured, memberOf will drop the member from the group because it does
not yet exist. What would be better is a sort of two-pass replication so
the contents are stable before it starts dropping members. I'm trying to
decide the cleanest way for me to do that, given that these are
mirrormode masters with replicated configs. Perhaps someone has
encountered this problem before..
I know that the overlay is unaware that the directory contents are still
stabilizing. Perhaps I should alter the memberOf overlay
(memberof-dangling=ignore) until replication has completely refreshed,
then manually do a second pass to find dangling values? The goal is a
simple and repeatable process to completely refresh a server, ideally
allowing replication to do the work. Better for us might be to hold down
synchronization of group containers until members has been fully
refreshed (how?).
diff --git servers/slapd/overlays/memberof.c servers/slapd/overlays/memberof.c
index 502cb46..721193e 100644
--- servers/slapd/overlays/memberof.c
+++ servers/slapd/overlays/memberof.c
@@ -597,6 +597,7 @@ memberof_op_add( Operation *op, SlapReply *rs )
BER_BVZERO( &a->a_nvals[ i ] );
}
if ( j - i == 1 ) {
+ a->a_numvals--;
break;
}