protocol/client: Don't send fops till SETVOLUME is complete
An earlier commit set conf->connected just after rpc layer sends RPC_CLNT_CONNECT event. However, success of socket level connection connection doesn't indicate brick stack is ready to receive fops, as an handshake has to be done b/w client and server after RPC_CLNT_CONNECT event. Any fop sent to brick in the window between, * protocol/client receiving RPC_CLNT_CONNECT event * protocol/client receiving a successful setvolume response can end up accessing an uninitialized brick stack. So, set conf->connected only after a successful SETVOLUME. Change-Id: I139a03d2da6b0d95a0d68391fcf54b00e749decf fixes: bz#1583937 Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
This commit is contained in:
parent
6d569e27c2
commit
430e4872db
@ -2225,7 +2225,7 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
|
||||
}
|
||||
case RPC_CLNT_CONNECT:
|
||||
{
|
||||
conf->connected = 1;
|
||||
conf->can_log_disconnect = 1;
|
||||
// connect happened, send 'get_supported_versions' mop
|
||||
|
||||
gf_msg_debug (this->name, 0, "got RPC_CLNT_CONNECT");
|
||||
@ -2243,7 +2243,7 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
|
||||
client_mark_fd_bad (this);
|
||||
|
||||
if (!conf->skip_notify) {
|
||||
if (conf->connected) {
|
||||
if (conf->can_log_disconnect) {
|
||||
if (!conf->disconnect_err_logged) {
|
||||
gf_msg (this->name, GF_LOG_INFO, 0,
|
||||
PC_MSG_CLIENT_DISCONNECTED,
|
||||
@ -2278,12 +2278,13 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
|
||||
"CHILD_DOWN notify failed");
|
||||
|
||||
} else {
|
||||
if (conf->connected)
|
||||
if (conf->can_log_disconnect)
|
||||
gf_msg_debug (this->name, 0,
|
||||
"disconnected (skipped notify)");
|
||||
}
|
||||
|
||||
conf->connected = 0;
|
||||
conf->can_log_disconnect = 0;
|
||||
conf->skip_notify = 0;
|
||||
|
||||
if (conf->quick_reconnect) {
|
||||
|
@ -235,6 +235,11 @@ typedef struct clnt_conf {
|
||||
|
||||
gf_boolean_t child_up; /* Set to true, when child is up, and
|
||||
* false, when child is down */
|
||||
|
||||
gf_boolean_t can_log_disconnect; /* socket level connection is
|
||||
* up, disconnects can be
|
||||
* logged
|
||||
*/
|
||||
} clnt_conf_t;
|
||||
|
||||
typedef struct _client_fd_ctx {
|
||||
|
Loading…
x
Reference in New Issue
Block a user