X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Freconnect.c;h=bab821ebb9e7eb3a3b40824f5b4eec459a6df4de;hb=HEAD;hp=7737fcf7e7677f0bb83d658e24582bfddf74bcbf;hpb=f125905cdd3dc0339ad968c0a70128807884b400;p=cascardo%2Fovs.git diff --git a/lib/reconnect.c b/lib/reconnect.c index 7737fcf7e..bab821ebb 100644 --- a/lib/reconnect.c +++ b/lib/reconnect.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,11 +17,10 @@ #include #include "reconnect.h" -#include #include #include "poll-loop.h" -#include "vlog.h" +#include "openvswitch/vlog.h" VLOG_DEFINE_THIS_MODULE(reconnect); @@ -54,13 +53,11 @@ struct reconnect { bool passive; enum vlog_level info; /* Used for informational messages. */ - uint8_t dscp; - /* State. */ enum state state; long long int state_entered; int backoff; - long long int last_received; + long long int last_activity; long long int last_connected; long long int last_disconnected; unsigned int max_tries; @@ -107,7 +104,7 @@ reconnect_create(long long int now) fsm->state = S_VOID; fsm->state_entered = now; fsm->backoff = 0; - fsm->last_received = now; + fsm->last_activity = now; fsm->last_connected = LLONG_MAX; fsm->last_disconnected = LLONG_MAX; fsm->max_tries = UINT_MAX; @@ -178,9 +175,9 @@ reconnect_get_max_backoff(const struct reconnect *fsm) /* Returns the "probe interval" for 'fsm' in milliseconds. If this is zero, it * disables the connection keepalive feature. If it is nonzero, then if the - * interval passes while 'fsm' is connected and without reconnect_received() + * interval passes while 'fsm' is connected and without reconnect_activity() * being called for 'fsm', reconnect_run() returns RECONNECT_PROBE. If the - * interval passes again without reconnect_received() being called, + * interval passes again without reconnect_activity() being called, * reconnect_run() returns RECONNECT_DISCONNECT for 'fsm'. */ int reconnect_get_probe_interval(const struct reconnect *fsm) @@ -188,14 +185,6 @@ 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. @@ -218,7 +207,8 @@ reconnect_get_max_tries(struct reconnect *fsm) /* Configures the backoff parameters for 'fsm'. 'min_backoff' is the minimum * number of milliseconds, and 'max_backoff' is the maximum, between connection - * attempts. + * attempts. The current backoff is also the duration that 'fsm' is willing to + * wait for a given connection to succeed or fail. * * 'min_backoff' must be at least 1000, and 'max_backoff' must be greater than * or equal to 'min_backoff'. @@ -243,8 +233,8 @@ reconnect_set_backoff(struct reconnect *fsm, int min_backoff, int max_backoff) /* Sets the "probe interval" for 'fsm' to 'probe_interval', in milliseconds. * If this is zero, it disables the connection keepalive feature. If it is * nonzero, then if the interval passes while 'fsm' is connected and without - * reconnect_received() being called for 'fsm', reconnect_run() returns - * RECONNECT_PROBE. If the interval passes again without reconnect_received() + * reconnect_activity() being called for 'fsm', reconnect_run() returns + * RECONNECT_PROBE. If the interval passes again without reconnect_activity() * being called, reconnect_run() returns RECONNECT_DISCONNECT for 'fsm'. * * If 'probe_interval' is nonzero, then it will be forced to a value of at @@ -255,14 +245,6 @@ 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 @@ -349,7 +331,7 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error) if (fsm->state & (S_ACTIVE | S_IDLE)) { if (error > 0) { VLOG_WARN("%s: connection dropped (%s)", - fsm->name, strerror(error)); + fsm->name, ovs_strerror(error)); } else if (error == EOF) { VLOG(fsm->info, "%s: connection closed by peer", fsm->name); } else { @@ -358,7 +340,7 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error) } else if (fsm->state == S_LISTENING) { if (error > 0) { VLOG_WARN("%s: error listening for connections (%s)", - fsm->name, strerror(error)); + fsm->name, ovs_strerror(error)); } else { VLOG(fsm->info, "%s: error listening for connections", fsm->name); @@ -366,8 +348,8 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error) } else { const char *type = fsm->passive ? "listen" : "connection"; if (error > 0) { - VLOG_WARN("%s: %s attempt failed (%s)", - fsm->name, type, strerror(error)); + VLOG_INFO("%s: %s attempt failed (%s)", + fsm->name, type, ovs_strerror(error)); } else { VLOG(fsm->info, "%s: %s attempt timed out", fsm->name, type); } @@ -378,7 +360,7 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error) } /* Back off. */ if (fsm->state & (S_ACTIVE | S_IDLE) - && (fsm->last_received - fsm->last_connected >= fsm->backoff + && (fsm->last_activity - fsm->last_connected >= fsm->backoff || fsm->passive)) { fsm->backoff = fsm->passive ? 0 : fsm->min_backoff; } else { @@ -459,7 +441,7 @@ reconnect_listen_error(struct reconnect *fsm, long long int now, int error) /* Tell 'fsm' that the connection was successful. * * The FSM will start the probe interval timer, which is reset by - * reconnect_received(). If the timer expires, a probe will be sent (by + * reconnect_activity(). If the timer expires, a probe will be sent (by * returning RECONNECT_PROBE from reconnect_run()). If the timer expires * again without being reset, the connection will be aborted (by returning * RECONNECT_DISCONNECT from reconnect_run()). */ @@ -485,15 +467,15 @@ reconnect_connect_failed(struct reconnect *fsm, long long int now, int error) reconnect_disconnected(fsm, now, error); } -/* Tell 'fsm' that some data was received. This resets the probe interval - * timer, so that the connection is known not to be idle. */ +/* Tell 'fsm' that some activity has occurred on the connection. This resets + * the probe interval timer, so that the connection is known not to be idle. */ void -reconnect_received(struct reconnect *fsm, long long int now) +reconnect_activity(struct reconnect *fsm, long long int now) { if (fsm->state != S_ACTIVE) { reconnect_transition__(fsm, now, S_ACTIVE); } - fsm->last_received = now; + fsm->last_activity = now; } static void @@ -521,7 +503,7 @@ reconnect_transition__(struct reconnect *fsm, long long int now, static long long int reconnect_deadline__(const struct reconnect *fsm) { - assert(fsm->state_entered != LLONG_MIN); + ovs_assert(fsm->state_entered != LLONG_MIN); switch (fsm->state) { case S_VOID: case S_LISTENING: @@ -535,19 +517,22 @@ reconnect_deadline__(const struct reconnect *fsm) case S_ACTIVE: if (fsm->probe_interval) { - long long int base = MAX(fsm->last_received, fsm->state_entered); + long long int base = MAX(fsm->last_activity, fsm->state_entered); return base + fsm->probe_interval; } return LLONG_MAX; case S_IDLE: - return fsm->state_entered + fsm->probe_interval; + if (fsm->probe_interval) { + return fsm->state_entered + fsm->probe_interval; + } + return LLONG_MAX; case S_RECONNECT: return fsm->state_entered; } - NOT_REACHED(); + OVS_NOT_REACHED(); } /* Assesses whether any action should be taken on 'fsm'. The return value is @@ -602,7 +587,7 @@ reconnect_run(struct reconnect *fsm, long long int now) case S_ACTIVE: VLOG_DBG("%s: idle %lld ms, sending inactivity probe", fsm->name, - now - MAX(fsm->last_received, fsm->state_entered)); + now - MAX(fsm->last_activity, fsm->state_entered)); reconnect_transition__(fsm, now, S_IDLE); return RECONNECT_PROBE; @@ -619,7 +604,7 @@ reconnect_run(struct reconnect *fsm, long long int now) return 0; } - NOT_REACHED(); + OVS_NOT_REACHED(); } else { return 0; } @@ -688,7 +673,7 @@ reconnect_get_stats(const struct reconnect *fsm, long long int now, struct reconnect_stats *stats) { stats->creation_time = fsm->creation_time; - stats->last_received = fsm->last_received; + stats->last_activity = fsm->last_activity; stats->last_connected = fsm->last_connected; stats->last_disconnected = fsm->last_disconnected; stats->backoff = fsm->backoff;