Re: [PATCH 08/13] libceph: start separating connection flags from state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 30 May 2012, Alex Elder wrote:
> A ceph_connection holds a mixture of connection state (as in "state
> machine" state) and connection flags in a single "state" field.  To
> make the distinction more clear, define a new "flags" field and use
> it rather than the "state" field to hold Boolean flag values.
> 
> Signed-off-by: Alex Elder <elder@xxxxxxxxxxx>
> ---
>  include/linux/ceph/messenger.h |   18 +++++++++----
>  net/ceph/messenger.c           |   50
> ++++++++++++++++++++--------------------
>  2 files changed, 37 insertions(+), 31 deletions(-)
> 
> diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
> index 3fbd4be..920235e 100644
> --- a/include/linux/ceph/messenger.h
> +++ b/include/linux/ceph/messenger.h
> @@ -103,20 +103,25 @@ struct ceph_msg_pos {
>  #define MAX_DELAY_INTERVAL	(5 * 60 * HZ)
> 
>  /*
> - * ceph_connection state bit flags
> + * ceph_connection flag bits
>   */
> +
>  #define LOSSYTX         0  /* we can close channel or drop messages on errors
> */
> -#define CONNECTING	1
> -#define NEGOTIATING	2
>  #define KEEPALIVE_PENDING      3
>  #define WRITE_PENDING	4  /* we have data ready to send */
> +#define SOCK_CLOSED	11 /* socket state changed to closed */
> +#define BACKOFF         15
> +
> +/*
> + * ceph_connection states
> + */
> +#define CONNECTING	1
> +#define NEGOTIATING	2
>  #define STANDBY		8  /* no outgoing messages, socket closed.  we
> keep
>  			    * the ceph_connection around to maintain shared
>  			    * state with the peer. */
>  #define CLOSED		10 /* we've closed the connection */
> -#define SOCK_CLOSED	11 /* socket state changed to closed */
>  #define OPENING         13 /* open connection w/ (possibly new) peer */
> -#define BACKOFF         15

Later it might be work prefixing these with FLAG_ and/or STATE_.

Reviewed-by: Sage Weil <sage@xxxxxxxxxxx>


> 
>  /*
>   * A single connection with another host.
> @@ -133,7 +138,8 @@ struct ceph_connection {
> 
>  	struct ceph_messenger *msgr;
>  	struct socket *sock;
> -	unsigned long state;	/* connection state (see flags above) */
> +	unsigned long flags;
> +	unsigned long state;
>  	const char *error_msg;  /* error message, if any */
> 
>  	struct ceph_entity_addr peer_addr; /* peer address */
> diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
> index 19f1948..29055df 100644
> --- a/net/ceph/messenger.c
> +++ b/net/ceph/messenger.c
> @@ -176,7 +176,7 @@ static void ceph_sock_write_space(struct sock *sk)
>  	 * buffer. See net/ipv4/tcp_input.c:tcp_check_space()
>  	 * and net/core/stream.c:sk_stream_write_space().
>  	 */
> -	if (test_bit(WRITE_PENDING, &con->state)) {
> +	if (test_bit(WRITE_PENDING, &con->flags)) {
>  		if (sk_stream_wspace(sk) >= sk_stream_min_wspace(sk)) {
>  			dout("%s %p queueing write work\n", __func__, con);
>  			clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
> @@ -203,7 +203,7 @@ static void ceph_sock_state_change(struct sock *sk)
>  		dout("%s TCP_CLOSE\n", __func__);
>  	case TCP_CLOSE_WAIT:
>  		dout("%s TCP_CLOSE_WAIT\n", __func__);
> -		if (test_and_set_bit(SOCK_CLOSED, &con->state) == 0) {
> +		if (test_and_set_bit(SOCK_CLOSED, &con->flags) == 0) {
>  			if (test_bit(CONNECTING, &con->state))
>  				con->error_msg = "connection failed";
>  			else
> @@ -393,9 +393,9 @@ void ceph_con_close(struct ceph_connection *con)
>  	     ceph_pr_addr(&con->peer_addr.in_addr));
>  	set_bit(CLOSED, &con->state);  /* in case there's queued work */
>  	clear_bit(STANDBY, &con->state);  /* avoid connect_seq bump */
> -	clear_bit(LOSSYTX, &con->state);  /* so we retry next connect */
> -	clear_bit(KEEPALIVE_PENDING, &con->state);
> -	clear_bit(WRITE_PENDING, &con->state);
> +	clear_bit(LOSSYTX, &con->flags);  /* so we retry next connect */
> +	clear_bit(KEEPALIVE_PENDING, &con->flags);
> +	clear_bit(WRITE_PENDING, &con->flags);
>  	mutex_lock(&con->mutex);
>  	reset_connection(con);
>  	con->peer_global_seq = 0;
> @@ -612,7 +612,7 @@ static void prepare_write_message(struct ceph_connection
> *con)
>  		prepare_write_message_footer(con);
>  	}
> 
> -	set_bit(WRITE_PENDING, &con->state);
> +	set_bit(WRITE_PENDING, &con->flags);
>  }
> 
>  /*
> @@ -633,7 +633,7 @@ static void prepare_write_ack(struct ceph_connection *con)
>  				&con->out_temp_ack);
> 
>  	con->out_more = 1;  /* more will follow.. eventually.. */
> -	set_bit(WRITE_PENDING, &con->state);
> +	set_bit(WRITE_PENDING, &con->flags);
>  }
> 
>  /*
> @@ -644,7 +644,7 @@ static void prepare_write_keepalive(struct ceph_connection
> *con)
>  	dout("prepare_write_keepalive %p\n", con);
>  	con_out_kvec_reset(con);
>  	con_out_kvec_add(con, sizeof (tag_keepalive), &tag_keepalive);
> -	set_bit(WRITE_PENDING, &con->state);
> +	set_bit(WRITE_PENDING, &con->flags);
>  }
> 
>  /*
> @@ -673,7 +673,7 @@ static struct ceph_auth_handshake
> *get_connect_authorizer(struct ceph_connection
> 
>  	if (IS_ERR(auth))
>  		return auth;
> -	if (test_bit(CLOSED, &con->state) || test_bit(OPENING, &con->state))
> +	if (test_bit(CLOSED, &con->state) || test_bit(OPENING, &con->flags))
>  		return ERR_PTR(-EAGAIN);
> 
>  	con->auth_reply_buf = auth->authorizer_reply_buf;
> @@ -693,7 +693,7 @@ static void prepare_write_banner(struct ceph_connection
> *con)
>  					&con->msgr->my_enc_addr);
> 
>  	con->out_more = 0;
> -	set_bit(WRITE_PENDING, &con->state);
> +	set_bit(WRITE_PENDING, &con->flags);
>  }
> 
>  static int prepare_write_connect(struct ceph_connection *con)
> @@ -743,7 +743,7 @@ static int prepare_write_connect(struct ceph_connection
> *con)
>  					auth->authorizer_buf);
> 
>  	con->out_more = 0;
> -	set_bit(WRITE_PENDING, &con->state);
> +	set_bit(WRITE_PENDING, &con->flags);
> 
>  	return 0;
>  }
> @@ -1490,7 +1490,7 @@ static int process_connect(struct ceph_connection *con)
>  			le32_to_cpu(con->in_reply.connect_seq));
> 
>  		if (con->in_reply.flags & CEPH_MSG_CONNECT_LOSSY)
> -			set_bit(LOSSYTX, &con->state);
> +			set_bit(LOSSYTX, &con->flags);
> 
>  		prepare_read_tag(con);
>  		break;
> @@ -1931,14 +1931,14 @@ do_next:
>  			prepare_write_ack(con);
>  			goto more;
>  		}
> -		if (test_and_clear_bit(KEEPALIVE_PENDING, &con->state)) {
> +		if (test_and_clear_bit(KEEPALIVE_PENDING, &con->flags)) {
>  			prepare_write_keepalive(con);
>  			goto more;
>  		}
>  	}
> 
>  	/* Nothing to do! */
> -	clear_bit(WRITE_PENDING, &con->state);
> +	clear_bit(WRITE_PENDING, &con->flags);
>  	dout("try_write nothing else to write.\n");
>  	ret = 0;
>  out:
> @@ -2104,7 +2104,7 @@ static void con_work(struct work_struct *work)
> 
>  	mutex_lock(&con->mutex);
>  restart:
> -	if (test_and_clear_bit(BACKOFF, &con->state)) {
> +	if (test_and_clear_bit(BACKOFF, &con->flags)) {
>  		dout("con_work %p backing off\n", con);
>  		if (queue_delayed_work(ceph_msgr_wq, &con->work,
>  				       round_jiffies_relative(con->delay))) {
> @@ -2133,7 +2133,7 @@ restart:
>  		con_close_socket(con);
>  	}
> 
> -	if (test_and_clear_bit(SOCK_CLOSED, &con->state))
> +	if (test_and_clear_bit(SOCK_CLOSED, &con->flags))
>  		goto fault;
> 
>  	ret = try_read(con);
> @@ -2172,7 +2172,7 @@ static void ceph_fault(struct ceph_connection *con)
>  	dout("fault %p state %lu to peer %s\n",
>  	     con, con->state, ceph_pr_addr(&con->peer_addr.in_addr));
> 
> -	if (test_bit(LOSSYTX, &con->state)) {
> +	if (test_bit(LOSSYTX, &con->flags)) {
>  		dout("fault on LOSSYTX channel\n");
>  		goto out;
>  	}
> @@ -2194,9 +2194,9 @@ static void ceph_fault(struct ceph_connection *con)
>  	/* If there are no messages queued or keepalive pending, place
>  	 * the connection in a STANDBY state */
>  	if (list_empty(&con->out_queue) &&
> -	    !test_bit(KEEPALIVE_PENDING, &con->state)) {
> +	    !test_bit(KEEPALIVE_PENDING, &con->flags)) {
>  		dout("fault %p setting STANDBY clearing WRITE_PENDING\n",
> con);
> -		clear_bit(WRITE_PENDING, &con->state);
> +		clear_bit(WRITE_PENDING, &con->flags);
>  		set_bit(STANDBY, &con->state);
>  	} else {
>  		/* retry after a delay. */
> @@ -2220,7 +2220,7 @@ static void ceph_fault(struct ceph_connection *con)
>  			 * that when con_work restarts we schedule the
>  			 * delay then.
>  			 */
> -			set_bit(BACKOFF, &con->state);
> +			set_bit(BACKOFF, &con->flags);
>  		}
>  	}
> 
> @@ -2276,8 +2276,8 @@ static void clear_standby(struct ceph_connection *con)
>  		mutex_lock(&con->mutex);
>  		dout("clear_standby %p and ++connect_seq\n", con);
>  		con->connect_seq++;
> -		WARN_ON(test_bit(WRITE_PENDING, &con->state));
> -		WARN_ON(test_bit(KEEPALIVE_PENDING, &con->state));
> +		WARN_ON(test_bit(WRITE_PENDING, &con->flags));
> +		WARN_ON(test_bit(KEEPALIVE_PENDING, &con->flags));
>  		mutex_unlock(&con->mutex);
>  	}
>  }
> @@ -2315,7 +2315,7 @@ void ceph_con_send(struct ceph_connection *con, struct
> ceph_msg *msg)
>  	/* if there wasn't anything waiting to send before, queue
>  	 * new work */
>  	clear_standby(con);
> -	if (test_and_set_bit(WRITE_PENDING, &con->state) == 0)
> +	if (test_and_set_bit(WRITE_PENDING, &con->flags) == 0)
>  		queue_con(con);
>  }
>  EXPORT_SYMBOL(ceph_con_send);
> @@ -2382,8 +2382,8 @@ void ceph_con_keepalive(struct ceph_connection *con)
>  {
>  	dout("con_keepalive %p\n", con);
>  	clear_standby(con);
> -	if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 &&
> -	    test_and_set_bit(WRITE_PENDING, &con->state) == 0)
> +	if (test_and_set_bit(KEEPALIVE_PENDING, &con->flags) == 0 &&
> +	    test_and_set_bit(WRITE_PENDING, &con->flags) == 0)
>  		queue_con(con);
>  }
>  EXPORT_SYMBOL(ceph_con_keepalive);
> -- 
> 1.7.5.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux