mirror of
https://github.com/versity/scoutfs.git
synced 2026-05-01 18:35:43 +00:00
Previously the srch compaction work would output the entire compacted file and delete the input files in one atomic commit. The server would send the input files and an allocator to the client, and the client would send back an output file and an allocator that included the deletion of the input files. The server would merge in the allocator and replace the input file items with the output file item. Doing it this way required giving an enormous allocation pool to the client in a radix, which would deal with recursive operations (allocating from and freeing to the radix that is being modified). We no longer have the radix allocator, and we use single block avail/free lists instead of recursively modifying the btrees with free extent items. The compaction RPC needs to work with a finite amount of allocator resources that can be stored in an alloc list block. The compaction work now does a fixed amount of work and a compaction operation spans multiple work iterations. A single compaction struct is now sent between the client and server in the get_compact and commit_compact messages. The client records any partial progress in the struct. The server writes that position into PENDING items. It first searchs for pending items to give to clients before searching for files to start a new compaction operation. The compact struct has flags to indicate whether the output file is being written or the input files are being deleted. The server manages the flags and sets the input file deletion flag only once the result of the compaction has been reflected in the btree items which record srch files. We added the progress fields to the compaction struct, making it even bigger than it already was, so we take the time to allocate them rather than declaring them on the stack. It's worth mentioning that each operation now takes a reasonably bounded amount of time will make it feasible to decide that it has failed and needs to be fenced. Signed-off-by: Zach Brown <zab@versity.com>
30 lines
1.2 KiB
C
30 lines
1.2 KiB
C
#ifndef _SCOUTFS_CLIENT_H_
|
|
#define _SCOUTFS_CLIENT_H_
|
|
|
|
int scoutfs_client_alloc_inodes(struct super_block *sb, u64 count,
|
|
u64 *ino, u64 *nr);
|
|
int scoutfs_client_get_log_trees(struct super_block *sb,
|
|
struct scoutfs_log_trees *lt);
|
|
int scoutfs_client_commit_log_trees(struct super_block *sb,
|
|
struct scoutfs_log_trees *lt);
|
|
int scoutfs_client_get_roots(struct super_block *sb,
|
|
struct scoutfs_net_roots *roots);
|
|
u64 *scoutfs_client_bulk_alloc(struct super_block *sb);
|
|
int scoutfs_client_advance_seq(struct super_block *sb, u64 *seq);
|
|
int scoutfs_client_get_last_seq(struct super_block *sb, u64 *seq);
|
|
int scoutfs_client_lock_request(struct super_block *sb,
|
|
struct scoutfs_net_lock *nl);
|
|
int scoutfs_client_lock_response(struct super_block *sb, u64 net_id,
|
|
struct scoutfs_net_lock *nl);
|
|
int scoutfs_client_lock_recover_response(struct super_block *sb, u64 net_id,
|
|
struct scoutfs_net_lock_recover *nlr);
|
|
int scoutfs_client_srch_get_compact(struct super_block *sb,
|
|
struct scoutfs_srch_compact *sc);
|
|
int scoutfs_client_srch_commit_compact(struct super_block *sb,
|
|
struct scoutfs_srch_compact *res);
|
|
|
|
int scoutfs_client_setup(struct super_block *sb);
|
|
void scoutfs_client_destroy(struct super_block *sb);
|
|
|
|
#endif
|