From: Howard Chu Date: Tue, 23 Dec 2003 18:51:52 +0000 (+0000) Subject: Don't assume the replog is sorted, sort the queue before processing. X-Git-Tag: OPENLDAP_REL_ENG_2_1_MP~110 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=45d24d16ebe02c904c7c3cbcf3291b79c9d94ace;p=openldap Don't assume the replog is sorted, sort the queue before processing. --- diff --git a/servers/slurpd/fm.c b/servers/slurpd/fm.c index 35352e7d1f..cd8a5d7188 100644 --- a/servers/slurpd/fm.c +++ b/servers/slurpd/fm.c @@ -217,6 +217,7 @@ populate_queue( { FILE *fp, *lfp; char *p; + int wake = 0; if ( acquire_lock( f, &fp, &lfp ) < 0 ) { #ifdef NEW_LOGGING @@ -262,10 +263,16 @@ populate_queue( "error: malformed replog entry (begins with \"%s\")\n", p, 0, 0 ); #endif + } else { + wake = 1; } free( p ); ldap_pvt_thread_yield(); } + /* wake up any threads waiting for more work */ + if ( wake ) { + ldap_pvt_thread_cond_broadcast( &sglob->rq->rq_more ); + } sglob->srpos = ftell( fp ); } (void) relinquish_lock( f, fp, lfp ); diff --git a/servers/slurpd/rq.c b/servers/slurpd/rq.c index 9a84bfce2f..dad5e6c617 100644 --- a/servers/slurpd/rq.c +++ b/servers/slurpd/rq.c @@ -197,10 +197,27 @@ Rq_add( rq->rq_head = re; rq->rq_tail = re; wasempty = 1; - } else { + } else if ( re->re_timestamp > rq->rq_tail->re_timestamp || + ( re->re_timestamp == rq->rq_tail->re_timestamp && + re->re_seq > rq->rq_tail->re_seq )) { rq->rq_tail->re_next = re; + rq->rq_tail = re; + } else { + Re *p, *r; + + for (r = rq->rq_head, p = NULL; r->re_timestamp < re->re_timestamp || + (r->re_timestamp == re->re_timestamp && r->re_seq < re->re_seq); + p = r, r = r->re_next ); + if ( !p ) { + re->re_next = rq->rq_head; + rq->rq_head = re; + } else { + re->re_next = p->re_next; + p->re_next = re; + } } +#if 0 /* set the sequence number */ re->re_seq = 0; if ( !wasempty && ( rq->rq_tail->re_timestamp == re->re_timestamp )) { @@ -211,11 +228,14 @@ Rq_add( re->re_seq = rq->rq_tail->re_seq + 1; } rq->rq_tail = re; +#endif /* Increment count of items in queue */ rq->rq_nre++; +#if 0 /* wake up any threads waiting for more work */ ldap_pvt_thread_cond_broadcast( &rq->rq_more ); +#endif /* ... and unlock the queue */ rq->rq_unlock( rq );