eden/fs/service/streamingeden.thrift (61 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This software may be used and distributed according to the terms of the
* GNU General Public License version 2.
*/
include "eden/fs/service/eden.thrift"
namespace cpp2 facebook.eden
namespace py3 eden.fs.service
enum FsEventType {
UNKNOWN = 0,
START = 1,
FINISH = 2,
}
/**
* Common timestamps for every trace event, used to measure durations and
* display wall clock time.
*/
struct TraceEventTimes {
// Nanoseconds since epoch.
1: i64 timestamp;
// Nanoseconds since arbitrary clock base, used for computing request
// durations between start and finish.
2: i64 monotonic_time_ns;
}
struct RequestInfo {
// The pid that originated this request.
1: optional eden.pid_t pid;
// If available, the binary name corresponding to `pid`.
2: optional string processName;
}
struct FsEvent {
// Nanoseconds since epoch.
1: i64 timestamp;
// Nanoseconds since arbitrary clock base, used for computing request
// durations between start and finish.
2: i64 monotonic_time_ns;
7: TraceEventTimes times;
3: FsEventType type;
// See fuseRequest or prjfsRequest for the request opcode name.
4: string arguments;
// At most one of the *Request fields will be set, depending on the filesystem implementation.
5: optional eden.FuseCall fuseRequest;
10: optional eden.NfsCall nfsRequest;
11: optional eden.PrjfsCall prjfsRequest;
8: RequestInfo requestInfo;
/**
* The result code sent back to the kernel.
*
* Positive is success, and, depending on the operation, may contain a nonzero result.
*
* If a FUSE request returns an inode which the kernel will reference, this field contains that inode numebr, so it can be correlated with future FUSE requests to that inode.
* field is set. This field can be used to link the lookup/create/mknod
* request to future FUSE requests on that inode.
*
* Negative indicates an error.
*/
9: optional i64 result;
}
/*
* Bits that control the events traced from traceFsEvents.
*
* edenfs internally categorizes FUSE requests as read, write, or other. That
* is subject to change, and additional filtering bits may be added in the
* future.
*/
const i64 FS_EVENT_READ = 1;
const i64 FS_EVENT_WRITE = 2;
const i64 FS_EVENT_OTHER = 4;
enum HgEventType {
UNKNOWN = 0,
QUEUE = 1,
START = 2,
FINISH = 3,
}
enum HgResourceType {
UNKNOWN = 0,
BLOB = 1,
TREE = 2,
}
struct HgEvent {
1: TraceEventTimes times;
2: HgEventType eventType;
3: HgResourceType resourceType;
4: i64 unique;
// HG manifest node ID as 40-character hex string.
5: string manifestNodeId;
6: binary path;
7: optional RequestInfo requestInfo;
}
/**
* This Thrift service defines streaming functions. It is separate from
* EdenService because older Thrift runtimes do not support Thrift streaming,
* primarily javadeprecated which is used by Buck. When Buck is updated to
* use java-swift instead, we can merge EdenService and StreamingEdenService.
*/
service StreamingEdenService extends eden.EdenService {
/**
* Request notification about changes to the journal for
* the specified mountPoint.
*
* IMPORTANT: Do not use the JournalPosition values in the stream. They are
* meaningless. Instead, call getFilesChangedSince or
* getCurrentJournalPosition which will return up-to-date information and
* unblock future notifications on this subscription. If the subscriber
* never calls getFilesChangedSince or getCurrentJournalPosition in
* response to a notification on this stream, future notifications may not
* arrive.
*
* This is an implementation of the subscribe API using the
* new rsocket based streaming thrift protocol.
* The name is temporary: we want to make some API changes
* but want to start pushing out an implementation now because
* we've seen inflated memory usage for the older `subscribe`
* method above.
*/
stream<eden.JournalPosition> subscribeStreamTemporary(
1: eden.PathString mountPoint,
);
/**
* Returns, in order, a stream of FUSE or PrjFS requests and responses for
* the given mount.
*
* eventCategoryMask is a bitset which indicates the requested trace events.
* 0 indicates all events are requested.
*/
stream<FsEvent> traceFsEvents(
1: eden.PathString mountPoint,
2: i64 eventCategoryMask,
);
/**
* Returns, in order, a stream of hg import requests for the given mount.
*
* Each request has a unique ID and transitions through three states: queued,
* started, and finished.
*/
stream<HgEvent> traceHgEvents(1: eden.PathString mountPoint);
}