feat(distlock): refactor into a standalone package

This commit is contained in:
Pasha Sviderski
2026-08-27 15:49:59 +10:00
parent 7a7a313426
commit 613cd6e418
10 changed files with 148 additions and 142 deletions
-5
View File
@@ -1,5 +0,0 @@
// Package distlock provides distributed, automatically renewed leases across Uncloud machines.
//
// The initial in-memory store does not preserve leases across machine daemon restarts. Cluster membership must remain
// stable while leases are active. Callers must stop protected work when the context returned by Lease.Context is done.
package distlock
+1 -1
View File
@@ -44,7 +44,7 @@ run = "mise lock --platform linux-x64,macos-arm64"
description = "Regenerate gRPC API code from .proto files"
run = """
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative \
--proto_path=. --proto_path=internal/machine/api/vendor internal/machine/api/pb/*.proto
--proto_path=. --proto_path=internal/machine/api/vendor internal/machine/api/pb/*.proto pkg/distlock/grpc/*.proto
"""
[tasks.uc]
+7
View File
@@ -0,0 +1,7 @@
// Package distlock provides distributed, automatically renewed leases across independent nodes.
//
// A Cluster must return every node in the lock group, including temporarily unavailable nodes, because every node
// counts toward quorum. Changing the node set is unsafe if a new quorum can be disjoint from an earlier quorum while
// leases acquired from the earlier node set may still be valid. Callers must stop protected work when the context
// returned by Lease.Context is done.
package distlock
@@ -2,9 +2,9 @@
// versions:
// protoc-gen-go v1.34.2
// protoc v5.27.3
// source: internal/machine/api/pb/lease.proto
// source: pkg/distlock/grpc/lease.proto
package pb
package grpc
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
@@ -36,7 +36,7 @@ type AcquireLeaseRequest struct {
func (x *AcquireLeaseRequest) Reset() {
*x = AcquireLeaseRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[0]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -49,7 +49,7 @@ func (x *AcquireLeaseRequest) String() string {
func (*AcquireLeaseRequest) ProtoMessage() {}
func (x *AcquireLeaseRequest) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[0]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -62,7 +62,7 @@ func (x *AcquireLeaseRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use AcquireLeaseRequest.ProtoReflect.Descriptor instead.
func (*AcquireLeaseRequest) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{0}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{0}
}
func (x *AcquireLeaseRequest) GetResource() string {
@@ -98,7 +98,7 @@ type AcquireLeaseResponse struct {
func (x *AcquireLeaseResponse) Reset() {
*x = AcquireLeaseResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[1]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -111,7 +111,7 @@ func (x *AcquireLeaseResponse) String() string {
func (*AcquireLeaseResponse) ProtoMessage() {}
func (x *AcquireLeaseResponse) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[1]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -124,7 +124,7 @@ func (x *AcquireLeaseResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use AcquireLeaseResponse.ProtoReflect.Descriptor instead.
func (*AcquireLeaseResponse) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{1}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{1}
}
func (x *AcquireLeaseResponse) GetAcquired() bool {
@@ -149,7 +149,7 @@ type RenewLeaseRequest struct {
func (x *RenewLeaseRequest) Reset() {
*x = RenewLeaseRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[2]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -162,7 +162,7 @@ func (x *RenewLeaseRequest) String() string {
func (*RenewLeaseRequest) ProtoMessage() {}
func (x *RenewLeaseRequest) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[2]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -175,7 +175,7 @@ func (x *RenewLeaseRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RenewLeaseRequest.ProtoReflect.Descriptor instead.
func (*RenewLeaseRequest) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{2}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{2}
}
func (x *RenewLeaseRequest) GetResource() string {
@@ -211,7 +211,7 @@ type RenewLeaseResponse struct {
func (x *RenewLeaseResponse) Reset() {
*x = RenewLeaseResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[3]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -224,7 +224,7 @@ func (x *RenewLeaseResponse) String() string {
func (*RenewLeaseResponse) ProtoMessage() {}
func (x *RenewLeaseResponse) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[3]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -237,7 +237,7 @@ func (x *RenewLeaseResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RenewLeaseResponse.ProtoReflect.Descriptor instead.
func (*RenewLeaseResponse) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{3}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{3}
}
func (x *RenewLeaseResponse) GetRenewed() bool {
@@ -260,7 +260,7 @@ type ReleaseLeaseRequest struct {
func (x *ReleaseLeaseRequest) Reset() {
*x = ReleaseLeaseRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[4]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -273,7 +273,7 @@ func (x *ReleaseLeaseRequest) String() string {
func (*ReleaseLeaseRequest) ProtoMessage() {}
func (x *ReleaseLeaseRequest) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[4]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -286,7 +286,7 @@ func (x *ReleaseLeaseRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ReleaseLeaseRequest.ProtoReflect.Descriptor instead.
func (*ReleaseLeaseRequest) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{4}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{4}
}
func (x *ReleaseLeaseRequest) GetResource() string {
@@ -315,7 +315,7 @@ type ReleaseLeaseResponse struct {
func (x *ReleaseLeaseResponse) Reset() {
*x = ReleaseLeaseResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[5]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -328,7 +328,7 @@ func (x *ReleaseLeaseResponse) String() string {
func (*ReleaseLeaseResponse) ProtoMessage() {}
func (x *ReleaseLeaseResponse) ProtoReflect() protoreflect.Message {
mi := &file_internal_machine_api_pb_lease_proto_msgTypes[5]
mi := &file_pkg_distlock_grpc_lease_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -341,7 +341,7 @@ func (x *ReleaseLeaseResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ReleaseLeaseResponse.ProtoReflect.Descriptor instead.
func (*ReleaseLeaseResponse) Descriptor() ([]byte, []int) {
return file_internal_machine_api_pb_lease_proto_rawDescGZIP(), []int{5}
return file_pkg_distlock_grpc_lease_proto_rawDescGZIP(), []int{5}
}
func (x *ReleaseLeaseResponse) GetReleased() bool {
@@ -351,92 +351,95 @@ func (x *ReleaseLeaseResponse) GetReleased() bool {
return false
}
var File_internal_machine_api_pb_lease_proto protoreflect.FileDescriptor
var File_pkg_distlock_grpc_lease_proto protoreflect.FileDescriptor
var file_internal_machine_api_pb_lease_proto_rawDesc = []byte{
0x0a, 0x23, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69,
0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x63,
0x71, 0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
var file_pkg_distlock_grpc_lease_proto_rawDesc = []byte{
0x0a, 0x1d, 0x70, 0x6b, 0x67, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x67,
0x72, 0x70, 0x63, 0x2f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
0x0b, 0x64, 0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x13,
0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05,
0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x74,
0x74, 0x6c, 0x22, 0x32, 0x0a, 0x14, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61,
0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63,
0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63,
0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x72, 0x0a, 0x11, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x4c,
0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72,
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72,
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a,
0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x2e, 0x0a, 0x12, 0x52, 0x65,
0x6e, 0x65, 0x77, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x08, 0x52, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65, 0x64, 0x22, 0x47, 0x0a, 0x13, 0x52, 0x65,
0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a,
0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f,
0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x74, 0x74, 0x6c,
0x22, 0x32, 0x0a, 0x14, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x71, 0x75,
0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x71, 0x75,
0x69, 0x72, 0x65, 0x64, 0x22, 0x72, 0x0a, 0x11, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x4c, 0x65, 0x61,
0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73,
0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73,
0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2b, 0x0a, 0x03, 0x74,
0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x2e, 0x0a, 0x12, 0x52, 0x65, 0x6e, 0x65,
0x77, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18,
0x0a, 0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
0x07, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65, 0x64, 0x22, 0x47, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x65,
0x61, 0x73, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74,
0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65,
0x6e, 0x22, 0x32, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65, 0x61, 0x73,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6c,
0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6c,
0x65, 0x61, 0x73, 0x65, 0x64, 0x32, 0xc1, 0x01, 0x0a, 0x05, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x12,
0x3e, 0x0a, 0x07, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x71, 0x75, 0x69,
0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x38, 0x0a, 0x05, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52,
0x65, 0x6e, 0x65, 0x77, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x4c, 0x65, 0x61, 0x73,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x52, 0x65, 0x6c,
0x65, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61,
0x73, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65, 0x61, 0x73,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74,
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73,
0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6b, 0x65, 0x6e, 0x22, 0x32, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65,
0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72,
0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72,
0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x32, 0xf1, 0x01, 0x0a, 0x05, 0x4c, 0x65, 0x61, 0x73,
0x65, 0x12, 0x4e, 0x0a, 0x07, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x12, 0x20, 0x2e, 0x64,
0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x71, 0x75, 0x69,
0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21,
0x2e, 0x64, 0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x71,
0x75, 0x69, 0x72, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x48, 0x0a, 0x05, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x12, 0x1e, 0x2e, 0x64, 0x69, 0x73,
0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x4c, 0x65,
0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x64, 0x69, 0x73,
0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x4c, 0x65,
0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x07, 0x52,
0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63,
0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65, 0x61, 0x73,
0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x6c,
0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65,
0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67,
0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65,
0x72, 0x73, 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x70, 0x6b, 0x67,
0x2f, 0x64, 0x69, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_internal_machine_api_pb_lease_proto_rawDescOnce sync.Once
file_internal_machine_api_pb_lease_proto_rawDescData = file_internal_machine_api_pb_lease_proto_rawDesc
file_pkg_distlock_grpc_lease_proto_rawDescOnce sync.Once
file_pkg_distlock_grpc_lease_proto_rawDescData = file_pkg_distlock_grpc_lease_proto_rawDesc
)
func file_internal_machine_api_pb_lease_proto_rawDescGZIP() []byte {
file_internal_machine_api_pb_lease_proto_rawDescOnce.Do(func() {
file_internal_machine_api_pb_lease_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_machine_api_pb_lease_proto_rawDescData)
func file_pkg_distlock_grpc_lease_proto_rawDescGZIP() []byte {
file_pkg_distlock_grpc_lease_proto_rawDescOnce.Do(func() {
file_pkg_distlock_grpc_lease_proto_rawDescData = protoimpl.X.CompressGZIP(file_pkg_distlock_grpc_lease_proto_rawDescData)
})
return file_internal_machine_api_pb_lease_proto_rawDescData
return file_pkg_distlock_grpc_lease_proto_rawDescData
}
var file_internal_machine_api_pb_lease_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_internal_machine_api_pb_lease_proto_goTypes = []any{
(*AcquireLeaseRequest)(nil), // 0: api.AcquireLeaseRequest
(*AcquireLeaseResponse)(nil), // 1: api.AcquireLeaseResponse
(*RenewLeaseRequest)(nil), // 2: api.RenewLeaseRequest
(*RenewLeaseResponse)(nil), // 3: api.RenewLeaseResponse
(*ReleaseLeaseRequest)(nil), // 4: api.ReleaseLeaseRequest
(*ReleaseLeaseResponse)(nil), // 5: api.ReleaseLeaseResponse
var file_pkg_distlock_grpc_lease_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_pkg_distlock_grpc_lease_proto_goTypes = []any{
(*AcquireLeaseRequest)(nil), // 0: distlock.v1.AcquireLeaseRequest
(*AcquireLeaseResponse)(nil), // 1: distlock.v1.AcquireLeaseResponse
(*RenewLeaseRequest)(nil), // 2: distlock.v1.RenewLeaseRequest
(*RenewLeaseResponse)(nil), // 3: distlock.v1.RenewLeaseResponse
(*ReleaseLeaseRequest)(nil), // 4: distlock.v1.ReleaseLeaseRequest
(*ReleaseLeaseResponse)(nil), // 5: distlock.v1.ReleaseLeaseResponse
(*durationpb.Duration)(nil), // 6: google.protobuf.Duration
}
var file_internal_machine_api_pb_lease_proto_depIdxs = []int32{
6, // 0: api.AcquireLeaseRequest.ttl:type_name -> google.protobuf.Duration
6, // 1: api.RenewLeaseRequest.ttl:type_name -> google.protobuf.Duration
0, // 2: api.Lease.Acquire:input_type -> api.AcquireLeaseRequest
2, // 3: api.Lease.Renew:input_type -> api.RenewLeaseRequest
4, // 4: api.Lease.Release:input_type -> api.ReleaseLeaseRequest
1, // 5: api.Lease.Acquire:output_type -> api.AcquireLeaseResponse
3, // 6: api.Lease.Renew:output_type -> api.RenewLeaseResponse
5, // 7: api.Lease.Release:output_type -> api.ReleaseLeaseResponse
var file_pkg_distlock_grpc_lease_proto_depIdxs = []int32{
6, // 0: distlock.v1.AcquireLeaseRequest.ttl:type_name -> google.protobuf.Duration
6, // 1: distlock.v1.RenewLeaseRequest.ttl:type_name -> google.protobuf.Duration
0, // 2: distlock.v1.Lease.Acquire:input_type -> distlock.v1.AcquireLeaseRequest
2, // 3: distlock.v1.Lease.Renew:input_type -> distlock.v1.RenewLeaseRequest
4, // 4: distlock.v1.Lease.Release:input_type -> distlock.v1.ReleaseLeaseRequest
1, // 5: distlock.v1.Lease.Acquire:output_type -> distlock.v1.AcquireLeaseResponse
3, // 6: distlock.v1.Lease.Renew:output_type -> distlock.v1.RenewLeaseResponse
5, // 7: distlock.v1.Lease.Release:output_type -> distlock.v1.ReleaseLeaseResponse
5, // [5:8] is the sub-list for method output_type
2, // [2:5] is the sub-list for method input_type
2, // [2:2] is the sub-list for extension type_name
@@ -444,13 +447,13 @@ var file_internal_machine_api_pb_lease_proto_depIdxs = []int32{
0, // [0:2] is the sub-list for field type_name
}
func init() { file_internal_machine_api_pb_lease_proto_init() }
func file_internal_machine_api_pb_lease_proto_init() {
if File_internal_machine_api_pb_lease_proto != nil {
func init() { file_pkg_distlock_grpc_lease_proto_init() }
func file_pkg_distlock_grpc_lease_proto_init() {
if File_pkg_distlock_grpc_lease_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_internal_machine_api_pb_lease_proto_msgTypes[0].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[0].Exporter = func(v any, i int) any {
switch v := v.(*AcquireLeaseRequest); i {
case 0:
return &v.state
@@ -462,7 +465,7 @@ func file_internal_machine_api_pb_lease_proto_init() {
return nil
}
}
file_internal_machine_api_pb_lease_proto_msgTypes[1].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[1].Exporter = func(v any, i int) any {
switch v := v.(*AcquireLeaseResponse); i {
case 0:
return &v.state
@@ -474,7 +477,7 @@ func file_internal_machine_api_pb_lease_proto_init() {
return nil
}
}
file_internal_machine_api_pb_lease_proto_msgTypes[2].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*RenewLeaseRequest); i {
case 0:
return &v.state
@@ -486,7 +489,7 @@ func file_internal_machine_api_pb_lease_proto_init() {
return nil
}
}
file_internal_machine_api_pb_lease_proto_msgTypes[3].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[3].Exporter = func(v any, i int) any {
switch v := v.(*RenewLeaseResponse); i {
case 0:
return &v.state
@@ -498,7 +501,7 @@ func file_internal_machine_api_pb_lease_proto_init() {
return nil
}
}
file_internal_machine_api_pb_lease_proto_msgTypes[4].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[4].Exporter = func(v any, i int) any {
switch v := v.(*ReleaseLeaseRequest); i {
case 0:
return &v.state
@@ -510,7 +513,7 @@ func file_internal_machine_api_pb_lease_proto_init() {
return nil
}
}
file_internal_machine_api_pb_lease_proto_msgTypes[5].Exporter = func(v any, i int) any {
file_pkg_distlock_grpc_lease_proto_msgTypes[5].Exporter = func(v any, i int) any {
switch v := v.(*ReleaseLeaseResponse); i {
case 0:
return &v.state
@@ -527,18 +530,18 @@ func file_internal_machine_api_pb_lease_proto_init() {
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_internal_machine_api_pb_lease_proto_rawDesc,
RawDescriptor: file_pkg_distlock_grpc_lease_proto_rawDesc,
NumEnums: 0,
NumMessages: 6,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_internal_machine_api_pb_lease_proto_goTypes,
DependencyIndexes: file_internal_machine_api_pb_lease_proto_depIdxs,
MessageInfos: file_internal_machine_api_pb_lease_proto_msgTypes,
GoTypes: file_pkg_distlock_grpc_lease_proto_goTypes,
DependencyIndexes: file_pkg_distlock_grpc_lease_proto_depIdxs,
MessageInfos: file_pkg_distlock_grpc_lease_proto_msgTypes,
}.Build()
File_internal_machine_api_pb_lease_proto = out.File
file_internal_machine_api_pb_lease_proto_rawDesc = nil
file_internal_machine_api_pb_lease_proto_goTypes = nil
file_internal_machine_api_pb_lease_proto_depIdxs = nil
File_pkg_distlock_grpc_lease_proto = out.File
file_pkg_distlock_grpc_lease_proto_rawDesc = nil
file_pkg_distlock_grpc_lease_proto_goTypes = nil
file_pkg_distlock_grpc_lease_proto_depIdxs = nil
}
@@ -1,12 +1,12 @@
syntax = "proto3";
package api;
package distlock.v1;
option go_package = "github.com/psviderski/uncloud/internal/machine/api/pb";
option go_package = "github.com/psviderski/uncloud/pkg/distlock/grpc";
import "google/protobuf/duration.proto";
// Lease provides atomic operations for time-bound ownership of resources on a single machine.
// Lease provides atomic operations for time-bound ownership of resources on one node.
service Lease {
// Acquire creates a lease when the resource has no unexpired lease.
rpc Acquire(AcquireLeaseRequest) returns (AcquireLeaseResponse);
@@ -2,9 +2,9 @@
// versions:
// - protoc-gen-go-grpc v1.5.1
// - protoc v5.27.3
// source: internal/machine/api/pb/lease.proto
// source: pkg/distlock/grpc/lease.proto
package pb
package grpc
import (
context "context"
@@ -19,16 +19,16 @@ import (
const _ = grpc.SupportPackageIsVersion9
const (
Lease_Acquire_FullMethodName = "/api.Lease/Acquire"
Lease_Renew_FullMethodName = "/api.Lease/Renew"
Lease_Release_FullMethodName = "/api.Lease/Release"
Lease_Acquire_FullMethodName = "/distlock.v1.Lease/Acquire"
Lease_Renew_FullMethodName = "/distlock.v1.Lease/Renew"
Lease_Release_FullMethodName = "/distlock.v1.Lease/Release"
)
// LeaseClient is the client API for Lease service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
//
// Lease provides atomic operations for time-bound ownership of resources on a single machine.
// Lease provides atomic operations for time-bound ownership of resources on one node.
type LeaseClient interface {
// Acquire creates a lease when the resource has no unexpired lease.
Acquire(ctx context.Context, in *AcquireLeaseRequest, opts ...grpc.CallOption) (*AcquireLeaseResponse, error)
@@ -80,7 +80,7 @@ func (c *leaseClient) Release(ctx context.Context, in *ReleaseLeaseRequest, opts
// All implementations must embed UnimplementedLeaseServer
// for forward compatibility.
//
// Lease provides atomic operations for time-bound ownership of resources on a single machine.
// Lease provides atomic operations for time-bound ownership of resources on one node.
type LeaseServer interface {
// Acquire creates a lease when the resource has no unexpired lease.
Acquire(context.Context, *AcquireLeaseRequest) (*AcquireLeaseResponse, error)
@@ -186,7 +186,7 @@ func _Lease_Release_Handler(srv interface{}, ctx context.Context, dec func(inter
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Lease_ServiceDesc = grpc.ServiceDesc{
ServiceName: "api.Lease",
ServiceName: "distlock.v1.Lease",
HandlerType: (*LeaseServer)(nil),
Methods: []grpc.MethodDesc{
{
@@ -203,5 +203,5 @@ var Lease_ServiceDesc = grpc.ServiceDesc{
},
},
Streams: []grpc.StreamDesc{},
Metadata: "internal/machine/api/pb/lease.proto",
Metadata: "pkg/distlock/grpc/lease.proto",
}
@@ -1,29 +1,30 @@
package distlock
// Package grpc provides a gRPC transport for distlock node-local lease operations.
package grpc
import (
"context"
"fmt"
"time"
"github.com/psviderski/uncloud/internal/machine/api/pb"
"github.com/psviderski/uncloud/pkg/distlock"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/durationpb"
)
// Server adapts a machine-local Store to the Lease gRPC service.
// Server adapts a node-local distlock.Store to the Lease gRPC service.
type Server struct {
pb.UnimplementedLeaseServer
store Store
UnimplementedLeaseServer
store distlock.Store
}
// NewServer creates a machine-local lease server.
func NewServer(store Store) *Server {
// NewServer creates a node-local lease server.
func NewServer(store distlock.Store) *Server {
return &Server{store: store}
}
// Acquire creates a lease when the resource has no unexpired lease.
func (s *Server) Acquire(ctx context.Context, req *pb.AcquireLeaseRequest) (*pb.AcquireLeaseResponse, error) {
func (s *Server) Acquire(ctx context.Context, req *AcquireLeaseRequest) (*AcquireLeaseResponse, error) {
ttl, err := validateLeaseRequest(req.Resource, req.Token, req.Ttl)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
@@ -33,11 +34,11 @@ func (s *Server) Acquire(ctx context.Context, req *pb.AcquireLeaseRequest) (*pb.
if err != nil {
return nil, storeStatusError(ctx, "acquire lease", err)
}
return &pb.AcquireLeaseResponse{Acquired: acquired}, nil
return &AcquireLeaseResponse{Acquired: acquired}, nil
}
// Renew extends an unexpired lease when its ownership token matches.
func (s *Server) Renew(ctx context.Context, req *pb.RenewLeaseRequest) (*pb.RenewLeaseResponse, error) {
func (s *Server) Renew(ctx context.Context, req *RenewLeaseRequest) (*RenewLeaseResponse, error) {
ttl, err := validateLeaseRequest(req.Resource, req.Token, req.Ttl)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
@@ -47,11 +48,11 @@ func (s *Server) Renew(ctx context.Context, req *pb.RenewLeaseRequest) (*pb.Rene
if err != nil {
return nil, storeStatusError(ctx, "renew lease", err)
}
return &pb.RenewLeaseResponse{Renewed: renewed}, nil
return &RenewLeaseResponse{Renewed: renewed}, nil
}
// Release removes an unexpired lease when its ownership token matches.
func (s *Server) Release(ctx context.Context, req *pb.ReleaseLeaseRequest) (*pb.ReleaseLeaseResponse, error) {
func (s *Server) Release(ctx context.Context, req *ReleaseLeaseRequest) (*ReleaseLeaseResponse, error) {
if err := validateResourceToken(req.Resource, req.Token); err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
@@ -60,7 +61,7 @@ func (s *Server) Release(ctx context.Context, req *pb.ReleaseLeaseRequest) (*pb.
if err != nil {
return nil, storeStatusError(ctx, "release lease", err)
}
return &pb.ReleaseLeaseResponse{Released: released}, nil
return &ReleaseLeaseResponse{Released: released}, nil
}
func validateLeaseRequest(resource string, token []byte, ttl *durationpb.Duration) (time.Duration, error) {
@@ -86,7 +86,7 @@ func (s *MemoryStore) Renew(
return true, nil
}
// Release removes a lease when its ownership token matches.
// Release removes an unexpired lease when its ownership token matches.
func (s *MemoryStore) Release(ctx context.Context, resource string, token []byte) (bool, error) {
if err := validateStoreResourceToken(ctx, resource, token); err != nil {
return false, err
@@ -5,7 +5,7 @@ import (
"time"
)
// Store holds machine-local lease state and provides atomic operations over it.
// Store holds node-local lease state and provides atomic operations over it.
type Store interface {
// Acquire creates a lease when the resource does not have an unexpired lease.
Acquire(ctx context.Context, resource string, token []byte, ttl time.Duration) (bool, error)