mirror of
https://github.com/versity/scoutfs.git
synced 2026-09-19 06:26:28 +00:00
Lock invalidation has to make sure that changes are visible to future readers. It was syncing if the current transaction is dirty. This was never optimal, but it wasn't catastrophic when concurrent invalidation work could all block on one sync in progress. With the move to a single invalidation worker serially invalidating locks it became unacceptable. Invalidation happening in the presence of writers would constantly sync the current transaction while very old unused write locks were invalidated. Their changes had long since been committed in previous transactions. We add a lock field to remember the transaction sequence which could have been dirtied under the lock. If that transaction has already been comitted by the time we invalidate the lock it doesn't have to sync. Signed-off-by: Zach Brown <zab@versity.com>
32 lines
1.1 KiB
C
32 lines
1.1 KiB
C
#ifndef _SCOUTFS_TRANS_H_
|
|
#define _SCOUTFS_TRANS_H_
|
|
|
|
/* the server will attempt to fill data allocs for each trans */
|
|
#define SCOUTFS_TRANS_DATA_ALLOC_HWM (2ULL * 1024 * 1024 * 1024)
|
|
/* the client will force commits if data allocators get too low */
|
|
#define SCOUTFS_TRANS_DATA_ALLOC_LWM (256ULL * 1024 * 1024)
|
|
|
|
#include "count.h"
|
|
|
|
void scoutfs_trans_write_func(struct work_struct *work);
|
|
int scoutfs_trans_sync(struct super_block *sb, int wait);
|
|
int scoutfs_file_fsync(struct file *file, loff_t start, loff_t end,
|
|
int datasync);
|
|
void scoutfs_trans_restart_sync_deadline(struct super_block *sb);
|
|
|
|
int scoutfs_hold_trans(struct super_block *sb,
|
|
const struct scoutfs_item_count cnt);
|
|
bool scoutfs_trans_held(void);
|
|
void scoutfs_release_trans(struct super_block *sb);
|
|
u64 scoutfs_trans_sample_seq(struct super_block *sb);
|
|
void scoutfs_trans_track_item(struct super_block *sb, signed items,
|
|
signed vals);
|
|
|
|
int scoutfs_trans_get_log_trees(struct super_block *sb);
|
|
bool scoutfs_trans_has_dirty(struct super_block *sb);
|
|
|
|
int scoutfs_setup_trans(struct super_block *sb);
|
|
void scoutfs_shutdown_trans(struct super_block *sb);
|
|
|
|
#endif
|