syntax = "proto3"; package scoutfs.sync.v1; option go_package = "github.com/scoutfs/scoutfs-manager/internal/app/scoutfs-manager/sync/syncpb"; import "google/protobuf/timestamp.proto"; // MetadataSyncService provides metadata replication between ScoutFS filesystems. service MetadataSyncService { // PushMetadata streams batches of inode metadata from source to target. rpc PushMetadata(stream MetadataBatch) returns (PushMetadataResponse); // SyncState returns the current sync watermarks for the given source. rpc SyncState(SyncStateRequest) returns (SyncStateResponse); } message Timespec { int64 sec = 1; int64 nsec = 2; } message XattrEntry { string name = 1; bytes value = 2; } message DirEntry { uint64 parent_ino = 1; string name = 2; uint32 d_type = 3; } message InodeMetadata { uint64 ino = 1; uint64 size = 2; uint32 nlink = 3; uint32 uid = 4; uint32 gid = 5; uint32 mode = 6; uint64 rdev = 7; uint64 meta_seq = 8; uint64 data_seq = 9; uint64 data_version = 10; uint64 online_blocks = 11; uint64 offline_blocks = 12; Timespec atime = 13; Timespec mtime = 14; Timespec ctime = 15; Timespec crtime = 16; uint64 project_id = 17; repeated XattrEntry xattrs = 18; repeated string paths = 19; repeated DirEntry dir_entries = 20; bool deleted = 21; } message MetadataBatch { repeated InodeMetadata inodes = 1; uint64 source_committed_seq = 2; string source_fsid = 3; } message PushMetadataResponse { uint64 applied_count = 1; uint64 error_count = 2; repeated InodeError errors = 3; } message InodeError { uint64 ino = 1; string message = 2; } message SyncStateRequest { string source_fsid = 1; } message SyncStateResponse { uint64 last_synced_meta_seq = 1; uint64 last_synced_data_seq = 2; string source_fsid = 3; google.protobuf.Timestamp last_sync_time = 4; }