Skip to content
Snippets Groups Projects
Commit c726994c authored by ale's avatar ale
Browse files

stop using the global Stats singleton

parent 162960ae
Branches
No related tags found
No related merge requests found
...@@ -25,8 +25,10 @@ class StatsDumperThread(threading.Thread): ...@@ -25,8 +25,10 @@ class StatsDumperThread(threading.Thread):
class Stats(object): class Stats(object):
"""Thread-safe instrumentation.""" """Thread-safe instrumentation."""
def __init__(self): def __init__(self, path=None):
self._path = os.path.join(os.getenv('HOME'), '.djrandom.state') if not path:
path = os.path.expanduser('~/.djrandom.state')
self._path = path
self._data = {} self._data = {}
self._lock = threading.Lock() self._lock = threading.Lock()
if os.path.exists(self._path): if os.path.exists(self._path):
...@@ -55,6 +57,3 @@ class Stats(object): ...@@ -55,6 +57,3 @@ class Stats(object):
with self._lock: with self._lock:
self._data[key] = value self._data[key] = value
# Global instance.
data = Stats()
...@@ -60,12 +60,14 @@ class FileDatabase(object): ...@@ -60,12 +60,14 @@ class FileDatabase(object):
class Uploader(threading.Thread): class Uploader(threading.Thread):
def __init__(self, server_url, api_key, db=None): def __init__(self, server_url, api_key, db_path=None,
state_path=None):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.api_key = api_key self.api_key = api_key
self.server_url = server_url self.server_url = server_url
self.queue = Queue.Queue(100) self.queue = Queue.Queue(100)
self.db_path = db self.db_path = db_path
self.stats = stats.Stats(state_path)
self.opener = urllib2.build_opener(throttle.ThrottledHTTPHandler) self.opener = urllib2.build_opener(throttle.ThrottledHTTPHandler)
user_agent = 'djrandom_client/%s (%s %s Python/%s)' % ( user_agent = 'djrandom_client/%s (%s %s Python/%s)' % (
...@@ -104,34 +106,35 @@ class Uploader(threading.Thread): ...@@ -104,34 +106,35 @@ class Uploader(threading.Thread):
result = self._get('/check/' + sha1) result = self._get('/check/' + sha1)
if result: if result:
log.info('%s already on server (%s)' % (path, sha1)) log.info('%s already on server (%s)' % (path, sha1))
return True return
result = self._put('/upload/' + sha1, path) result = self._put('/upload/' + sha1, path)
if not result: if not result:
raise UploadError('error uploading %s' % path) raise UploadError('server error')
stats.data.incr('uploaded_files') self.stats.incr('uploaded_files')
log.info('successfully uploaded %s (%s)' % (path, sha1)) log.info('successfully uploaded %s (%s)' % (path, sha1))
def run(self): def run(self):
db = FileDatabase(self.db_path) db = FileDatabase(self.db_path)
try: try:
while True: while True:
stats.data.set('uploading', None) self.stats.set('uploading', None)
path = self.queue.get() path = self.queue.get()
if path is None: if path is None:
break break
if db.has(path): if db.has(path):
continue continue
stats.data.set('uploading', path) self.stats.set('uploading', path)
try: try:
self.upload(path) self.upload(path)
db.add(path) db.add(path)
except Exception, e: except Exception, e:
log.error('error uploading %s: %s' % (path, str(e))) log.error('error uploading %s: %s' % (path, str(e)))
stats.data.incr('errors') self.stats.incr('errors')
stats.data.set('last_error', str(e)) self.stats.set('last_error', str(e))
stats.data.set('last_error_timestamp', '%i' % time.time()) self.stats.set('last_error_timestamp', '%i' % time.time())
finally: finally:
log.debug('uploader thread exiting') log.debug('uploader thread exiting')
self.stats._save()
db.close() db.close()
def stop(self): def stop(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment