Files
gitks/proto/repository.proto
T
zhenyi 8f472a0443 feat(cluster): implement distributed clustering with etcd coordination
- Integrate etcd-client for distributed coordination and leader election
- Add remote client macros with proper formatting for all services
- Implement RequestMetrics for tracking RPC performance and errors
- Add rate limiting mechanism across all service endpoints
- Create ElectionRequest and ElectionResult message types for leader election
- Add role management with primary/replica switching capabilities
- Implement health checker with automatic failover detection
- Add repository count metrics for cluster monitoring
- Update Cargo.toml with etcd-client and dashmap dependencies
- Modify RepoEntry to include read_only flag for replica handling
- Implement should_accept_election logic to prevent duplicate elections
- Add RoleChangedEvent handling for cluster role updates
2026-06-08 14:31:29 +08:00

280 lines
7.3 KiB
Protocol Buffer

syntax = "proto3";
package gitks;
import "google/protobuf/empty.proto";
import "oid.proto";
// Repository identity used by storage-facing RPCs.
message RepositoryHeader {
// Logical storage shard or disk name.
string storage_name = 1;
// Path relative to the storage root, usually ending in `.git` for bare repos.
string relative_path = 2;
// Optional absolute path for embedded/local deployments.
string storage_path = 3;
}
message Repository {
RepositoryHeader header = 1;
bool bare = 2;
bool empty = 3;
ObjectFormat object_format = 4;
string default_branch = 5;
string git_object_directory = 6;
repeated string git_alternate_object_directories = 7;
}
message RepositoryStatistics {
uint64 size_bytes = 1;
uint64 loose_object_count = 2;
uint64 packed_object_count = 3;
uint64 packfile_count = 4;
uint64 reference_count = 5;
uint64 commit_graph_size_bytes = 6;
uint64 multi_pack_index_size_bytes = 7;
}
message RepositoryConfigEntry {
string key = 1;
repeated string values = 2;
}
message RepositoryObjectFormatRequest {
RepositoryHeader repository = 1;
}
message RepositoryObjectFormatResponse {
ObjectFormat object_format = 1;
}
message GetRepositoryRequest {
RepositoryHeader repository = 1;
}
message InitRepositoryRequest {
RepositoryHeader repository = 1;
bool bare = 2;
ObjectFormat object_format = 3;
string initial_branch = 4;
}
message DeleteRepositoryRequest {
RepositoryHeader repository = 1;
}
message RepositoryExistsRequest {
RepositoryHeader repository = 1;
}
message RepositoryExistsResponse {
bool exists = 1;
}
message GetDefaultBranchRequest {
RepositoryHeader repository = 1;
}
message GetDefaultBranchResponse {
string name = 1;
}
message SetDefaultBranchRequest {
RepositoryHeader repository = 1;
string name = 2;
}
message GetRepositoryConfigRequest {
RepositoryHeader repository = 1;
repeated string keys = 2;
}
message GetRepositoryConfigResponse {
repeated RepositoryConfigEntry entries = 1;
}
message SetRepositoryConfigRequest {
RepositoryHeader repository = 1;
repeated RepositoryConfigEntry entries = 2;
}
message RepositoryStatisticsRequest {
RepositoryHeader repository = 1;
}
message RepositoryHealthRequest {
RepositoryHeader repository = 1;
bool connectivity_only = 2;
}
message RepositoryHealthResponse {
bool ok = 1;
repeated string warnings = 2;
repeated string errors = 3;
RepositoryStatistics statistics = 4;
}
message GarbageCollectRequest {
RepositoryHeader repository = 1;
bool prune = 2;
bool aggressive = 3;
}
message RepackRequest {
RepositoryHeader repository = 1;
bool full = 2;
bool write_bitmaps = 3;
bool write_multi_pack_index = 4;
}
message WriteCommitGraphRequest {
RepositoryHeader repository = 1;
bool replace = 2;
bool split = 3;
}
message RepositoryMaintenanceResponse {
bool ok = 1;
string stdout = 2;
string stderr = 3;
}
// ── Hooks Management ──────────────────────────────────────────────────
message ListHooksRequest {
RepositoryHeader repository = 1;
}
message HookInfo {
string hook_type = 1;
string level = 2; // "server" or "custom"
string path = 3;
}
message ListHooksResponse {
repeated HookInfo hooks = 1;
}
message SetCustomHookRequest {
RepositoryHeader repository = 1;
string hook_name = 2; // "pre-receive", "update", "post-receive"
string content = 3; // Hook script content
}
message RemoveCustomHookRequest {
RepositoryHeader repository = 1;
string hook_name = 2;
}
// ── Snapshot ──────────────────────────────────────────────────────────
enum SnapshotStorage {
SNAPSHOT_STORAGE_LOCAL = 0;
SNAPSHOT_STORAGE_S3 = 1;
SNAPSHOT_STORAGE_GCS = 2;
}
message SnapshotInfo {
string snapshot_id = 1;
string relative_path = 2;
uint64 size_bytes = 3;
string created_at = 4; // ISO 8601
string head_oid = 5;
}
message CreateSnapshotRequest {
RepositoryHeader repository = 1;
SnapshotStorage storage = 2;
string storage_path = 3;
}
message CreateSnapshotResponse {
string snapshot_id = 1;
uint64 size_bytes = 2;
string head_oid = 3;
}
message RestoreSnapshotRequest {
RepositoryHeader target_repository = 1;
string snapshot_id = 2;
SnapshotStorage storage = 3;
string storage_path = 4;
}
message ListSnapshotsRequest {
RepositoryHeader repository = 1;
uint32 limit = 2;
}
message ListSnapshotsResponse {
repeated SnapshotInfo snapshots = 1;
}
message DeleteSnapshotRequest {
string snapshot_id = 1;
SnapshotStorage storage = 2;
}
// ── Repository Move ──────────────────────────────────────────────────
enum MoveRepositoryState {
MOVE_STATE_UNKNOWN = 0;
MOVE_STATE_PREPARING = 1;
MOVE_STATE_TRANSFERRING = 2;
MOVE_STATE_VERIFYING = 3;
MOVE_STATE_COMPLETED = 4;
MOVE_STATE_FAILED = 5;
MOVE_STATE_CANCELLED = 6;
}
message MoveRepositoryRequest {
RepositoryHeader source_repository = 1;
RepositoryHeader target_repository = 2;
}
message MoveRepositoryResponse {
MoveRepositoryState state = 1;
string error_message = 2;
}
message FetchRepositoryDataRequest {
RepositoryHeader repository = 1;
}
message FetchRepositoryDataResponse {
bytes data = 1;
bool done = 2;
}
service RepositoryService {
rpc GetRepository(GetRepositoryRequest) returns (Repository);
rpc InitRepository(InitRepositoryRequest) returns (Repository);
rpc DeleteRepository(DeleteRepositoryRequest) returns (google.protobuf.Empty);
rpc RepositoryExists(RepositoryExistsRequest) returns (RepositoryExistsResponse);
rpc GetObjectFormat(RepositoryObjectFormatRequest) returns (RepositoryObjectFormatResponse);
rpc GetDefaultBranch(GetDefaultBranchRequest) returns (GetDefaultBranchResponse);
rpc SetDefaultBranch(SetDefaultBranchRequest) returns (google.protobuf.Empty);
rpc GetRepositoryConfig(GetRepositoryConfigRequest) returns (GetRepositoryConfigResponse);
rpc SetRepositoryConfig(SetRepositoryConfigRequest) returns (google.protobuf.Empty);
rpc GetRepositoryStatistics(RepositoryStatisticsRequest) returns (RepositoryStatistics);
rpc CheckRepositoryHealth(RepositoryHealthRequest) returns (RepositoryHealthResponse);
rpc GarbageCollect(GarbageCollectRequest) returns (RepositoryMaintenanceResponse);
rpc Repack(RepackRequest) returns (RepositoryMaintenanceResponse);
rpc WriteCommitGraph(WriteCommitGraphRequest) returns (RepositoryMaintenanceResponse);
// Hooks management
rpc ListHooks(ListHooksRequest) returns (ListHooksResponse);
rpc SetCustomHook(SetCustomHookRequest) returns (google.protobuf.Empty);
rpc RemoveCustomHook(RemoveCustomHookRequest) returns (google.protobuf.Empty);
// Snapshot operations
rpc CreateSnapshot(CreateSnapshotRequest) returns (CreateSnapshotResponse);
rpc RestoreSnapshot(RestoreSnapshotRequest) returns (google.protobuf.Empty);
rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse);
rpc DeleteSnapshot(DeleteSnapshotRequest) returns (google.protobuf.Empty);
// Repository move
rpc MoveRepository(MoveRepositoryRequest) returns (MoveRepositoryResponse);
rpc FetchRepositoryData(FetchRepositoryDataRequest) returns (stream FetchRepositoryDataResponse);
}