def brelse(self, buffer): # Todo: wakeup all processes (event: waiting for any buffer to become free; self.eventBus.wake(EventBus.EVENT_WAIT_ANY_BUFFER) # Todo: wakeup all processes (event: waiting for this buffer to become free; self.eventBus.wake(EventBus.EVENT_WAIT_SPECIFIC_BUFFER(buffer)) # raise processor execution level to block interrupts; if buffer.isDataValid() and not buffer.isOld(): # enqueue buffer at end of free list; self.bufferCache.freeList.push(buffer) else: # enqueue buffer at beginning of free list; self.bufferCache.freeList.unshift(buffer) # lower processor execution level to allow interrupts; buffer.unlock() return buffer
def getblk(self, blockNumber): """ getblk algo from textbook """ while (True): if self.bufferCache.hashQueue.has(blockNumber): buffer = self.bufferCache.hashQueue.get(blockNumber) if buffer.isLocked(): logger.info( f'getblk(): accessing |Block:{blockNumber}|, resulted in "Scenario 5"' ) # logger.info("Scenario 5: Block was found on the hash queue, but its buffer is currently busy.") # sleep until this buffer becomes free self.eventBus.sleep( EventBus.EVENT_WAIT_SPECIFIC_BUFFER(buffer)) self.eventBus.clear( EventBus.EVENT_WAIT_SPECIFIC_BUFFER(buffer)) continue # Scenario 1 buffer.lock() self.bufferCache.freeList.remove(buffer) logger.info( f'getblk(): accessing |Block:{blockNumber}|, resulted in "Scenario 1"' ) # logger.info("Scenario 1: Block is found on its hash queue and its buffer is free.") return buffer #block found on hashQ else: if self.bufferCache.freeList.isEmpty(): logger.info( f'getblk(): accessing |Block:{blockNumber}|, resulted in "Scenario 4"' ) # logger.info('Scenario 4: Block could not be found on the hash queue and the free list of buffers is empty.') # Sleep until any buffer becomes free self.eventBus.sleep(EventBus.EVENT_WAIT_ANY_BUFFER) self.eventBus.clear(EventBus.EVENT_WAIT_ANY_BUFFER) continue else: buffer = self.bufferCache.freeList.pop() # Scenario 3 if buffer.isDelayedWrite(): logger.info( f'getblk(): accessing |Block:{blockNumber}|, resulted in "Scenario 3"' ) # write buffer asynchronously to the disk self.bwrite(buffer, synchronous=False) continue buffer.lock() logger.info( f'getblk(): accessing |Block:{blockNumber}|, resulted in "Scenario 2"' ) # logger.info("Scenario 2: Buffer not found on hash queue but a buffer from free list is assigned") if buffer.blockNumber: self.bufferCache.hashQueue.remove(buffer) logger.debug( f'REMOVE BUFFER{buffer} - UPDATED HASH QUEUE:{self.bufferCache.hashQueue}' ) buffer.updateBlockNumber(blockNumber) self.bufferCache.hashQueue.add(buffer) return buffer # block not in hashQ, taken from freelist time.sleep(.5)