mirror of
https://github.com/versity/scoutfs.git
synced 2026-04-22 22:40:31 +00:00
The btree forest item storage doesn't have as much item granular state as the item cache did. The item cache could tell if a cached item was populated from persistent storage or was created in memory. It could simply remove created items rather than leaving behind a deletion item. The cached btree blocks in the btree forest item storage mechanism can't do this. It has to create deletion items when deleting newly created items because it doesn't know if the item already exists in the persistent record or not. This created a problem with the extent storage we were using. The individual extent items were stored with a key set to the last logical block of their extent. As extents grew or shrank they often were deleted and created at different key values during a transaction. In the btree forest log trees this left a huge stream of deletion items beind, one for every previous version of the extent. Then searches for an extent covering a block would have to skip over all these deleted items before hitting the current stored extent. Streaming writes would operate on O(n) for every extent operation. It got to be out of hand. This large change solves the problem by using more coarse and stable item storage to track free blocks and blocks mapped into file data. For file data we now have large packed extent items which store packed representations of all the logical mappings of a fixed region of a file. The data code has loading and storage functions which transfer that persistent version to and from the version that is modified in memory. Free blocks are stored in bitmaps that are similarly efficiently packed into fixed size items. The client is no longer working with free extent items managed by the forest, it's working with free block bitmap btrees directly. It needs access to the client's metadata block allocator and block write contexts so we move those two out of the forest code and up into the transaction. Previously the client and server would exchange extents with network messages. Now the roots of the btrees that store the free block bitmap items are communicated along with the roots of the other trees involved in a transaction. The client doesn't need to send free extents back to the server so we can remove those tasks and rpcs. The server no longer has to manage free extents. It transfers block bitmap items between trees around commits. All of its extent manipulation can be removed. The item size portion of transaction item counts are removed because we're not using that level of granularity now that metadata transactions are dirty btree blocks instead of dirty items we pack into fixed sized segments. Signed-off-by: Zach Brown <zab@versity.com>
55 lines
1.1 KiB
Makefile
55 lines
1.1 KiB
Makefile
obj-$(CONFIG_SCOUTFS_FS) := scoutfs.o
|
|
|
|
CFLAGS_super.o = -DSCOUTFS_GIT_DESCRIBE=\"$(SCOUTFS_GIT_DESCRIBE)\" \
|
|
-DSCOUTFS_FORMAT_HASH=0x$(SCOUTFS_FORMAT_HASH)LLU
|
|
|
|
CFLAGS_scoutfs_trace.o = -I$(src) # define_trace.h double include
|
|
|
|
# add EXTRA_CFLAGS defines for kernel compat
|
|
-include $(src)/Makefile.kernelcompat
|
|
|
|
scoutfs-y += \
|
|
balloc.o \
|
|
block.o \
|
|
btree.o \
|
|
client.o \
|
|
counters.o \
|
|
data.o \
|
|
dir.o \
|
|
export.o \
|
|
file.o \
|
|
forest.o \
|
|
inode.o \
|
|
ioctl.o \
|
|
lock.o \
|
|
lock_server.o \
|
|
msg.o \
|
|
net.o \
|
|
options.o \
|
|
per_task.o \
|
|
quorum.o \
|
|
scoutfs_trace.o \
|
|
server.o \
|
|
spbm.o \
|
|
super.o \
|
|
sysfs.o \
|
|
trans.o \
|
|
triggers.o \
|
|
tseq.o \
|
|
xattr.o
|
|
|
|
#
|
|
# The raw types aren't available in userspace headers. Make sure all
|
|
# the types we use in the headers are the exported __ versions.
|
|
#
|
|
# XXX dunno how we're really supposed to do this in kbuild
|
|
#
|
|
.PHONY: $(src)/check_exported_types
|
|
$(src)/check_exported_types:
|
|
@if egrep '\<[us](8|16|32|64\>)' $(src)/format.h $(src)/ioctl.h; then \
|
|
echo "no raw types in exported headers, preface with __"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
extra-y += check_exported_types
|