Track and stop site connected greenlets on delete

This commit is contained in:
shortcutme 2019-11-19 02:07:51 +01:00
parent 2ad3493fb0
commit 1c607645c7
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
6 changed files with 51 additions and 16 deletions

View file

@ -22,6 +22,7 @@ from .SiteStorage import SiteStorage
from Crypt import CryptHash
from util import helper
from util import Diff
from util import GreenletManager
from Plugin import PluginManager
from File import FileServer
from .SiteAnnouncer import SiteAnnouncer
@ -43,6 +44,7 @@ class Site(object):
self.peers = {} # Key: ip:port, Value: Peer.Peer
self.peers_recent = collections.deque(maxlen=100)
self.peer_blacklist = SiteManager.peer_blacklist # Ignore this peers (eg. myself)
self.greenlet_manager = GreenletManager.GreenletManager() # Running greenlets
self.worker_manager = WorkerManager(self) # Handle site download from other peers
self.bad_files = {} # SHA check failed files, need to redownload {"inner.content": 1} (key: file, value: failed accept)
self.content_updated = None # Content.js update time
@ -1026,14 +1028,21 @@ class Site(object):
return self.settings.get("autodownloadoptional")
def delete(self):
self.log.debug("Deleting site...")
s = time.time()
self.settings["serving"] = False
self.saveSettings()
num_greenlets = self.greenlet_manager.stopGreenlets("Site %s deleted" % self.address)
self.worker_manager.running = False
self.worker_manager.stopWorkers()
self.storage.deleteFiles()
self.updateWebsocket(deleted=True)
self.content_manager.contents.db.deleteSite(self)
num_workers = self.worker_manager.stopWorkers()
SiteManager.site_manager.delete(self.address)
self.content_manager.contents.db.deleteSite(self)
self.updateWebsocket(deleted=True)
self.storage.deleteFiles()
self.log.debug(
"Deleted site in %.3fs (greenlets: %s, workers: %s)" %
(time.time() - s, num_greenlets, num_workers)
)
# - Events -

View file

@ -95,7 +95,7 @@ class SiteAnnouncer(object):
if config.verbose:
self.site.log.debug("Tracker %s looks unreliable, announce skipped (error: %s)" % (tracker, tracker_stats["num_error"]))
continue
thread = gevent.spawn(self.announceTracker, tracker, mode=mode)
thread = self.site.greenlet_manager.spawn(self.announceTracker, tracker, mode=mode)
threads.append(thread)
thread.tracker = tracker
@ -135,7 +135,7 @@ class SiteAnnouncer(object):
self.site.log.error("Announce to %s trackers in %.3fs, failed" % (len(threads), time.time() - s))
if len(threads) == 1 and mode != "start": # Move to next tracker
self.site.log.debug("Tracker failed, skipping to next one...")
gevent.spawn_later(1.0, self.announce, force=force, mode=mode, pex=pex)
self.site.greenlet_manager.spawnLater(1.0, self.announce, force=force, mode=mode, pex=pex)
self.updateWebsocket(trackers="announced")