def _enqueue(self, fp, data, length, callback, queue, mask): fn = fp.fileno() io = OODict() io.fn = fn io.ctime = time.time() io.data = data io.length = length io.callback = callback io.done_cv = threading.Condition() io.done = False if fn not in self.io_queue: self.io_queue[fn] = OODict() self.io_queue[fn].fp = fp self.io_queue[fn].mask = 0 self.io_queue[fn].errs = 0 fp.setblocking(0) self.epoll.register(fn, self.io_queue[fn].mask) if queue not in self.io_queue[fn]: self.io_queue[fn][queue] = [] if self.io_queue[fn][queue]: self.io_queue[fn][queue].append(io) else: self.io_queue[fn][queue] = [io] self.io_queue[fn].mask |= mask self.epoll.modify(fn, self.io_queue[fn].mask) print queue, io return io
def load_chunk(self, chunk, dev): """Read chunk from device, return a chunk object @fid @cid @version @dev """ file = self._get_chunk_path(chunk, dev) if not os.path.isfile(file): raise IOError('chunk lost or stale') fp = open(file, 'r') try: header = OODict(eval(fp.read(CHUNK_HEADER_SIZE).strip('\x00'))) except: raise IOError('chunk header corrupt') if not header: raise IOError('chunk header corrupt') data = fp.read(header.size) if len(data) != header.size: raise IOError('chunk data lost') if header.algo == 'adler32' and zlib.adler32(data) != header.checksum: raise IOError('chunk data corrupt') if header.algo == 'sha1' and hashlib.sha1(data).hexdigest() != header.checksum: raise IOError('chunk data corrupt') fp.close() header.data = data return header