def test_FindEmptyLocation_CalledWithMultipleValues_ReturnsFirstLargeEnoughEntry(self): logs = {(1,2) : "log1", (4,5) : "log2", (8,10) : "log3"} logbuff = LogBuffer(mock.Mock(iosize=10), logs) self.assertEquals(logbuff.getunallocated(), [(0, 1), (2, 4), (5, 8)]) self.assertEquals(logbuff.find_empty_location(1), 0) self.assertEquals(logbuff.find_empty_location(2), 2) self.assertEquals(logbuff.find_empty_location(3), 5)
def test_FindEmptyLocation_CalledWithMultipleValues_ReturnsFirstLargeEnoughEntry( self): logs = {(1, 2): "log1", (4, 5): "log2", (8, 10): "log3"} logbuff = LogBuffer(mock.Mock(iosize=10), logs) self.assertEquals(logbuff.getunallocated(), [(0, 1), (2, 4), (5, 8)]) self.assertEquals(logbuff.find_empty_location(1), 0) self.assertEquals(logbuff.find_empty_location(2), 2) self.assertEquals(logbuff.find_empty_location(3), 5)
def test_load_WhenCalledWithLogIndexAndBufferReader_WriteLogsAreCorrectlyAssigned(self): logbuffer_reader = mock.Mock(read_entry = lambda pos: {0: ("log1", 1), 10: ("log2", 5)}[pos]) logindex = mock.Mock(tocommit = [ LogIndexEntry(LogIndexEntry.WRITE, 0), LogIndexEntry(LogIndexEntry.WRITE, 10)]) logbuff = LogBuffer.load(logindex, logbuffer_reader) self.assertEquals(logbuff.writelogs, {(0, 1) : "log1", (10, 15): "log2"})
def test_load_WhenCalledWithLogIndexAndBufferReader_WriteLogsAreCorrectlyAssigned( self): logbuffer_reader = mock.Mock(read_entry=lambda pos: { 0: ("log1", 1), 10: ("log2", 5) }[pos]) logindex = mock.Mock(tocommit=[ LogIndexEntry(LogIndexEntry.WRITE, 0), LogIndexEntry(LogIndexEntry.WRITE, 10) ]) logbuff = LogBuffer.load(logindex, logbuffer_reader) self.assertEquals(logbuff.writelogs, { (0, 1): "log1", (10, 15): "log2" })
def test_1(self): IO_SIZE = 1000 BUFFER_SIZE = 1000 INDEX_COUNT = 20 io = IoHandle.using_stringio(BUFFER_SIZE) buffer_reader = LogBufferReader(io, BUFFER_SIZE) logbuffer = LogBuffer(buffer_reader) io = IoHandle.using_stringio( LogIndexEntrySerializer.SERIALIZED_LENGTH * INDEX_COUNT) logindex_reader = LogIndexReader(io, INDEX_COUNT) logindex = SerializedLogIndex.new(logindex_reader) io = MultiChunkIO.using_stringios({0: IO_SIZE}) log = TransactionalChunkFile(io, logindex, logbuffer, 1, 2) log.start_transaction() log.write(0, 3, "hello test") log.write(0, 12, "hello blog")
def load(cls, io): chunkfile = ChunkFile.open(io) _, logindexheader, logindexio = ChunkIO.from_name(chunkfile, LOG_INDEX_NAME) _, logbufferheader, logbufferio = ChunkIO.from_name(chunkfile, LOG_BUFFER_NAME) logindex_reader = LogIndexReader(logindexio, logindexheader.length/LogIndexEntrySerializer.SERIALIZED_LENGTH) logindex = SerializedLogIndex.load(logindex_reader) logbuffer_reader = LogBufferReader(logbufferio, logbufferheader.length) logbuffer = LogBuffer.load(logindex, logbuffer_reader) txlog = TransactionLog(chunkfile, logindex, logbuffer) outpointchunk, outpointchunkheader = chunkfile.get_chunk(OUTPOINTS_NAME) outpoint_io = TransactionalIO(txlog, outpointchunk) outpoint_reader = OutpointIndexReader(outpoint_io, outpointchunkheader.length) outpoints = SerializedItemSet.load(outpoint_reader) return cls(txlog, outpoints)
def new(cls, io): IO_SIZE = 1000 BUFFER_SIZE = 10000 INDEX_COUNT = 50 OUTPOINTS_SIZE = 1000 fileheader = FileHeader() io.write(FileHeaderSerializer.serialize(fileheader)) #write chunks chunkfile = ChunkFile(io) chunkfile.append_chunk( LOG_INDEX_NAME, INDEX_COUNT * LogIndexEntrySerializer.SERIALIZED_LENGTH) chunkfile.append_chunk(LOG_BUFFER_NAME, BUFFER_SIZE) chunkfile.append_chunk(OUTPOINTS_NAME, OUTPOINTS_SIZE) #Load log index and log buffer _, _logindexheader, logindexio = chunkfile.open_chunk(LOG_INDEX_NAME) logindex_reader = LogIndexReader(logindexio, INDEX_COUNT) logindex = SerializedLogIndex.new(logindex_reader) _, logbufferheader, logbufferio = chunkfile.open_chunk(LOG_BUFFER_NAME) buffer_reader = LogBufferReader(logbufferio, logbufferheader.length) logbuffer = LogBuffer(buffer_reader) # format other chunks ( not transactionally) _, outpointsheader, outpointsio = chunkfile.open_chunk(OUTPOINTS_NAME) outpoint_dict = SerializedDict.new(outpointsio, outpointsheader.length, serializer=OutpointIndexSerializer) SerializedItemSet.load(outpoint_dict) # txlog = TransactionLog(chunkfile, logindex, logbuffer) outpointchunk, outpointchunkheader = chunkfile.get_chunk( OUTPOINTS_NAME) outpoint_io = TransactionalIO(txlog, outpointchunk) outpoint_reader = SerializedDict.load(outpoint_io, OUTPOINTS_SIZE, OutpointIndexSerializer) outpoints = SerializedItemSet.load(outpoint_reader) return cls(txlog, outpoints)
def load(cls, io): chunkfile = ChunkFile.open(io) _, logindexheader, logindexio = ChunkIO.from_name( chunkfile, LOG_INDEX_NAME) _, logbufferheader, logbufferio = ChunkIO.from_name( chunkfile, LOG_BUFFER_NAME) logindex_reader = LogIndexReader( logindexio, logindexheader.length / LogIndexEntrySerializer.SERIALIZED_LENGTH) logindex = SerializedLogIndex.load(logindex_reader) logbuffer_reader = LogBufferReader(logbufferio, logbufferheader.length) logbuffer = LogBuffer.load(logindex, logbuffer_reader) txlog = TransactionLog(chunkfile, logindex, logbuffer) outpointchunk, outpointchunkheader = chunkfile.get_chunk( OUTPOINTS_NAME) outpoint_io = TransactionalIO(txlog, outpointchunk) outpoint_reader = OutpointIndexReader(outpoint_io, outpointchunkheader.length) outpoints = SerializedItemSet.load(outpoint_reader) return cls(txlog, outpoints)
def test_getunallocated_WithMultipleLogs_ReturnsSpaceBetweenLogs(self): logs = {(10,20) : "log1", (30,40) : "log2", (70,99) : "log3"} logbuff = LogBuffer(mock.Mock(iosize=100), logs) self.assertEquals(logbuff.getunallocated(), [(0, 10), (20, 30), (40, 70), (99, 100)])
def test_getunallocated_WithTwoLogsWithSpaceInbetween_ReturnsSpaceBetweenLogs(self): logs = {(0,1) : "log1", (2,3) : "log2"} logbuff = LogBuffer(mock.Mock(iosize=3), logs) self.assertEquals(logbuff.getunallocated(), [(1, 2)])
def test_getunallocated_WithTwoLogsTakingAllSpace_ReturnsEmpty(self): logs = {(0,1) : "log1", (1,2) : "log2"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [])
def test_getunallocated_WithOneLogEndingAtBufferSize_ReturnsOnlyOneRangeAtTheBeginning(self): logs = {(1,2) : "log1"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [(0, 1)])
def test_getunallocated_WithOneLogStartingAtBegining_ReturnsOnlyOneRangeAtTheEnd(self): logs = {(0,1) : "log1"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [(1, 2)])
def test_getunallocated_WithEmptyWriteLogs_ReturnsZeroToBufferSize(self): writelogs = {} logbuff = LogBuffer(mock.Mock(iosize=100), writelogs) self.assertEquals(logbuff.getunallocated(), [(0, 100)])
def test_getunallocated_WithEmptyWriteLogs_ReturnsZeroToBufferSize(self): writelogs = {} logbuff = LogBuffer(mock.Mock(iosize=100), writelogs) self.assertEquals(logbuff.getunallocated(), [(0, 100)])
def test_getunallocated_WithMultipleLogs_ReturnsSpaceBetweenLogs(self): logs = {(10, 20): "log1", (30, 40): "log2", (70, 99): "log3"} logbuff = LogBuffer(mock.Mock(iosize=100), logs) self.assertEquals(logbuff.getunallocated(), [(0, 10), (20, 30), (40, 70), (99, 100)])
def test_getunallocated_WithTwoLogsWithSpaceInbetween_ReturnsSpaceBetweenLogs( self): logs = {(0, 1): "log1", (2, 3): "log2"} logbuff = LogBuffer(mock.Mock(iosize=3), logs) self.assertEquals(logbuff.getunallocated(), [(1, 2)])
def test_getunallocated_WithTwoLogsTakingAllSpace_ReturnsEmpty(self): logs = {(0, 1): "log1", (1, 2): "log2"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [])
def test_getunallocated_WithOneLogEndingAtBufferSize_ReturnsOnlyOneRangeAtTheBeginning( self): logs = {(1, 2): "log1"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [(0, 1)])
def test_getunallocated_WithOneLogStartingAtBegining_ReturnsOnlyOneRangeAtTheEnd( self): logs = {(0, 1): "log1"} logbuff = LogBuffer(mock.Mock(iosize=2), logs) self.assertEquals(logbuff.getunallocated(), [(1, 2)])