From: Nadezhda Ivanova Date: Tue, 22 Jun 2021 14:03:44 +0000 (+0300) Subject: ITS#9628 Fix incorrect c_n_ops_executing counter when backend is asynchronous X-Git-Tag: OPENLDAP_REL_ENG_2_6_0~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=81ed9e0d0e84f0c3ea8a08f2b388f462b1b9598f;p=thirdparty%2Fopenldap.git ITS#9628 Fix incorrect c_n_ops_executing counter when backend is asynchronous --- diff --git a/servers/slapd/back-monitor/back-monitor.h b/servers/slapd/back-monitor/back-monitor.h index 3f3d81bd99..b7126d025b 100644 --- a/servers/slapd/back-monitor/back-monitor.h +++ b/servers/slapd/back-monitor/back-monitor.h @@ -132,6 +132,7 @@ typedef struct monitor_info_t { AttributeDescription *mi_ad_monitorUpdateRef; AttributeDescription *mi_ad_monitorRuntimeConfig; AttributeDescription *mi_ad_monitorSuperiorDN; + AttributeDescription *mi_ad_monitorConnectionOpsAsync; /* * Generic description attribute diff --git a/servers/slapd/back-monitor/conn.c b/servers/slapd/back-monitor/conn.c index 4d327f2430..f586e94deb 100644 --- a/servers/slapd/back-monitor/conn.c +++ b/servers/slapd/back-monitor/conn.c @@ -369,6 +369,9 @@ conn_create( bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_completed ); attr_merge_one( e, mi->mi_ad_monitorConnectionOpsCompleted, &bv, NULL ); + bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_async ); + attr_merge_one( e, mi->mi_ad_monitorConnectionOpsAsync, &bv, NULL ); + bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_get ); attr_merge_one( e, mi->mi_ad_monitorConnectionGet, &bv, NULL ); diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index b779619893..52ec170238 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -1951,6 +1951,13 @@ monitor_back_initialize( "NO-USER-MODIFICATION " "USAGE dSAOperation )", SLAP_AT_FINAL|SLAP_AT_HIDE, offsetof(monitor_info_t, mi_ad_monitorSuperiorDN) }, + { "( 1.3.6.1.4.1.4203.666.1.55.31 " + "NAME 'monitorConnectionOpsAsync' " + "DESC 'monitor number of asynchronous operations in execution within the connection' " + "SUP monitorCounter " + "NO-USER-MODIFICATION " + "USAGE dSAOperation )", SLAP_AT_FINAL|SLAP_AT_HIDE, + offsetof(monitor_info_t, mi_ad_monitorConnectionOpsAsync) }, { NULL, 0, -1 } }; diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 02b2861ae0..785076da2d 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -212,7 +212,7 @@ int connections_timeout_idle(time_t now) /* Don't timeout a slow-running request or a persistent * outbound connection. */ - if(( c->c_n_ops_executing && !c->c_writewaiter) + if((( c->c_n_ops_executing || c->c_n_ops_async ) && !c->c_writewaiter) || c->c_conn_state == SLAP_C_CLIENT ) { continue; } @@ -244,7 +244,7 @@ void connections_drop() /* Don't close a slow-running request or a persistent * outbound connection. */ - if(( c->c_n_ops_executing && !c->c_writewaiter) + if((( c->c_n_ops_executing || c->c_n_ops_async ) && !c->c_writewaiter) || c->c_conn_state == SLAP_C_CLIENT ) { continue; } @@ -428,6 +428,7 @@ Connection * connection_init( c->c_n_ops_executing = 0; c->c_n_ops_pending = 0; c->c_n_ops_completed = 0; + c->c_n_ops_async = 0; c->c_n_get = 0; c->c_n_read = 0; @@ -1004,7 +1005,7 @@ connection_op_finish( Operation *op, int lock ) LDAP_STAILQ_REMOVE( &conn->c_ops, op, Operation, o_next); LDAP_STAILQ_NEXT(op, o_next) = NULL; - conn->c_n_ops_executing--; + conn->c_n_ops_async--; conn->c_n_ops_completed++; connection_resched( conn ); if ( lock ) @@ -1122,6 +1123,8 @@ operations_error: */ slap_sl_mem_setctx( ctx, NULL ); ldap_pvt_thread_mutex_lock( &conn->c_mutex ); + conn->c_n_ops_executing--; + conn->c_n_ops_async++; connection_resched( conn ); ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); return NULL; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 769da46c9d..89d3aa4ae4 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2975,6 +2975,7 @@ struct Connection { long c_n_ops_executing; /* num of ops currently executing */ long c_n_ops_pending; /* num of ops pending execution */ long c_n_ops_completed; /* num of ops completed */ + long c_n_ops_async; /* mum of ops currently executing asynchronously */ long c_n_get; /* num of get calls */ long c_n_read; /* num of read calls */ diff --git a/servers/slapd/slapi/slapi_ops.c b/servers/slapd/slapi/slapi_ops.c index c58d9b3c8d..088a71a693 100644 --- a/servers/slapd/slapi/slapi_ops.c +++ b/servers/slapd/slapi/slapi_ops.c @@ -233,6 +233,7 @@ slapi_int_connection_init_pb( Slapi_PBlock *pb, ber_tag_t tag ) conn->c_n_ops_executing = 0; conn->c_n_ops_pending = 0; conn->c_n_ops_completed = 0; + conn->c_n_ops_async = 0; conn->c_n_get = 0; conn->c_n_read = 0;