diff --git a/debian/changelog b/debian/changelog index 691669f..cc9148a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,6 +21,8 @@ flexnbd (0.2.0) UNRELEASED; urgency=medium calculating if a request exceeds the max block size (!45) * Added tests for setting TCP_NODELAY on upstream-reconnections in the proxy, and refactored the other LD_PRELOAD tests (!43) + * Clean up dead threads before calculating the number of connected clients + on the status command (!46) -- James Carter Thu, 11 Jan 2018 10:05:35 +0000 diff --git a/src/server/serve.c b/src/server/serve.c index 3a86c3a..b7b8e44 100644 --- a/src/server/serve.c +++ b/src/server/serve.c @@ -332,6 +332,8 @@ int server_count_clients( struct server *params ) { NULLCHECK( params ); int i, count = 0; + + cleanup_client_threads( params->nbd_client, params->max_nbd_clients ); for ( i = 0 ; i < params->max_nbd_clients ; i++ ) { if ( params->nbd_client[i].thread != 0 ) { diff --git a/tests/acceptance/test_serve_mode.rb b/tests/acceptance/test_serve_mode.rb index 6c3e3f6..ddeb836 100644 --- a/tests/acceptance/test_serve_mode.rb +++ b/tests/acceptance/test_serve_mode.rb @@ -207,4 +207,17 @@ class TestServeMode < Test::Unit::TestCase 'TCP keepalive count not set to 3') end end + + def test_status_returns_correct_client_count + @env.writefile1('0') + @env.serve1 + assert_equal('0', @env.status1['num_clients']) + client = FlexNBD::FakeSource.new(@env.ip, @env.port1, 'Connecting to server failed') + assert_equal('1', @env.status1['num_clients']) + client2 = FlexNBD::FakeSource.new(@env.ip, @env.port1, 'Connecting to server failed') + assert_equal('2', @env.status1['num_clients']) + client2.close + client.close + assert_equal('0', @env.status1['num_clients']) + end end diff --git a/tests/unit/check_status.c b/tests/unit/check_status.c index 1daf556..ea89d3b 100644 --- a/tests/unit/check_status.c +++ b/tests/unit/check_status.c @@ -105,25 +105,6 @@ START_TEST( test_gets_clients_allowed ) } END_TEST -START_TEST( test_gets_num_clients ) -{ - struct server * server = mock_server(); - struct status * status = status_create( server ); - - fail_if( status->num_clients != 0, "num_clients was wrong" ); - status_destroy( status ); - - server->nbd_client[0].thread = 1; - server->nbd_client[1].thread = 1; - status = status_create( server ); - - fail_unless( status->num_clients == 2, "num_clients was wrong" ); - status_destroy( status ); - destroy_mock_server( server ); - -} -END_TEST - START_TEST( test_gets_pid ) { struct server * server = mock_server(); @@ -357,7 +338,6 @@ Suite *status_suite(void) tcase_add_test(tc_create, test_gets_has_control); tcase_add_test(tc_create, test_gets_is_mirroring); tcase_add_test(tc_create, test_gets_clients_allowed); - tcase_add_test(tc_create, test_gets_num_clients); tcase_add_test(tc_create, test_gets_pid); tcase_add_test(tc_create, test_gets_size); tcase_add_test(tc_create, test_gets_migration_statistics);