diff --git a/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.cpp b/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.cpp index ea054728..31647c60 100644 --- a/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.cpp +++ b/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.cpp @@ -27,8 +27,8 @@ using datanodestore::DataNodeStore; using datatreestore::DataTreeStore; using parallelaccessdatatreestore::ParallelAccessDataTreeStore; -BlobStoreOnBlocks::BlobStoreOnBlocks(unique_ref blockStore, uint64_t blocksizeBytes) - : _dataTreeStore(make_unique_ref(make_unique_ref(make_unique_ref(make_unique_ref(std::move(blockStore)), blocksizeBytes)))) { +BlobStoreOnBlocks::BlobStoreOnBlocks(unique_ref blockStore, uint64_t physicalBlocksizeBytes) + : _dataTreeStore(make_unique_ref(make_unique_ref(make_unique_ref(make_unique_ref(std::move(blockStore)), physicalBlocksizeBytes)))) { } BlobStoreOnBlocks::~BlobStoreOnBlocks() { @@ -52,8 +52,8 @@ void BlobStoreOnBlocks::remove(unique_ref blob) { _dataTreeStore->remove((*_blob)->releaseTree()); } -uint64_t BlobStoreOnBlocks::blocksizeBytes() const { - return _dataTreeStore->blocksizeBytes(); +uint64_t BlobStoreOnBlocks::virtualBlocksizeBytes() const { + return _dataTreeStore->virtualBlocksizeBytes(); } uint64_t BlobStoreOnBlocks::numBlocks() const { diff --git a/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.h b/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.h index b915c95b..92234543 100644 --- a/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.h +++ b/src/blobstore/implementations/onblocks/BlobStoreOnBlocks.h @@ -16,7 +16,7 @@ class ParallelAccessDataTreeStore; class BlobStoreOnBlocks final: public BlobStore { public: - BlobStoreOnBlocks(cpputils::unique_ref blockStore, uint64_t blocksizeBytes); + BlobStoreOnBlocks(cpputils::unique_ref blockStore, uint64_t physicalBlocksizeBytes); ~BlobStoreOnBlocks(); cpputils::unique_ref create() override; @@ -25,7 +25,8 @@ public: void remove(cpputils::unique_ref blob) override; //TODO Test blocksizeBytes/numBlocks/estimateSpaceForNumBlocksLeft - uint64_t blocksizeBytes() const override; + //virtual means "space we can use" as opposed to "space it takes on the disk" (i.e. virtual is without headers, checksums, ...) + uint64_t virtualBlocksizeBytes() const override; uint64_t numBlocks() const override; uint64_t estimateSpaceForNumBlocksLeft() const override; diff --git a/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.cpp b/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.cpp index c61a8be1..9e0eaad5 100644 --- a/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.cpp +++ b/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.cpp @@ -20,8 +20,8 @@ namespace blobstore { namespace onblocks { namespace datanodestore { -DataNodeStore::DataNodeStore(unique_ref blockstore, uint64_t blocksizeBytes) -: _blockstore(std::move(blockstore)), _layout(blocksizeBytes) { +DataNodeStore::DataNodeStore(unique_ref blockstore, uint64_t physicalBlocksizeBytes) +: _blockstore(std::move(blockstore)), _layout(_blockstore->blockSizeFromPhysicalBlockSize(physicalBlocksizeBytes)) { } DataNodeStore::~DataNodeStore() { @@ -96,7 +96,7 @@ uint64_t DataNodeStore::estimateSpaceForNumNodesLeft() const { return _blockstore->estimateNumFreeBytes() / _layout.blocksizeBytes(); } -uint64_t DataNodeStore::blocksizeBytes() const { +uint64_t DataNodeStore::virtualBlocksizeBytes() const { return _layout.blocksizeBytes(); } diff --git a/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.h b/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.h index 4cbe2339..01939d30 100644 --- a/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.h +++ b/src/blobstore/implementations/onblocks/datanodestore/DataNodeStore.h @@ -21,7 +21,7 @@ class DataInnerNode; class DataNodeStore final { public: - DataNodeStore(cpputils::unique_ref blockstore, uint64_t blocksizeBytes); + DataNodeStore(cpputils::unique_ref blockstore, uint64_t physicalBlocksizeBytes); ~DataNodeStore(); static constexpr uint8_t MAX_DEPTH = 10; @@ -42,7 +42,7 @@ public: void removeSubtree(cpputils::unique_ref node); //TODO Test blocksizeBytes/numBlocks/estimateSpaceForNumBlocksLeft - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; uint64_t numNodes() const; uint64_t estimateSpaceForNumNodesLeft() const; //TODO Test overwriteNodeWith(), createNodeAsCopyFrom(), removeSubtree() diff --git a/src/blobstore/implementations/onblocks/datatreestore/DataTreeStore.h b/src/blobstore/implementations/onblocks/datatreestore/DataTreeStore.h index 4e253728..78d0455d 100644 --- a/src/blobstore/implementations/onblocks/datatreestore/DataTreeStore.h +++ b/src/blobstore/implementations/onblocks/datatreestore/DataTreeStore.h @@ -26,7 +26,7 @@ public: void remove(cpputils::unique_ref tree); //TODO Test blocksizeBytes/numBlocks/estimateSpaceForNumBlocksLeft - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; uint64_t numNodes() const; uint64_t estimateSpaceForNumNodesLeft() const; @@ -44,8 +44,8 @@ inline uint64_t DataTreeStore::estimateSpaceForNumNodesLeft() const { return _nodeStore->estimateSpaceForNumNodesLeft(); } -inline uint64_t DataTreeStore::blocksizeBytes() const { - return _nodeStore->blocksizeBytes(); +inline uint64_t DataTreeStore::virtualBlocksizeBytes() const { + return _nodeStore->virtualBlocksizeBytes(); } } diff --git a/src/blobstore/implementations/onblocks/parallelaccessdatatreestore/ParallelAccessDataTreeStore.h b/src/blobstore/implementations/onblocks/parallelaccessdatatreestore/ParallelAccessDataTreeStore.h index 533a5146..beea020e 100644 --- a/src/blobstore/implementations/onblocks/parallelaccessdatatreestore/ParallelAccessDataTreeStore.h +++ b/src/blobstore/implementations/onblocks/parallelaccessdatatreestore/ParallelAccessDataTreeStore.h @@ -27,7 +27,7 @@ public: void remove(cpputils::unique_ref tree); //TODO Test blocksizeBytes/numBlocks/estimateSpaceForNumBlocksLeft - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; uint64_t numNodes() const; uint64_t estimateSpaceForNumNodesLeft() const; @@ -38,8 +38,8 @@ private: DISALLOW_COPY_AND_ASSIGN(ParallelAccessDataTreeStore); }; -inline uint64_t ParallelAccessDataTreeStore::blocksizeBytes() const { - return _dataTreeStore->blocksizeBytes(); +inline uint64_t ParallelAccessDataTreeStore::virtualBlocksizeBytes() const { + return _dataTreeStore->virtualBlocksizeBytes(); } inline uint64_t ParallelAccessDataTreeStore::numNodes() const { diff --git a/src/blobstore/interface/BlobStore.h b/src/blobstore/interface/BlobStore.h index bf7c0653..9110f9dd 100644 --- a/src/blobstore/interface/BlobStore.h +++ b/src/blobstore/interface/BlobStore.h @@ -22,7 +22,8 @@ public: virtual uint64_t numBlocks() const = 0; virtual uint64_t estimateSpaceForNumBlocksLeft() const = 0; - virtual uint64_t blocksizeBytes() const = 0; + //virtual means "space we can use" as opposed to "space it takes on the disk" (i.e. virtual is without headers, checksums, ...) + virtual uint64_t virtualBlocksizeBytes() const = 0; }; } diff --git a/src/cryfs/config/CryConfig.cpp b/src/cryfs/config/CryConfig.cpp index 46338c00..7e07bb10 100644 --- a/src/cryfs/config/CryConfig.cpp +++ b/src/cryfs/config/CryConfig.cpp @@ -33,7 +33,7 @@ CryConfig CryConfig::load(const Data &data) { cfg._encKey = pt.get("cryfs.key", ""); cfg._cipher = pt.get("cryfs.cipher", ""); cfg._version = pt.get("cryfs.version", "0.8"); // CryFS 0.8 didn't specify this field, so if the field doesn't exist, it's 0.8. - cfg._blocksizeBytes = pt.get("cryfs.blocksizeBytes", 32 * 1024); // CryFS <= 0.9.2 used a 32KB block size. + cfg._blocksizeBytes = pt.get("cryfs.blocksizeBytes", 32832); // CryFS <= 0.9.2 used a 32KB block size which was this physical block size. return cfg; } diff --git a/src/cryfs/filesystem/CryDevice.cpp b/src/cryfs/filesystem/CryDevice.cpp index 1d010b08..e24aabea 100644 --- a/src/cryfs/filesystem/CryDevice.cpp +++ b/src/cryfs/filesystem/CryDevice.cpp @@ -138,7 +138,7 @@ void CryDevice::statfs(const bf::path &path, struct statvfs *fsstat) { callFsActionCallbacks(); uint64_t numUsedBlocks = _fsBlobStore->numBlocks(); uint64_t numFreeBlocks = _fsBlobStore->estimateSpaceForNumBlocksLeft(); - fsstat->f_bsize = _fsBlobStore->blocksizeBytes(); + fsstat->f_bsize = _fsBlobStore->virtualBlocksizeBytes(); fsstat->f_blocks = numUsedBlocks + numFreeBlocks; fsstat->f_bfree = numFreeBlocks; fsstat->f_bavail = numFreeBlocks; diff --git a/src/cryfs/filesystem/cachingfsblobstore/CachingFsBlobStore.h b/src/cryfs/filesystem/cachingfsblobstore/CachingFsBlobStore.h index 6915b03f..47e19cb7 100644 --- a/src/cryfs/filesystem/cachingfsblobstore/CachingFsBlobStore.h +++ b/src/cryfs/filesystem/cachingfsblobstore/CachingFsBlobStore.h @@ -24,7 +24,7 @@ namespace cryfs { cpputils::unique_ref createSymlinkBlob(const boost::filesystem::path &target); boost::optional> load(const blockstore::Key &key); void remove(cpputils::unique_ref blob); - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; uint64_t numBlocks() const; uint64_t estimateSpaceForNumBlocksLeft() const; @@ -81,8 +81,8 @@ namespace cryfs { _cache.push(key, std::move(baseBlob)); } - inline uint64_t CachingFsBlobStore::blocksizeBytes() const { - return _baseBlobStore->blocksizeBytes(); + inline uint64_t CachingFsBlobStore::virtualBlocksizeBytes() const { + return _baseBlobStore->virtualBlocksizeBytes(); } inline uint64_t CachingFsBlobStore::numBlocks() const { diff --git a/src/cryfs/filesystem/fsblobstore/DirBlob.cpp b/src/cryfs/filesystem/fsblobstore/DirBlob.cpp index 9b4d188c..849b3243 100644 --- a/src/cryfs/filesystem/fsblobstore/DirBlob.cpp +++ b/src/cryfs/filesystem/fsblobstore/DirBlob.cpp @@ -138,7 +138,7 @@ void DirBlob::statChildExceptSize(const Key &key, struct ::stat *result) const { #endif //TODO Move ceilDivision to general utils which can be used by cryfs as well result->st_blocks = blobstore::onblocks::utils::ceilDivision(result->st_size, (off_t)512); - result->st_blksize = _fsBlobStore->blocksizeBytes(); + result->st_blksize = _fsBlobStore->virtualBlocksizeBytes(); } void DirBlob::chmodChild(const Key &key, mode_t mode) { diff --git a/src/cryfs/filesystem/fsblobstore/FsBlobStore.h b/src/cryfs/filesystem/fsblobstore/FsBlobStore.h index 583f56b0..3d2ac248 100644 --- a/src/cryfs/filesystem/fsblobstore/FsBlobStore.h +++ b/src/cryfs/filesystem/fsblobstore/FsBlobStore.h @@ -25,7 +25,7 @@ namespace cryfs { uint64_t numBlocks() const; uint64_t estimateSpaceForNumBlocksLeft() const; - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; private: @@ -75,8 +75,8 @@ namespace cryfs { }; } - inline uint64_t FsBlobStore::blocksizeBytes() const { - return _baseBlobStore->blocksizeBytes(); + inline uint64_t FsBlobStore::virtualBlocksizeBytes() const { + return _baseBlobStore->virtualBlocksizeBytes(); } } } diff --git a/src/cryfs/filesystem/parallelaccessfsblobstore/ParallelAccessFsBlobStore.h b/src/cryfs/filesystem/parallelaccessfsblobstore/ParallelAccessFsBlobStore.h index cca1b3e4..36beac14 100644 --- a/src/cryfs/filesystem/parallelaccessfsblobstore/ParallelAccessFsBlobStore.h +++ b/src/cryfs/filesystem/parallelaccessfsblobstore/ParallelAccessFsBlobStore.h @@ -26,7 +26,7 @@ namespace cryfs { cpputils::unique_ref createSymlinkBlob(const boost::filesystem::path &target); boost::optional> load(const blockstore::Key &key); void remove(cpputils::unique_ref blob); - uint64_t blocksizeBytes() const; + uint64_t virtualBlocksizeBytes() const; uint64_t numBlocks() const; uint64_t estimateSpaceForNumBlocksLeft() const; @@ -58,8 +58,8 @@ namespace cryfs { }; } - inline uint64_t ParallelAccessFsBlobStore::blocksizeBytes() const { - return _baseBlobStore->blocksizeBytes(); + inline uint64_t ParallelAccessFsBlobStore::virtualBlocksizeBytes() const { + return _baseBlobStore->virtualBlocksizeBytes(); } inline uint64_t ParallelAccessFsBlobStore::numBlocks() const { diff --git a/test/blobstore/implementations/onblocks/datanodestore/DataNodeStoreTest.cpp b/test/blobstore/implementations/onblocks/datanodestore/DataNodeStoreTest.cpp index 05ee7f59..243d08c0 100644 --- a/test/blobstore/implementations/onblocks/datanodestore/DataNodeStoreTest.cpp +++ b/test/blobstore/implementations/onblocks/datanodestore/DataNodeStoreTest.cpp @@ -135,3 +135,16 @@ TEST_F(DataNodeStoreTest, NumNodesIsCorrectAfterRemovingANode) { nodeStore->remove(std::move(node)); EXPECT_EQ(1u, nodeStore->numNodes()); } + +TEST_F(DataNodeStoreTest, PhysicalBlockSize_Leaf) { + auto leaf = nodeStore->createNewLeafNode(); + auto block = blockStore->load(leaf->key()).value(); + EXPECT_EQ(BLOCKSIZE_BYTES, block->size()); +} + +TEST_F(DataNodeStoreTest, PhysicalBlockSize_Inner) { + auto leaf = nodeStore->createNewLeafNode(); + auto node = nodeStore->createNewInnerNode(*leaf); + auto block = blockStore->load(node->key()).value(); + EXPECT_EQ(BLOCKSIZE_BYTES, block->size()); +} \ No newline at end of file