diff --git a/Tribler/Core/APIImplementation/LaunchManyCore.py b/Tribler/Core/APIImplementation/LaunchManyCore.py index 2efa8936bf2..c96e1837c2f 100644 --- a/Tribler/Core/APIImplementation/LaunchManyCore.py +++ b/Tribler/Core/APIImplementation/LaunchManyCore.py @@ -205,6 +205,7 @@ def register(self, session, session_lock): working_directory = unicode(self.session.config.get_state_dir()) self.dispersy = Dispersy(dispersy_endpoint, working_directory) + self.dispersy.statistics.enable_debug_statistics(False) # register TFTP service from Tribler.Core.TFTP.handler import TftpHandler diff --git a/Tribler/Core/TorrentChecker/session.py b/Tribler/Core/TorrentChecker/session.py index fb561670e5d..929c70b1867 100644 --- a/Tribler/Core/TorrentChecker/session.py +++ b/Tribler/Core/TorrentChecker/session.py @@ -462,14 +462,16 @@ def generate_transaction_id(self): self.transaction_id = transaction_id break - @staticmethod - def remove_transaction_id(session): + def remove_transaction_id(self): """ - Removes an session and its corresponding id from the _active_session_dict set. + Removes an session and its corresponding id from the _active_session_dict set and the socket manager. :param session: The session that needs to be removed from the set. """ - if session in UdpTrackerSession._active_session_dict: - del UdpTrackerSession._active_session_dict[session] + if self in UdpTrackerSession._active_session_dict: + del UdpTrackerSession._active_session_dict[self] + + if self.transaction_id in self.socket_mgr.tracker_sessions: + self.socket_mgr.tracker_sessions.pop(self.transaction_id) @inlineCallbacks def cleanup(self): @@ -478,7 +480,7 @@ def cleanup(self): :return: A deferred that fires once the cleanup is done. """ yield super(UdpTrackerSession, self).cleanup() - UdpTrackerSession.remove_transaction_id(self) + self.remove_transaction_id() # Cleanup deferred that fires when everything has been cleaned # Cancel the resolving ip deferred. self.ip_resolve_deferred = None @@ -632,7 +634,7 @@ def handle_scrape_response(self, response): response_list.append({'infohash': infohash.encode('hex'), 'seeders': complete, 'leechers': incomplete}) # close this socket and remove its transaction ID from the list - UdpTrackerSession.remove_transaction_id(self) + self.remove_transaction_id() self._is_finished = True if self.result_deferred and not self.result_deferred.called: diff --git a/Tribler/Test/Community/Tunnel/test_community.py b/Tribler/Test/Community/Tunnel/test_community.py index 7690d9fcbba..350a0d66b6d 100644 --- a/Tribler/Test/Community/Tunnel/test_community.py +++ b/Tribler/Test/Community/Tunnel/test_community.py @@ -116,7 +116,6 @@ def test_readd_bittorrent_peers(self): self.assertNotIn(mock_torrent, self.nodes[0].overlay.bittorrent_peers) - @blocking_call_on_reactor_thread def test_remove_circuit(self): """ Test removing a circuit diff --git a/Tribler/Test/Core/TorrentChecker/test_torrentchecker_session.py b/Tribler/Test/Core/TorrentChecker/test_torrentchecker_session.py index 94c3fbdff51..74218a09a67 100644 --- a/Tribler/Test/Core/TorrentChecker/test_torrentchecker_session.py +++ b/Tribler/Test/Core/TorrentChecker/test_torrentchecker_session.py @@ -15,6 +15,9 @@ class FakeUdpSocketManager(object): transport = 1 + def __init__(self): + self.tracker_sessions = {} + def send_request(self, *args): pass diff --git a/Tribler/community/triblertunnel/community.py b/Tribler/community/triblertunnel/community.py index 6898ec531d2..5b6f71b4345 100644 --- a/Tribler/community/triblertunnel/community.py +++ b/Tribler/community/triblertunnel/community.py @@ -324,14 +324,6 @@ def remove_circuit(self, circuit_id, additional_info='', remove_now=False, destr if self.tribler_session: self.tribler_session.notifier.notify(NTFY_TUNNEL, NTFY_REMOVE, circuit, circuit.sock_addr) - affected_peers = self.dispatcher.circuit_dead(circuit) - ltmgr = self.tribler_session.lm.ltmgr \ - if self.tribler_session and self.tribler_session.config.get_libtorrent_enabled() else None - if ltmgr: - for d, s in ltmgr.torrents.values(): - if s == ltmgr.get_session(d.get_hops()): - d.get_handle().addCallback(lambda handle: self.update_torrent(affected_peers, handle, d)) - circuit_peer = self.get_peer_from_address(circuit.sock_addr) if circuit.bytes_down >= 1024 * 1024 and self.triblerchain_community and circuit_peer: # We should perform a payout of the removed circuit. @@ -347,9 +339,21 @@ def remove_circuit(self, circuit_id, additional_info='', remove_now=False, destr self.do_payout(circuit_peer, circuit_id, circuit.bytes_down * (circuit.goal_hops * 2 - 1), circuit.bytes_down) + def update_torrents(_): + affected_peers = self.dispatcher.circuit_dead(circuit) + ltmgr = self.tribler_session.lm.ltmgr \ + if self.tribler_session and self.tribler_session.config.get_libtorrent_enabled() else None + if ltmgr: + for d, s in ltmgr.torrents.values(): + if s == ltmgr.get_session(d.get_hops()): + d.get_handle().addCallback(lambda handle, download=d: + self.update_torrent(affected_peers, handle, download)) + # Now we actually remove the circuit - super(TriblerTunnelCommunity, self).remove_circuit(circuit_id, additional_info=additional_info, - remove_now=remove_now, destroy=destroy) + remove_deferred = super(TriblerTunnelCommunity, self)\ + .remove_circuit(circuit_id, additional_info=additional_info, remove_now=remove_now, destroy=destroy) + remove_deferred.addCallback(update_torrents) + return remove_deferred def remove_relay(self, circuit_id, additional_info='', remove_now=False, destroy=False, got_destroy_from=None, both_sides=True): diff --git a/Tribler/pyipv8 b/Tribler/pyipv8 index ac936563659..ccfb6eb35db 160000 --- a/Tribler/pyipv8 +++ b/Tribler/pyipv8 @@ -1 +1 @@ -Subproject commit ac936563659f4a53e28e0bb2b5a956a2cb44c318 +Subproject commit ccfb6eb35dbc9e5c8f0b52ffbbfde865e233b1b1 diff --git a/TriblerGUI/dialogs/confirmationdialog.py b/TriblerGUI/dialogs/confirmationdialog.py index a8beb6ef41e..2e7a8ade6f3 100644 --- a/TriblerGUI/dialogs/confirmationdialog.py +++ b/TriblerGUI/dialogs/confirmationdialog.py @@ -47,7 +47,7 @@ def show_error(cls, window, title, error_text): error_dialog = ConfirmationDialog(window, title, error_text, [('CLOSE', BUTTON_TYPE_NORMAL)]) def on_close(): - error_dialog.setParent(None) + error_dialog.close_dialog() error_dialog.button_clicked.connect(on_close) error_dialog.show() @@ -57,7 +57,7 @@ def show_message(cls, window, title, message_text, button_text): error_dialog = ConfirmationDialog(window, title, message_text, [(button_text, BUTTON_TYPE_NORMAL)]) def on_close(): - error_dialog.setParent(None) + error_dialog.close_dialog() error_dialog.button_clicked.connect(on_close) error_dialog.show() diff --git a/TriblerGUI/dialogs/dialogcontainer.py b/TriblerGUI/dialogs/dialogcontainer.py index 357e021334d..c73e3d071a7 100644 --- a/TriblerGUI/dialogs/dialogcontainer.py +++ b/TriblerGUI/dialogs/dialogcontainer.py @@ -22,6 +22,10 @@ def paintEvent(self, _): def close_dialog(self): self.setParent(None) + try: + self.deleteLater() + except RuntimeError: + pass def on_main_window_resize(self): if not self.parentWidget(): diff --git a/TriblerGUI/dialogs/startdownloaddialog.py b/TriblerGUI/dialogs/startdownloaddialog.py index e3a814ba174..1956919a044 100644 --- a/TriblerGUI/dialogs/startdownloaddialog.py +++ b/TriblerGUI/dialogs/startdownloaddialog.py @@ -33,7 +33,6 @@ def __init__(self, parent, download_uri): self.download_uri = download_uri self.has_metainfo = False - gui_settings = self.window().gui_settings uic.loadUi(get_ui_file_path('startdownloaddialog.ui'), self.dialog_widget) diff --git a/TriblerGUI/tribler_request_manager.py b/TriblerGUI/tribler_request_manager.py index c2bf7fd6ca2..84fbe2fb57c 100644 --- a/TriblerGUI/tribler_request_manager.py +++ b/TriblerGUI/tribler_request_manager.py @@ -273,7 +273,7 @@ def show_error(self, error_text): main_text, [('CLOSE', BUTTON_TYPE_NORMAL)]) def on_close(): - error_dialog.setParent(None) + error_dialog.close_dialog() error_dialog.button_clicked.connect(on_close) error_dialog.show() diff --git a/TriblerGUI/tribler_window.py b/TriblerGUI/tribler_window.py index f9584f0ccf1..dae463e9731 100644 --- a/TriblerGUI/tribler_window.py +++ b/TriblerGUI/tribler_window.py @@ -417,7 +417,7 @@ def on_new_version_dialog_done(self, version, action): import webbrowser webbrowser.open("https://tribler.org") - self.new_version_dialog.setParent(None) + self.new_version_dialog.close_dialog() self.new_version_dialog = None def on_search_text_change(self, text): @@ -557,8 +557,7 @@ def start_download_from_uri(self, uri): if get_gui_setting(self.gui_settings, "ask_download_settings", True, is_bool=True): # Clear any previous dialog if exists if self.dialog: - self.dialog.button_clicked.disconnect() - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None self.dialog = StartDownloadDialog(self, self.download_uri) @@ -596,7 +595,7 @@ def on_start_download_action(self, action): logging.exception("Error while trying to download. Either dialog or dialog.dialog_widget is None") self.dialog.request_mgr.cancel_request() # To abort the torrent info request - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None self.start_download_dialog_active = False @@ -630,7 +629,7 @@ def on_confirm_add_directory_dialog(self, action): self.tribler_settings['download_defaults']['saveas'], [], 0) if self.dialog: - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_add_torrent_from_url(self): @@ -651,7 +650,7 @@ def on_torrent_from_url_dialog_done(self, action): uri = self.dialog.dialog_widget.dialog_input.text() # Remove first dialog - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None if action == 0: diff --git a/TriblerGUI/widgets/createtorrentpage.py b/TriblerGUI/widgets/createtorrentpage.py index 174c5d1587c..dc06d8f79ba 100644 --- a/TriblerGUI/widgets/createtorrentpage.py +++ b/TriblerGUI/widgets/createtorrentpage.py @@ -94,7 +94,7 @@ def on_create_clicked(self): self.window().edit_channel_create_torrent_progress_label.show() def on_dialog_ok_clicked(self, _): - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_torrent_created(self, result): diff --git a/TriblerGUI/widgets/downloadspage.py b/TriblerGUI/widgets/downloadspage.py index 7f93ffa591e..411fc63499e 100644 --- a/TriblerGUI/widgets/downloadspage.py +++ b/TriblerGUI/widgets/downloadspage.py @@ -323,7 +323,7 @@ def on_remove_download_dialog(self, action): self.request_mgr.perform_request("downloads/%s" % infohash, self.on_download_removed, method='DELETE', data="remove_data=%d" % action) - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_download_removed(self, json_result): @@ -378,7 +378,7 @@ def on_export_download_dialog_done(self, action): self.request_mgr.download_file("downloads/%s/torrent" % self.selected_item.download_info['infohash'], lambda data: self.on_export_download_request_done(filename, data)) - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_export_download_request_done(self, filename, data): diff --git a/TriblerGUI/widgets/editchannelpage.py b/TriblerGUI/widgets/editchannelpage.py index 29364aea01d..301f81a1e60 100644 --- a/TriblerGUI/widgets/editchannelpage.py +++ b/TriblerGUI/widgets/editchannelpage.py @@ -275,7 +275,7 @@ def on_torrent_from_url_dialog_done(self, action): (self.channel_overview['identifier'], url), self.on_torrent_to_channel_added, method='PUT') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_torrent_to_channel_added(self, result): @@ -340,7 +340,7 @@ def on_playlist_torrent_remove_selected_action(self, item, action): result, item.torrent_info), method='DELETE') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_playlist_torrent_removed(self, result, torrent): @@ -431,7 +431,7 @@ def on_playlist_remove_selected_action(self, item, action): item.playlist_info['id']), self.on_playlist_removed, method='DELETE') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_playlist_removed(self, json_result): @@ -458,7 +458,7 @@ def on_torrents_remove_selected_action(self, action, items): infohash), self.on_torrent_removed, method='DELETE') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_torrent_removed(self, json_result): @@ -477,7 +477,7 @@ def on_torrents_remove_all_action(self, action): self.window().edit_channel_torrents_list.set_data_items([]) - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def clicked_tab_button(self, tab_button_name): @@ -516,7 +516,7 @@ def on_rss_feed_dialog_added(self, action): (self.channel_overview["identifier"], url), self.on_rss_feed_added, method='PUT') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_rss_feed_added(self, json_result): @@ -542,7 +542,7 @@ def on_rss_feed_dialog_removed(self, action): (self.channel_overview["identifier"], url), self.on_rss_feed_removed, method='DELETE') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_rss_feed_removed(self, json_result): diff --git a/TriblerGUI/widgets/marketorderspage.py b/TriblerGUI/widgets/marketorderspage.py index 82ae5d12077..947611f67bc 100644 --- a/TriblerGUI/widgets/marketorderspage.py +++ b/TriblerGUI/widgets/marketorderspage.py @@ -74,7 +74,7 @@ def on_confirm_cancel_order(self, action): self.request_mgr.perform_request("market/orders/%s/cancel" % self.selected_item.order['order_number'], self.on_order_cancelled, method='POST') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_order_cancelled(self, response): diff --git a/TriblerGUI/widgets/marketpage.py b/TriblerGUI/widgets/marketpage.py index 57e1e7f9fa8..a4c37c01409 100644 --- a/TriblerGUI/widgets/marketpage.py +++ b/TriblerGUI/widgets/marketpage.py @@ -244,7 +244,7 @@ def on_iom_input(self, action): self.request_mgr = TriblerRequestManager() self.request_mgr.perform_request("iominput", None, data=urlencode(post_data), method='POST') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def create_order(self, is_ask, price, price_type, quantity, quantity_type): @@ -333,7 +333,7 @@ def on_new_order_action(self, action): self.create_order(self.dialog.is_ask, self.dialog.price, self.dialog.price_type, self.dialog.quantity, self.dialog.quantity_type) - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_ask_timeout(self, ask): diff --git a/TriblerGUI/widgets/marketwalletspage.py b/TriblerGUI/widgets/marketwalletspage.py index fe39c9b8401..b556eaa2e97 100644 --- a/TriblerGUI/widgets/marketwalletspage.py +++ b/TriblerGUI/widgets/marketwalletspage.py @@ -178,7 +178,7 @@ def on_create_btc_wallet_dialog_done(self, action, wallet_id): password = self.dialog.dialog_widget.dialog_input.text() if action == 1: # Remove the dialog right now - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None elif action == 0: self.dialog.buttons[0].setEnabled(False) @@ -191,6 +191,6 @@ def on_create_btc_wallet_dialog_done(self, action, wallet_id): def on_wallet_created(self, response): if self.dialog: - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None self.load_wallets() diff --git a/TriblerGUI/widgets/settingspage.py b/TriblerGUI/widgets/settingspage.py index f0840fd33f4..abeda64aa88 100644 --- a/TriblerGUI/widgets/settingspage.py +++ b/TriblerGUI/widgets/settingspage.py @@ -429,5 +429,5 @@ def on_settings_saved(self, _): def on_dialog_cancel_clicked(self, _): self.window().settings_save_button.setEnabled(True) - self.saved_dialog.setParent(None) + self.saved_dialog.close_dialog() self.saved_dialog = None diff --git a/TriblerGUI/widgets/subscribedchannelspage.py b/TriblerGUI/widgets/subscribedchannelspage.py index 69e281592ee..8020f631038 100644 --- a/TriblerGUI/widgets/subscribedchannelspage.py +++ b/TriblerGUI/widgets/subscribedchannelspage.py @@ -57,7 +57,7 @@ def on_subscription_added(self, action): self.request_mgr.perform_request("channels/subscribed/%s" % self.dialog.dialog_widget.dialog_input.text(), self.on_channel_subscribed, method='PUT') - self.dialog.setParent(None) + self.dialog.close_dialog() self.dialog = None def on_channel_subscribed(self, _):