| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_COMPRESSED_BLOCK_COLLECTION_H_ |
| #define ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_COMPRESSED_BLOCK_COLLECTION_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <zircon/errors.h> |
| #include <zircon/types.h> |
| |
| #include <memory> |
| |
| #include <blobfs/format.h> |
| #include <blobfs/node-finder.h> |
| #include <fs/transaction/legacy_transaction_handler.h> |
| #include <storage/buffer/owned_vmoid.h> |
| #include <storage/buffer/vmoid_registry.h> |
| #include <zstd/zstd_seekable.h> |
| |
| #include "allocator/allocator.h" |
| #include "iterator/block-iterator-provider.h" |
| #include "iterator/block-iterator.h" |
| |
| namespace blobfs { |
| |
| // Interface for reading contiguous blocks of data from a compressed blob. Offsets are relative to |
| // the start of the data blocks of the blob (i.e. the merkle blocks are skipped). Each |
| // implementation defines its own contract for where data that is read will be stored and how long |
| // it is guaranteed to be valid. This style of contract allows implementations and their clients to |
| // minimize copying. |
| // |
| // This interface is separated from the concrete implementation below to make testing easier. |
| class ZSTDCompressedBlockCollection { |
| public: |
| ZSTDCompressedBlockCollection() = default; |
| virtual ~ZSTDCompressedBlockCollection() = default; |
| DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(ZSTDCompressedBlockCollection); |
| |
| // Load exactly |block_offset| through |block_offset + num_blocks - 1| blocks into memory. Each |
| // implementation defines its own contract for where data that is read will be stored and how long |
| // it is guaranteed to be valid. The value of data in |buf| is expected to be valid if and only if |
| // the return value is |ZX_OK|. |
| virtual zx_status_t Read(uint32_t data_block_offset, uint32_t num_blocks) = 0; |
| }; |
| |
| // ZSTDCompressedBlockCollectionImpl is a |ZSTDCompressedBlockCollection| encoded using the ZSTD |
| // Seekable Format. Reads are copied to the beginning of the VMO referred to by |vmoid_| and remain |
| // valid until the next |ZSTDCompressedBlockCollectionImpl.Read()| that uses the same VMO. |
| // |
| // https://github.com/facebook/zstd/blob/dev/contrib/seekable_format/zstd_seekable_compression_format.md. |
| class ZSTDCompressedBlockCollectionImpl : public ZSTDCompressedBlockCollection { |
| public: |
| // Construct a ZSTD-backed block collection with the following assumptions: |
| // |
| // - |vmoid| is the ID registered with the block device; |
| // - |space_manager| is bound to the filesystem's superblock metadata; |
| // - |txn_handler| is bound to the block device that registered |vmoid|; |
| // - |node_finder| tracks this blob by |node_index|; |
| // - |num_merkle_blocks| is the number of merkle blocks in this blob. |
| // - All raw pointer input parameters will remain valid for the lifetime of this object. |
| // |
| // The owner of this |ZSTDCompressedBlockCollectionImpl| is responsible for ensuring that the |
| // above assumptions hold. |
| ZSTDCompressedBlockCollectionImpl(storage::OwnedVmoid* vmoid, uint32_t num_vmo_blocks, |
| SpaceManager* space_manager, |
| fs::LegacyTransactionHandler* txn_handler, |
| NodeFinder* node_finder, |
| uint32_t node_index, uint32_t num_merkle_blocks); |
| |
| // ZSTDCompressedBlockCollection implementation. Reads are copied to the beginning of the VMO |
| // referred to by |vmoid_|. |
| zx_status_t Read(uint32_t data_block_offset, uint32_t num_blocks) final; |
| |
| private: |
| storage::OwnedVmoid* vmoid_; |
| uint32_t num_vmo_blocks_; |
| SpaceManager* space_manager_; |
| fs::LegacyTransactionHandler* txn_handler_; |
| NodeFinder* node_finder_; |
| uint32_t node_index_; |
| uint32_t num_merkle_blocks_; |
| }; |
| |
| } // namespace blobfs |
| |
| #endif // ZIRCON_SYSTEM_ULIB_BLOBFS_COMPRESSION_ZSTD_COMPRESSED_BLOCK_COLLECTION_H_ |