From: Cameron Dale Date: Thu, 17 Apr 2008 19:57:18 +0000 (-0700) Subject: Delay the creation of files until after the application has finished loading. X-Git-Url: https://git.mxchange.org/?p=quix0rs-apt-p2p.git;a=commitdiff_plain;h=e848bee6cd8bd9ba754a21c3aff835f86d9c1aee Delay the creation of files until after the application has finished loading. --- diff --git a/apt-p2p.py b/apt-p2p.py index adbc7bd..277cd76 100644 --- a/apt-p2p.py +++ b/apt-p2p.py @@ -58,32 +58,32 @@ try: except: uid,gid = None,None -log.msg('Starting application') +log.msg('Starting application with uid/gid %r/%r' % (uid, gid)) application = service.Application("apt-p2p", uid, gid) #print service.IProcess(application).processName #service.IProcess(application).processName = 'apt-p2p' -log.msg('Starting DHT') DHT = __import__(config.get('DEFAULT', 'DHT')+'.DHT', globals(), locals(), ['DHT']) assert IDHT.implementedBy(DHT.DHT), "You must provide a DHT implementation that implements the IDHT interface." if not config.getboolean('DEFAULT', 'DHT-only'): log.msg('Starting main application server') from apt_p2p.apt_p2p import AptP2P - myapp = AptP2P(DHT.DHT) - factory = myapp.getHTTPFactory() + factory = AptP2P(DHT.DHT) s = strports.service('tcp:'+config.get('DEFAULT', 'port'), factory) s.setServiceParent(application) else: + log.msg('Starting the DHT') myDHT = DHT.DHT() + if IDHTStatsFactory.implementedBy(DHT.DHT): log.msg("Starting the DHT's HTTP stats displayer") factory = myDHT.getStatsFactory() s = strports.service('tcp:'+config.get('DEFAULT', 'port'), factory) s.setServiceParent(application) - myDHT.loadConfig(config, config.get('DEFAULT', 'DHT')) - myDHT.join() + reactor.callLater(0, myDHT.loadConfig, config, config.get('DEFAULT', 'DHT')) + reactor.callLater(0, myDHT.join) if __name__ == '__main__': # Run on command line diff --git a/apt_p2p/apt_p2p.py b/apt_p2p/apt_p2p.py index 4200f62..af7790a 100644 --- a/apt_p2p/apt_p2p.py +++ b/apt_p2p/apt_p2p.py @@ -14,7 +14,7 @@ from urlparse import urlunparse from urllib import unquote import os, re, sha -from twisted.internet import defer, reactor +from twisted.internet import defer, reactor, protocol from twisted.web2 import server, http, http_headers, static from twisted.python import log, failure from twisted.python.filepath import FilePath @@ -36,7 +36,7 @@ TORRENT_PIECES = 70 download_dir = 'cache' peer_dir = 'peers' -class AptP2P: +class AptP2P(protocol.Factory): """The main code object that does all of the work. Contains all of the sub-components that do all the low-level work, and @@ -75,29 +75,40 @@ class AptP2P: """ log.msg('Initializing the main apt_p2p application') self.dhtClass = dhtClass + + #{ Factory interface + def startFactory(self): + reactor.callLater(0, self._startFactory) + + def _startFactory(self): + log.msg('Starting the main apt_p2p application') self.cache_dir = FilePath(config.get('DEFAULT', 'CACHE_DIR')) if not self.cache_dir.child(download_dir).exists(): self.cache_dir.child(download_dir).makedirs() if not self.cache_dir.child(peer_dir).exists(): self.cache_dir.child(peer_dir).makedirs() self.db = DB(self.cache_dir.child('apt-p2p.db')) - self.dht = dhtClass() + self.dht = self.dhtClass() self.dht.loadConfig(config, config.get('DEFAULT', 'DHT')) self.dht.join().addCallbacks(self.joinComplete, self.joinError) self.stats = StatsLogger(self.db) self.http_server = TopLevel(self.cache_dir.child(download_dir), self.db, self) - self.getHTTPFactory = self.http_server.getHTTPFactory + self.http_server.getHTTPFactory().startFactory() self.peers = PeerManager(self.cache_dir.child(peer_dir), self.dht, self.stats) self.mirrors = MirrorManager(self.cache_dir) self.cache = CacheManager(self.cache_dir.child(download_dir), self.db, self) self.my_contact = None - reactor.addSystemEventTrigger('before', 'shutdown', self.shutdown) - - #{ Maintenance - def shutdown(self): + + def stopFactory(self): + log.msg('Stoppping the main apt_p2p application') + self.http_server.getHTTPFactory().stopFactory() self.stats.save() self.db.close() + + def buildProtocol(self, addr): + return self.http_server.getHTTPFactory().buildProtocol(addr) + #{ DHT Maintenance def joinComplete(self, result): """Complete the DHT join process and determine our download information.