2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-15 14:17:18 +00:00

ovsdb-server: Report time since last connect and disconnect for each manager.

Only the time connected (if connected) or disconnected (if disconnected) is
currently reported for each manager. Change to reporting both in seconds since
the last connect and disconnect events respectively. An empty value indicates
no previous connection or disconnection.

This can help diagnose certain connectivity problems, e.g. flapping.

Requested-by: Peter Balland <peter@nicira.com>
Bug #4833.
This commit is contained in:
Andrew Evans
2011-03-14 13:10:02 -07:00
parent 6d38ac7cb9
commit 5eda645e36
10 changed files with 162 additions and 180 deletions

View File

@@ -106,8 +106,8 @@ reconnect_create(long long int now)
fsm->state_entered = now;
fsm->backoff = 0;
fsm->last_received = now;
fsm->last_connected = now;
fsm->last_disconnected = now;
fsm->last_connected = LLONG_MAX;
fsm->last_disconnected = LLONG_MAX;
fsm->max_tries = UINT_MAX;
fsm->creation_time = now;
@@ -642,23 +642,26 @@ reconnect_is_connected(const struct reconnect *fsm)
return is_connected_state(fsm->state);
}
/* Returns the number of milliseconds for which 'fsm' has been continuously
* connected to its peer. (If 'fsm' is not currently connected, this is 0.) */
/* Returns the number of milliseconds since 'fsm' last successfully connected
* to its peer (even if it has since disconnected). Returns UINT_MAX if never
* connected. */
unsigned int
reconnect_get_connection_duration(const struct reconnect *fsm,
long long int now)
reconnect_get_last_connect_elapsed(const struct reconnect *fsm,
long long int now)
{
return reconnect_is_connected(fsm) ? now - fsm->last_connected : 0;
return fsm->last_connected == LLONG_MAX ? UINT_MAX
: now - fsm->last_connected;
}
/* Returns the number of milliseconds for which 'fsm' has been continuously
* disconnected from its peer. (If 'fsm' is not currently connected,
* this is 0.) */
/* Returns the number of milliseconds since 'fsm' last disconnected
* from its peer (even if it has since reconnected). Returns UINT_MAX if never
* disconnected. */
unsigned int
reconnect_get_disconnect_duration(const struct reconnect *fsm,
long long int now)
reconnect_get_last_disconnect_elapsed(const struct reconnect *fsm,
long long int now)
{
return reconnect_is_connected(fsm) ? 0 : now - fsm->last_disconnected;
return fsm->last_disconnected == LLONG_MAX ? UINT_MAX
: now - fsm->last_disconnected;
}
/* Copies various statistics for 'fsm' into '*stats'. */
@@ -673,12 +676,13 @@ reconnect_get_stats(const struct reconnect *fsm, long long int now,
stats->backoff = fsm->backoff;
stats->seqno = fsm->seqno;
stats->is_connected = reconnect_is_connected(fsm);
stats->current_connection_duration
= reconnect_get_connection_duration(fsm, now);
stats->current_disconnect_duration
= reconnect_get_disconnect_duration(fsm, now);
stats->total_connected_duration = (stats->current_connection_duration
+ fsm->total_connected_duration);
stats->msec_since_connect
= reconnect_get_last_connect_elapsed(fsm, now);
stats->msec_since_disconnect
= reconnect_get_last_disconnect_elapsed(fsm, now);
stats->total_connected_duration = fsm->total_connected_duration
+ (is_connected_state(fsm->state)
? reconnect_get_last_connect_elapsed(fsm, now) : 0);
stats->n_attempted_connections = fsm->n_attempted_connections;
stats->n_successful_connections = fsm->n_successful_connections;
stats->state = reconnect_state_name__(fsm->state);