X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=cleaner%2Fcleaner;h=c4b1222cbea619460f733d2dc78642345bb63237;hb=bf1b396c85d03f9c16eee6cd84c71c82503c3ec4;hp=95bbb08c4ac01e98ebaad135487e9c7f567240f5;hpb=c1f4367b3c65b01562bc6484226dff0135cd4780;p=bluesky.git diff --git a/cleaner/cleaner b/cleaner/cleaner index 95bbb08..c4b1222 100755 --- a/cleaner/cleaner +++ b/cleaner/cleaner @@ -8,7 +8,7 @@ # Copyright (C) 2010 The Regents of the University of California # Written by Michael Vrable -import base64, os, re, struct, sys +import base64, os, re, struct, sys, time import boto from boto.s3.key import Key @@ -67,15 +67,31 @@ class FileBackend: m = re.match(r"^log-(\d+)-(\d+)$", name) if m: return (int(m.group(1)), int(m.group(2))) +def retry_wrap(method): + def wrapped(self, *args, **kwargs): + for retries in range(3): + try: + return method(self, *args, **kwargs) + except: + print >>sys.stderr, "S3 operation failed, retrying..." + self.connect() + time.sleep(1.0) + return method(self, *args, **kwargs) + return wrapped + class S3Backend: """An interface to BlueSky where the log segments are on in Amazon S3.""" def __init__(self, bucket, path='', cachedir="."): - self.conn = boto.connect_s3(is_secure=False) - self.bucket = self.conn.get_bucket(bucket) + self.bucket_name = bucket self.path = path self.cachedir = cachedir self.cache = {} + self.connect() + + def connect(self): + self.conn = boto.connect_s3(is_secure=False) + self.bucket = self.conn.get_bucket(self.bucket_name) def list(self): files = [] @@ -83,6 +99,7 @@ class S3Backend: files.append((k.key, k.size)) return files + @retry_wrap def read(self, filename, offset=0, length=None): if filename in self.cache: fp = open(os.path.join(self.cachedir, filename), 'rb') @@ -106,6 +123,7 @@ class S3Backend: data = data[0:length] return data + @retry_wrap def write(self, filename, data): k = Key(self.bucket) k.key = self.path + filename @@ -113,6 +131,7 @@ class S3Backend: if filename in self.cache: del self.cache[filename] + @retry_wrap def delete(self, filename): k = Key(self.bucket) k.key = self.path + filename