def unload_community(self): if __debug__: dprint() super(EffortCommunity, self).unload_community() # unsubscribe from events. 22/03/13 Boudewijn: Dispersy is not allowed to call swift # because it may cause database locks if people incorrectly keep the session locked. temp_thread = Callback() temp_thread.register(self._swift.set_subscribe_channel_close, ("ALL", False, self.i2ithread_channel_close)) temp_thread.register(temp_thread.stop) temp_thread.start("Temporary-EffortCommunity") # cancel outstanding pings for ping_candidate in self._slope.itervalues(): self._dispersy.callback.unregister(ping_candidate.callback_id) self._slope = {} # store all cached observations self._database.executemany(u"INSERT OR REPLACE INTO observation (member, timestamp, effort) VALUES (?, ?, ?)", [(database_id, history.origin, buffer(history.bytes)) for database_id, history in self._observations.iteritems()]) # update all up and download values self.download_state_callback([], closing=True) # store all cached bandwidth guesses self._database.executemany(u"INSERT OR REPLACE INTO bandwidth_guess (ip, member, timestamp, upload, download) VALUES (?, ?, ?, ?, ?)", [(unicode(ip), guess.member.database_id if guess.member else 0, guess.timestamp, int(guess.upload), int(guess.download)) for ip, guess in self._bandwidth_guesses.iteritems()])
def __init__(self, master, swift_process): # original walker callbacks (will be set during super(...).__init__) self._original_on_introduction_request = None self._original_on_introduction_response = None super(EffortCommunity, self).__init__(master) # _SWIFT is a SwiftProcess instance (allowing us to schedule CLOSE_EVENT callbacks) self._swift = swift_process # subscribe to events. 22/03/13 Boudewijn: Dispersy is not allowed to call swift because it # may cause database locks if people incorrectly keep the session locked. temp_thread = Callback() temp_thread.register(self._swift.set_subscribe_channel_close, ("ALL", True, self.i2ithread_channel_close)) temp_thread.register(temp_thread.stop) temp_thread.start("Temporary-EffortCommunity") # _DATABASE stores all direct observations and indirect hearsay self._database = EffortDatabase.get_instance(self._dispersy) # _OBSERVATIONS cache (reduce _DATABASE access) self._observations_length = 512 self._observations = OrderedDict() # _bandwidth_guesses cache (reduce _DATABASE access) self._bandwidth_guesses_length = 512 self._bandwidth_guesses = OrderedDict() # _DOWNLOAD_STATES contains all peers that are currently downloading. when we determine # that a peer is missing, we will update its bandwidth statistics self._download_states = dict() self._swift_raw_bytes_up = 0 self._swift_raw_bytes_down = 0 # _SLOPE contains the promising members as Member:RecordCandidate self._slope_length = 10 self._slope = {} # _SIGNATURE_COUNT is the number of members that will be asked to sign self._signature_count = 5 # simple statistics self._statistic_incoming_signature_request_success = 0 self._statistic_outgoing_signature_request = 0 self._statistic_outgoing_signature_request_success = 0 self._statistic_outgoing_signature_request_timeout = 0 self._statistic_member_ordering_fail = 0 self._statistic_initial_timestamp_fail = 0 self._statistic_cycle_fail = 0 self._has_been_killed = False # wait till next time we can create records with the candidates on our slope self._pending_callbacks.append(self._dispersy.callback.register(self._periodically_create_records)) self._pending_callbacks.append(self._dispersy.callback.register(self._periodically_push_statistics)) self._pending_callbacks.append(self._dispersy.callback.register(self._periodically_cleanup_database))