mirror of
https://github.com/trapexit/mergerfs.git
synced 2026-10-26 19:01:56 -04:00
- Store cloned read-worker fds on fuse_session and close them there. - Set up clone fallback through session helpers used by the loop. - Carry per-request fds through receive, process, and reply paths. Tests show significant performance increases in highly concurrent workloads on a high core count system. Upto 15% better on reads and 27% on writes.
72 lines
1.9 KiB
C++
72 lines
1.9 KiB
C++
/*
|
|
FUSE: Filesystem in Userspace
|
|
Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
|
|
|
This program can be distributed under the terms of the GNU LGPLv2.
|
|
See the file COPYING.LIB
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "fuse.h"
|
|
#include "fuse_lowlevel.h"
|
|
#include "fuse_msgbuf_t.h"
|
|
|
|
#include "extern_c.h"
|
|
|
|
#include <atomic>
|
|
#include <vector>
|
|
|
|
/* Simplified fuse_session - fields inlined from former fuse_chan
|
|
* Since mergerfs only supports one mount, we collapse the hierarchy:
|
|
* fuse_session -> fuse_chan -> fd
|
|
* into a single structure with direct fields.
|
|
*/
|
|
struct fuse_session
|
|
{
|
|
int (*receive_buf)(struct fuse_session *se,
|
|
int fd,
|
|
fuse_msgbuf_t *msgbuf);
|
|
|
|
void (*process_buf)(struct fuse_session *se,
|
|
int fd,
|
|
const fuse_msgbuf_t *msgbuf);
|
|
|
|
void (*destroy)(void *data);
|
|
|
|
struct fuse_ll *f;
|
|
std::atomic<int> exited;
|
|
|
|
/* Formerly in fuse_chan - inlined for single-mount simplicity */
|
|
int fd; /* /dev/fuse file descriptor */
|
|
size_t bufsize; /* Buffer size for I/O operations */
|
|
|
|
std::vector<int> clone_fds; /* cloned /dev/fuse fds for read workers */
|
|
};
|
|
|
|
struct fuse_notify_req
|
|
{
|
|
uint64_t unique;
|
|
void (*reply)(struct fuse_notify_req *,
|
|
fuse_req_t*,
|
|
uint64_t,
|
|
const void *);
|
|
struct fuse_notify_req *next;
|
|
struct fuse_notify_req *prev;
|
|
};
|
|
|
|
bool fuse_session_setup_read_fds(struct fuse_session *se,
|
|
int read_thread_count);
|
|
|
|
int fuse_session_read_fd(struct fuse_session *se,
|
|
int index);
|
|
|
|
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
struct fuse_session *fuse_lowlevel_new_common(struct fuse_args *args,
|
|
const struct fuse_lowlevel_ops *op,
|
|
size_t op_size);
|
|
|
|
EXTERN_C_END
|