]> git.sur5r.net Git - openldap/commitdiff
ITS#3549 allow one op to progress when a socket with writewaiters
authorHoward Chu <hyc@openldap.org>
Fri, 18 Feb 2005 04:21:59 +0000 (04:21 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 18 Feb 2005 04:21:59 +0000 (04:21 +0000)
becomes ready to write.

servers/slapd/connection.c

index d56b666d7576c52a6d55cfa9699dbe2a1d609c7a..4e7fb9bc5587d60226e852009bf46c5ca65e04ef 100644 (file)
@@ -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;