Search in sources :

Example 6 with BlockInfoEntry

use of alluxio.proto.journal.Block.BlockInfoEntry in project alluxio by Alluxio.

the class DefaultBlockMaster method commitBlockInUFS.

@Override
public void commitBlockInUFS(long blockId, long length) throws UnavailableException {
    LOG.debug("Commit block in ufs. blockId: {}, length: {}", blockId, length);
    try (JournalContext journalContext = createJournalContext();
        LockResource r = lockBlock(blockId)) {
        if (mBlockStore.getBlock(blockId).isPresent()) {
            // Block metadata already exists, so do not need to create a new one.
            return;
        }
        mBlockStore.putBlock(blockId, BlockMeta.newBuilder().setLength(length).build());
        BlockInfoEntry blockInfo = BlockInfoEntry.newBuilder().setBlockId(blockId).setLength(length).build();
        journalContext.append(JournalEntry.newBuilder().setBlockInfo(blockInfo).build());
    }
}
Also used : LockResource(alluxio.resource.LockResource) JournalContext(alluxio.master.journal.JournalContext) BlockInfoEntry(alluxio.proto.journal.Block.BlockInfoEntry)

Example 7 with BlockInfoEntry

use of alluxio.proto.journal.Block.BlockInfoEntry in project alluxio by Alluxio.

the class BlockMaster method commitBlock.

/**
   * Marks a block as committed on a specific worker.
   *
   * @param workerId the worker id committing the block
   * @param usedBytesOnTier the updated used bytes on the tier of the worker
   * @param tierAlias the alias of the storage tier where the worker is committing the block to
   * @param blockId the committing block id
   * @param length the length of the block
   * @throws NoWorkerException if the workerId is not active
   */
// TODO(binfan): check the logic is correct or not when commitBlock is a retry
public void commitBlock(long workerId, long usedBytesOnTier, String tierAlias, long blockId, long length) throws NoWorkerException {
    LOG.debug("Commit block from workerId: {}, usedBytesOnTier: {}, blockId: {}, length: {}", workerId, usedBytesOnTier, blockId, length);
    MasterWorkerInfo worker = mWorkers.getFirstByField(ID_INDEX, workerId);
    // TODO(peis): Check lost workers as well.
    if (worker == null) {
        throw new NoWorkerException(ExceptionMessage.NO_WORKER_FOUND.getMessage(workerId));
    }
    // Lock the worker metadata first.
    try (JournalContext journalContext = createJournalContext()) {
        synchronized (worker) {
            // Loop until block metadata is successfully locked.
            while (true) {
                boolean newBlock = false;
                MasterBlockInfo block = mBlocks.get(blockId);
                if (block == null) {
                    // The block metadata doesn't exist yet.
                    block = new MasterBlockInfo(blockId, length);
                    newBlock = true;
                }
                // Lock the block metadata.
                synchronized (block) {
                    boolean writeJournal = false;
                    if (newBlock) {
                        if (mBlocks.putIfAbsent(blockId, block) != null) {
                            // Another thread already inserted the metadata for this block, so start loop over.
                            continue;
                        }
                        // Successfully added the new block metadata. Append a journal entry for the new
                        // metadata.
                        writeJournal = true;
                    } else if (block.getLength() != length && block.getLength() == Constants.UNKNOWN_SIZE) {
                        // The block size was previously unknown. Update the block size with the committed
                        // size, and append a journal entry.
                        block.updateLength(length);
                        writeJournal = true;
                    }
                    if (writeJournal) {
                        BlockInfoEntry blockInfo = BlockInfoEntry.newBuilder().setBlockId(blockId).setLength(length).build();
                        appendJournalEntry(JournalEntry.newBuilder().setBlockInfo(blockInfo).build(), journalContext);
                    }
                    // At this point, both the worker and the block metadata are locked.
                    // Update the block metadata with the new worker location.
                    block.addWorker(workerId, tierAlias);
                    // This worker has this block, so it is no longer lost.
                    mLostBlocks.remove(blockId);
                    // Update the worker information for this new block.
                    // TODO(binfan): when retry commitBlock on master is expected, make sure metrics are not
                    // double counted.
                    worker.addBlock(blockId);
                    worker.updateUsedBytes(tierAlias, usedBytesOnTier);
                    worker.updateLastUpdatedTimeMs();
                }
                break;
            }
        }
    }
}
Also used : NoWorkerException(alluxio.exception.NoWorkerException) MasterBlockInfo(alluxio.master.block.meta.MasterBlockInfo) MasterWorkerInfo(alluxio.master.block.meta.MasterWorkerInfo) BlockInfoEntry(alluxio.proto.journal.Block.BlockInfoEntry)

Example 8 with BlockInfoEntry

use of alluxio.proto.journal.Block.BlockInfoEntry in project alluxio by Alluxio.

the class DefaultBlockMaster method commitBlock.

// TODO(binfan): check the logic is correct or not when commitBlock is a retry
@Override
public void commitBlock(long workerId, long usedBytesOnTier, String tierAlias, String mediumType, long blockId, long length) throws NotFoundException, UnavailableException {
    LOG.debug("Commit block from workerId: {}, usedBytesOnTier: {}, blockId: {}, length: {}", workerId, usedBytesOnTier, blockId, length);
    MasterWorkerInfo worker = mWorkers.getFirstByField(ID_INDEX, workerId);
    // TODO(peis): Check lost workers as well.
    if (worker == null) {
        throw new NotFoundException(ExceptionMessage.NO_WORKER_FOUND.getMessage(workerId));
    }
    try (JournalContext journalContext = createJournalContext()) {
        // The worker metadata must be locked before the blocks
        try (LockResource lr = worker.lockWorkerMeta(EnumSet.of(WorkerMetaLockSection.USAGE, WorkerMetaLockSection.BLOCKS), false)) {
            try (LockResource r = lockBlock(blockId)) {
                Optional<BlockMeta> block = mBlockStore.getBlock(blockId);
                if (!block.isPresent() || block.get().getLength() != length) {
                    if (block.isPresent() && block.get().getLength() != Constants.UNKNOWN_SIZE) {
                        LOG.warn("Rejecting attempt to change block length from {} to {}", block.get().getLength(), length);
                    } else {
                        mBlockStore.putBlock(blockId, BlockMeta.newBuilder().setLength(length).build());
                        BlockInfoEntry blockInfo = BlockInfoEntry.newBuilder().setBlockId(blockId).setLength(length).build();
                        journalContext.append(JournalEntry.newBuilder().setBlockInfo(blockInfo).build());
                    }
                }
                // Update the block metadata with the new worker location.
                mBlockStore.addLocation(blockId, BlockLocation.newBuilder().setWorkerId(workerId).setTier(tierAlias).setMediumType(mediumType).build());
                // This worker has this block, so it is no longer lost.
                mLostBlocks.remove(blockId);
                // Update the worker information for this new block.
                // TODO(binfan): when retry commitBlock on master is expected, make sure metrics are not
                // double counted.
                worker.addBlock(blockId);
                worker.updateUsedBytes(tierAlias, usedBytesOnTier);
            }
        }
        worker.updateLastUpdatedTimeMs();
    }
}
Also used : LockResource(alluxio.resource.LockResource) JournalContext(alluxio.master.journal.JournalContext) MasterWorkerInfo(alluxio.master.block.meta.MasterWorkerInfo) NotFoundException(alluxio.exception.status.NotFoundException) BlockMeta(alluxio.proto.meta.Block.BlockMeta) BlockInfoEntry(alluxio.proto.journal.Block.BlockInfoEntry)

Aggregations

BlockInfoEntry (alluxio.proto.journal.Block.BlockInfoEntry)8 MasterBlockInfo (alluxio.master.block.meta.MasterBlockInfo)4 MasterWorkerInfo (alluxio.master.block.meta.MasterWorkerInfo)2 JournalContext (alluxio.master.journal.JournalContext)2 BlockMeta (alluxio.proto.meta.Block.BlockMeta)2 LockResource (alluxio.resource.LockResource)2 NoWorkerException (alluxio.exception.NoWorkerException)1 NotFoundException (alluxio.exception.status.NotFoundException)1 Block (alluxio.master.metastore.BlockStore.Block)1 JournalEntry (alluxio.proto.journal.Journal.JournalEntry)1 CloseableIterator (alluxio.resource.CloseableIterator)1 IOException (java.io.IOException)1 Iterator (java.util.Iterator)1 NoSuchElementException (java.util.NoSuchElementException)1