ping-pong timer: - share last_sent and last_received between channels so that any activity ensures the remote host being alive (useful under heavy loads) - timer expiry disconnects both transports

Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
This commit is contained in:
Anand V. Avati 2009-03-27 22:11:31 +05:30
parent 6c28cb81b2
commit 3baa99ebef
2 changed files with 29 additions and 33 deletions

View File

@ -498,12 +498,16 @@ client_ping_timer_expired (void *data)
conn->ping_timer);
gettimeofday (&current, NULL);
if (((current.tv_sec - conn->last_received.tv_sec) <
conn->ping_timeout)
|| ((current.tv_sec - conn->last_sent.tv_sec) <
conn->ping_timeout)) {
transport_activity = 1;
}
pthread_mutex_lock (&conf->mutex);
{
if (((current.tv_sec - conf->last_received.tv_sec) <
conn->ping_timeout)
|| ((current.tv_sec - conf->last_sent.tv_sec) <
conn->ping_timeout)) {
transport_activity = 1;
}
}
pthread_mutex_unlock (&conf->mutex);
if (transport_activity) {
gf_log (this->name, GF_LOG_DEBUG,
@ -531,7 +535,8 @@ client_ping_timer_expired (void *data)
if (disconnect) {
gf_log (this->name, GF_LOG_ERROR,
"ping timer expired! bailing transport");
transport_disconnect (trans);
transport_disconnect (conf->transport[0]);
transport_disconnect (conf->transport[1]);
}
}
@ -727,8 +732,11 @@ protocol_client_xfer (call_frame_t *frame, xlator_t *this, transport_t *trans,
}
if ((ret >= 0) && frame) {
/* TODO: check this logic */
gettimeofday (&conn->last_sent, NULL);
pthread_mutex_lock (&conf->mutex);
{
gettimeofday (&conf->last_sent, NULL);
}
pthread_mutex_unlock (&conf->mutex);
save_frame (trans, frame, op, type, callid);
}
@ -6297,12 +6305,6 @@ protocol_client_cleanup (transport_t *trans)
conn->saved_frames = saved_frames_new ();
/* bailout logic cleanup */
memset (&(conn->last_sent), 0,
sizeof (conn->last_sent));
memset (&(conn->last_received), 0,
sizeof (conn->last_received));
if (conn->timer) {
gf_timer_call_cancel (trans->xl->ctx, conn->timer);
conn->timer = NULL;
@ -6594,10 +6596,6 @@ init (xlator_t *this)
conn->callid = 1;
memset (&(conn->last_sent), 0, sizeof (conn->last_sent));
memset (&(conn->last_received), 0,
sizeof (conn->last_received));
conn->transport_timeout = transport_timeout;
conn->ping_timeout = ping_timeout;
@ -6742,15 +6740,15 @@ fail:
int
protocol_client_pollout (xlator_t *this, transport_t *trans)
{
client_connection_t *conn = NULL;
client_conf_t *conf = NULL;
conn = trans->xl_private;
conf = trans->xl->private;
pthread_mutex_lock (&conn->lock);
pthread_mutex_lock (&conf->mutex);
{
gettimeofday (&conn->last_sent, NULL);
gettimeofday (&conf->last_sent, NULL);
}
pthread_mutex_unlock (&conn->lock);
pthread_mutex_unlock (&conf->mutex);
return 0;
}
@ -6759,22 +6757,20 @@ protocol_client_pollout (xlator_t *this, transport_t *trans)
int
protocol_client_pollin (xlator_t *this, transport_t *trans)
{
client_connection_t *conn = NULL;
client_conf_t *conf = NULL;
int ret = -1;
char *buf = NULL;
size_t buflen = 0;
char *hdr = NULL;
size_t hdrlen = 0;
int connected = 0;
conn = trans->xl_private;
conf = trans->xl->private;
pthread_mutex_lock (&conn->lock);
pthread_mutex_lock (&conf->mutex);
{
gettimeofday (&conn->last_received, NULL);
connected = conn->connected;
gettimeofday (&conf->last_received, NULL);
}
pthread_mutex_unlock (&conn->lock);
pthread_mutex_unlock (&conf->mutex);
ret = transport_receive (trans, &hdr, &hdrlen, &buf, &buflen);

View File

@ -78,6 +78,8 @@ struct _client_conf {
gf_lock_t lock;
} forget;
dict_t *saved_fds;
struct timeval last_sent;
struct timeval last_received;
pthread_mutex_t mutex;
};
typedef struct _client_conf client_conf_t;
@ -94,8 +96,6 @@ struct client_connection {
gf_timer_t *reconnect;
char connected;
uint64_t max_block_size;
struct timeval last_sent;
struct timeval last_received;
gf_timer_t *timer;
gf_timer_t *ping_timer;
};