From dd86a3562e94103f533865cde2c8c0b70dc5ae33 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount <quanah@openldap.org> Date: Fri, 6 Feb 2009 02:03:11 +0000 Subject: [PATCH] ITS#5925 --- CHANGES | 1 + servers/slapd/backglue.c | 39 +++++++++++++++++++++++++++++--------- servers/slapd/main.c | 2 +- servers/slapd/proto-slap.h | 2 +- servers/slapd/slapcommon.c | 2 +- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 1dc626fca5..7d4c70c7c5 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ OpenLDAP 2.4.14 Engineering Fixed slapd connection assert (ITS#5835) Fixed slapd epoll handling (ITS#5886) Fixed slapd frontend/backend options handling (ITS#5857) + Fixed slapd glue with MMR (ITS#5925) Fixed slapd manageDSAit with glue entries (ITS#5921) Fixed slapd syncrepl rename handling (ITS#5809) Fixed slapd syncrepl MMR when adding new server (ITS#5850) diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index 8c98a59300..f8df9b2006 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -942,6 +942,15 @@ glue_tool_sync ( return 0; } +typedef struct glue_Addrec { + struct glue_Addrec *ga_next; + BackendDB *ga_be; +} glue_Addrec; + +/* List of added subordinates */ +static glue_Addrec *ga_list; +static int ga_adding; + static int glue_db_init( BackendDB *be, @@ -994,6 +1003,9 @@ glue_db_init( SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_GLUE_INSTANCE; + if ( ga_list ) + glue_sub_attach( 1 ); + return 0; } @@ -1068,21 +1080,19 @@ glue_sub_del( BackendDB *b0 ) return rc; } -typedef struct glue_Addrec { - struct glue_Addrec *ga_next; - BackendDB *ga_be; -} glue_Addrec; - -/* List of added subordinates */ -static glue_Addrec *ga_list; /* Attach all the subordinate backends to their superior */ int -glue_sub_attach() +glue_sub_attach( int online ) { glue_Addrec *ga, *gnext = NULL; int rc = 0; + if ( ga_adding ) + return 0; + + ga_adding = 1; + /* For all the subordinate backends */ for ( ga=ga_list; ga != NULL; ga = gnext ) { BackendDB *be; @@ -1122,11 +1132,20 @@ glue_sub_attach() &gi->gi_n[gi->gi_nodes].gn_pdn ); gi->gi_nodes++; on->on_bi.bi_private = gi; + ga->ga_be->be_flags |= SLAP_DBFLAG_GLUE_LINKED; break; } if ( !be ) { Debug( LDAP_DEBUG_ANY, "glue: no superior found for sub %s!\n", ga->ga_be->be_suffix[0].bv_val, 0, 0 ); + /* allow this for now, assume a superior will + * be added later + */ + if ( online ) { + rc = 0; + gnext = ga_list; + break; + } rc = LDAP_NO_SUCH_OBJECT; } ch_free( ga ); @@ -1135,6 +1154,8 @@ glue_sub_attach() ga_list = gnext; + ga_adding = 0; + return rc; } @@ -1160,7 +1181,7 @@ glue_sub_add( BackendDB *be, int advert, int online ) ga_list = ga; if ( online ) - rc = glue_sub_attach(); + rc = glue_sub_attach( online ); return rc; } diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 160b8200fb..fa008ee2cf 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -792,7 +792,7 @@ unhandled_option:; } } - if ( glue_sub_attach( ) != 0 ) { + if ( glue_sub_attach( 0 ) != 0 ) { Debug( LDAP_DEBUG_ANY, "subordinate config error\n", 0, 0, 0 ); diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 6e8c0fe47c..f6a3478c7c 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -426,7 +426,7 @@ LDAP_SLAPD_V(BackendInfo) slap_binfo[]; */ LDAP_SLAPD_F (int) glue_sub_init( void ); -LDAP_SLAPD_F (int) glue_sub_attach( void ); +LDAP_SLAPD_F (int) glue_sub_attach( int online ); LDAP_SLAPD_F (int) glue_sub_add( BackendDB *be, int advert, int online ); LDAP_SLAPD_F (int) glue_sub_del( BackendDB *be ); diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index c29b121144..12856633cd 100644 --- a/servers/slapd/slapcommon.c +++ b/servers/slapd/slapcommon.c @@ -564,7 +564,7 @@ slap_tool_init( } if ( use_glue ) { - rc = glue_sub_attach(); + rc = glue_sub_attach( 0 ); if ( rc != 0 ) { fprintf( stderr, -- GitLab