diff options
author | Amar Tumballi <amarts@redhat.com> | 2019-03-29 08:30:49 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2019-04-10 04:42:00 +0000 |
commit | 22e848f88e2cb9510e82fb4875c182240fff3303 (patch) | |
tree | 942279eb91eb3ba29727b0637b0878e6d197e89b | |
parent | 398b53adb281e459281f74a9f96a12ee48da7daa (diff) |
protocol: add an option to force using old-protocol
As protocol implements every fop, and in general a large part of
the codebase. Considering our regression is run mostly in 1 machine,
there was no way of forcing the client to use old protocol (while new
one is available). With this patch, a new 'testing' option is provided
which forces client to use old protocol if found.
This should help increase the code coverage by at least 10k lines overall.
updates: bz#1693692
Change-Id: Ie45256f7dea250671b689c72b4b6f25037cef948
Signed-off-by: Amar Tumballi <amarts@redhat.com>
-rwxr-xr-x | tests/basic/old-protocol.t | 31 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 13 | ||||
-rw-r--r-- | xlators/protocol/client/src/client.c | 12 | ||||
-rw-r--r-- | xlators/protocol/client/src/client.h | 2 |
4 files changed, 55 insertions, 3 deletions
diff --git a/tests/basic/old-protocol.t b/tests/basic/old-protocol.t new file mode 100755 index 00000000000..27a688d3538 --- /dev/null +++ b/tests/basic/old-protocol.t @@ -0,0 +1,31 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6}; + +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +EXPECT '6' brick_count $V0 + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +file="/var/lib/glusterd/vols/$V0/trusted-$V0.tcp-fuse.vol" +sed -i -e 's$send-gids true$send-gids true\n option testing.old-protocol true$g' $file + +## Mount FUSE +TEST $GFS -s $H0 --volfile-id $V0 $M1; + +## TODO: best way to increase coverage is to have a gfapi program +## which covers maximum fops +TEST $(dirname $0)/rpc-coverage.sh $M1 + +cleanup; diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index c43756a3fec..01505587243 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -1338,11 +1338,15 @@ select_server_supported_programs(xlator_t *this, gf_prog_detail *prog) while (trav) { /* Select 'programs' */ if ((clnt3_3_fop_prog.prognum == trav->prognum) && - (clnt3_3_fop_prog.progver == trav->progver) && !conf->fops) { + (clnt3_3_fop_prog.progver == trav->progver)) { conf->fops = &clnt3_3_fop_prog; if (conf->rpc) conf->rpc->auth_value = AUTH_GLUSTERFS_v2; ret = 0; + /* In normal flow, we don't want to use old protocol type. + but if it is for testing, lets use it */ + if (conf->old_protocol) + goto done; } if ((clnt4_0_fop_prog.prognum == trav->prognum) && @@ -1351,8 +1355,10 @@ select_server_supported_programs(xlator_t *this, gf_prog_detail *prog) if (conf->rpc) conf->rpc->auth_value = AUTH_GLUSTERFS_v3; ret = 0; - /* this is latest program, lets use it */ - goto out; + /* this is latest program, lets use this program only */ + /* if we are testing for old-protocol, lets not break this */ + if (!conf->old_protocol) + goto done; } if (ret) { @@ -1362,6 +1368,7 @@ select_server_supported_programs(xlator_t *this, gf_prog_detail *prog) trav = trav->next; } +done: if (!ret) gf_msg(this->name, GF_LOG_INFO, 0, PC_MSG_VERSION_INFO, "Using Program %s," diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 1e9f47297ee..fffe22380b1 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -2508,6 +2508,8 @@ build_client_config(xlator_t *this, clnt_conf_t *conf) GF_OPTION_INIT("send-gids", conf->send_gids, bool, out); + GF_OPTION_INIT("testing.old-protocol", conf->old_protocol, bool, out); + conf->client_id = glusterfs_leaf_position(this); ret = client_check_remote_host(this, this->options); @@ -3048,6 +3050,16 @@ struct volume_options options[] = { " power. Range 1-32 threads.", .op_version = {GD_OP_VERSION_3_7_0}, .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC}, + + /* This option is required for running code-coverage tests with + old protocol */ + { + .key = {"testing.old-protocol"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .op_version = {GD_OP_VERSION_7_0}, + .flags = OPT_FLAG_SETTABLE, + }, {.key = {NULL}}, }; diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h index f12fa61bb93..60efa9c264a 100644 --- a/xlators/protocol/client/src/client.h +++ b/xlators/protocol/client/src/client.h @@ -235,6 +235,8 @@ typedef struct clnt_conf { * up, disconnects can be * logged */ + + gf_boolean_t old_protocol; /* used only for old-protocol testing */ } clnt_conf_t; typedef struct _client_fd_ctx { |