Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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)