From: Howard Chu Date: Fri, 18 Feb 2005 04:21:59 +0000 (+0000) Subject: ITS#3549 allow one op to progress when a socket with writewaiters X-Git-Tag: OPENLDAP_REL_ENG_2_3_BP~163 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6cbe778c81ec66d5058d1ae7ea391a8c0769d142;p=openldap ITS#3549 allow one op to progress when a socket with writewaiters becomes ready to write. --- diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index d56b666d75..4e7fb9bc55 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1635,6 +1635,7 @@ static int connection_op_activate( Operation *op ) int connection_write(ber_socket_t s) { Connection *c; + Operation *op; assert( connections != NULL ); @@ -1666,6 +1667,26 @@ int connection_write(ber_socket_t s) if ( ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_NEEDS_WRITE, NULL ) ) { slapd_set_write( s, 1 ); } + /* If there are ops pending because of a writewaiter, start + * one up. + */ + while ((op = LDAP_STAILQ_FIRST( &c->c_pending_ops )) != NULL) { + if ( !c->c_writewaiter ) break; + if ( c->c_n_ops_executing > connection_pool_max/2 ) { + break; + } + LDAP_STAILQ_REMOVE_HEAD( &c->c_pending_ops, o_next ); + LDAP_STAILQ_NEXT(op, o_next) = NULL; + /* pending operations should not be marked for abandonment */ + assert(!op->o_abandon); + + c->c_n_ops_pending--; + c->c_n_ops_executing++; + + connection_op_activate( op ); + + break; + } connection_return( c ); ldap_pvt_thread_mutex_unlock( &connections_mutex ); return 0;