X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Freconnect.c;h=7737fcf7e7677f0bb83d658e24582bfddf74bcbf;hb=6e492d81450217a5c90cbb4ad31d81b1e611989b;hp=08ce858647fb6a039e80c615969fc984ecb5bbec;hpb=eba18f0044cbe3654b4c796bbe7c056ca1793c70;p=openvswitch diff --git a/lib/reconnect.c b/lib/reconnect.c index 08ce8586..7737fcf7 100644 --- a/lib/reconnect.c +++ b/lib/reconnect.c @@ -28,7 +28,7 @@ VLOG_DEFINE_THIS_MODULE(reconnect); #define STATES \ STATE(VOID, 1 << 0) \ STATE(BACKOFF, 1 << 1) \ - STATE(CONNECT_IN_PROGRESS, 1 << 3) \ + STATE(CONNECTING, 1 << 3) \ STATE(ACTIVE, 1 << 4) \ STATE(IDLE, 1 << 5) \ STATE(RECONNECT, 1 << 6) \ @@ -54,6 +54,8 @@ struct reconnect { bool passive; enum vlog_level info; /* Used for informational messages. */ + uint8_t dscp; + /* State. */ enum state state; long long int state_entered; @@ -106,8 +108,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; @@ -186,6 +188,14 @@ reconnect_get_probe_interval(const struct reconnect *fsm) return fsm->probe_interval; } +/* Returns the dscp value used for establishing the connection between the + * manager and the database. */ +uint8_t +reconnect_get_dscp(const struct reconnect *fsm) +{ + return fsm->dscp; +} + /* Limits the maximum number of times that 'fsm' will ask the client to try to * reconnect to 'max_tries'. UINT_MAX (the default) means an unlimited number * of tries. @@ -245,6 +255,14 @@ reconnect_set_probe_interval(struct reconnect *fsm, int probe_interval) fsm->probe_interval = probe_interval ? MAX(1000, probe_interval) : 0; } +/* Sets the dscp value to be used for establishing a connection between the + * manager and the database. */ +void +reconnect_set_dscp(struct reconnect *fsm, uint8_t dscp) +{ + fsm->dscp = dscp; +} + /* Returns true if 'fsm' is in passive mode, false if 'fsm' is in active mode * (the default). */ bool @@ -263,7 +281,7 @@ reconnect_set_passive(struct reconnect *fsm, bool passive, long long int now) fsm->passive = passive; if (passive - ? fsm->state & (S_CONNECT_IN_PROGRESS | S_RECONNECT) + ? fsm->state & (S_CONNECTING | S_RECONNECT) : fsm->state == S_LISTENING && reconnect_may_retry(fsm)) { reconnect_transition__(fsm, now, S_BACKOFF); fsm->backoff = 0; @@ -312,7 +330,7 @@ reconnect_disable(struct reconnect *fsm, long long int now) void reconnect_force_reconnect(struct reconnect *fsm, long long int now) { - if (fsm->state & (S_CONNECT_IN_PROGRESS | S_ACTIVE | S_IDLE)) { + if (fsm->state & (S_CONNECTING | S_ACTIVE | S_IDLE)) { reconnect_transition__(fsm, now, S_RECONNECT); } } @@ -393,13 +411,13 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error) void reconnect_connecting(struct reconnect *fsm, long long int now) { - if (fsm->state != S_CONNECT_IN_PROGRESS) { + if (fsm->state != S_CONNECTING) { if (fsm->passive) { VLOG(fsm->info, "%s: listening...", fsm->name); } else { VLOG(fsm->info, "%s: connecting...", fsm->name); } - reconnect_transition__(fsm, now, S_CONNECT_IN_PROGRESS); + reconnect_transition__(fsm, now, S_CONNECTING); } } @@ -482,7 +500,7 @@ static void reconnect_transition__(struct reconnect *fsm, long long int now, enum state state) { - if (fsm->state == S_CONNECT_IN_PROGRESS) { + if (fsm->state == S_CONNECTING) { fsm->n_attempted_connections++; if (state == S_ACTIVE) { fsm->n_successful_connections++; @@ -512,7 +530,7 @@ reconnect_deadline__(const struct reconnect *fsm) case S_BACKOFF: return fsm->state_entered + fsm->backoff; - case S_CONNECT_IN_PROGRESS: + case S_CONNECTING: return fsm->state_entered + MAX(1000, fsm->backoff); case S_ACTIVE: @@ -579,7 +597,7 @@ reconnect_run(struct reconnect *fsm, long long int now) case S_BACKOFF: return RECONNECT_CONNECT; - case S_CONNECT_IN_PROGRESS: + case S_CONNECTING: return RECONNECT_DISCONNECT; case S_ACTIVE: @@ -642,23 +660,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 +694,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);