-# Copyright (c) 2010 Nicira Networks
+# Copyright (c) 2010, 2011 Nicira Networks
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
return CONNECT
class ConnectInProgress(object):
- name = "CONNECT_IN_PROGRESS"
+ name = "CONNECTING"
is_connected = False
@staticmethod
% (fsm.name, (now - fsm.state_entered) / 1000.0))
return DISCONNECT
- class Reconnect:
+ class Reconnect(object):
name = "RECONNECT"
is_connected = False
self.state_entered = now
self.backoff = 0
self.last_received = now
- self.last_connected = now
- self.last_disconnected = now
+ self.last_connected = None
+ self.last_disconnected = None
self.max_tries = None
self.creation_time = now
% self.name)
else:
if self.passive:
- type = "listen"
+ type_ = "listen"
else:
- type = "connection"
+ type_ = "connection"
if error > 0:
logging.warning("%s: %s attempt failed (%s)"
- % (self.name, type, os.strerror(error)))
+ % (self.name, type_, os.strerror(error)))
else:
self.info_level("%s: %s attempt timed out"
- % (self.name, type))
+ % (self.name, type_))
if (self.state in (Reconnect.Active, Reconnect.Idle)):
self.last_disconnected = now
def timeout(self, now):
"""Returns the number of milliseconds after which self.run() should be
- called if nothing else notable happens in the meantime, or a negative
- number if this is currently unnecessary."""
+ called if nothing else notable happens in the meantime, or None if this
+ is currently unnecessary."""
deadline = self.state.deadline(self)
if deadline is not None:
remaining = deadline - now
False otherwise."""
return self.state.is_connected
- def get_connection_duration(self, now):
- """Returns the number of milliseconds for which this FSM has been
- continuously connected to its peer. (If this FSM is not currently
- connected, this is 0.)"""
- if self.is_connected():
+ def get_last_connect_elapsed(self, now):
+ """Returns the number of milliseconds since 'fsm' was last connected
+ to its peer. Returns None if never connected."""
+ if self.last_connected:
return now - self.last_connected
else:
- return 0
+ return None
- def get_disconnect_duration(self, now):
- """Returns the number of milliseconds for which this FSM has been
- continuously disconnected from its peer. (If this FSM is not currently
- connected, this is 0.)"""
- if not self.is_connected():
+ def get_last_disconnect_elapsed(self, now):
+ """Returns the number of milliseconds since 'fsm' was last disconnected
+ from its peer. Returns None if never disconnected."""
+ if self.last_disconnected:
return now - self.last_disconnected
else:
- return 0
+ return None
def get_stats(self, now):
class Stats(object):
stats.backoff = self.backoff
stats.seqno = self.seqno
stats.is_connected = self.is_connected()
- stats.current_connection_duration = self.get_connection_duration(now)
- stats.current_disconnect_duration = self.get_disconnect_duration(now)
- stats.total_connected_duration = (stats.current_connection_duration +
- self.total_connected_duration)
+ stats.msec_since_connect = self.get_last_connect_elapsed(now)
+ stats.msec_since_disconnect = self.get_last_disconnect_elapsed(now)
+ stats.total_connected_duration = self.total_connected_duration
+ if self.is_connected():
+ stats.total_connected_duration += self.get_last_connect_elapsed(now)
stats.n_attempted_connections = self.n_attempted_connections
stats.n_successful_connections = self.n_successful_connections
stats.state = self.state.name