Files
s3/weed/pb/s3_lifecycle_pb/s3_lifecycle.pb.go
zooqueen dd74d3e6d6 Replace AGPL MinIO fork with Apache-2.0 SeaweedFS fork; rebrand CLI weed->s3
hanzoai/s3 was an AGPL-3.0 MinIO fork whose network-copyleft blocks embedding
and reselling as a managed service. Replace it wholesale with a fork of
SeaweedFS (github.com/seaweedfs/seaweedfs, Apache-2.0, Go) which ships a
built-in S3 gateway + Filer.

- License: AGPL-3.0 -> Apache-2.0 (upstream LICENSE kept verbatim, incl.
  "Copyright 2025 Chris Lu"); NOTICE added crediting SeaweedFS. No AGPL/BUSL/
  SSPL/GPL or enterprise ("ee") files remain.
- Module: go.mod path set to github.com/hanzoai/s3 with a self-replace
  (replace github.com/seaweedfs/seaweedfs => ./) so the ~1800 internal Go files
  keep their upstream import paths with zero churn. Internal identifiers and
  import paths are intentionally NOT renamed.
- CLI rebrand: the binary is built as `s3` (was `weed`); root usage, per-command
  help/usage/flag strings, shell autocomplete program name, and the product name
  in CLI output now read "Hanzo S3" / `s3`. Users never see `weed`.
  (e.g. `s3 server`, `s3 filer`, `s3 master`, `s3 volume`, `s3 s3`, `s3 mount`.)
- Build: `make` (or `go build -o s3 ./weed`) builds the `s3` binary green;
  `cmd/weed-db` and `cmd/weed-sql` also build; `go vet ./weed/command/` clean.
- README/LLM.md rewritten for Hanzo S3; AGENTS.md/CLAUDE.md symlinks preserved.
- Dropped a 33MB prebuilt Mach-O `stress` binary upstream had committed; `.gitignore`
  updated to ignore the `s3` build output.
2026-06-18 23:41:25 -07:00

2210 lines
74 KiB
Go

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.6
// protoc v6.33.4
// source: s3_lifecycle.proto
package s3_lifecycle_pb
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// ActionKind classifies the lifecycle action a single compiled entry
// represents. A single XML rule may produce multiple compiled entries —
// one per populated action.
type ActionKind int32
const (
ActionKind_ACTION_KIND_UNSPECIFIED ActionKind = 0
ActionKind_EXPIRATION_DAYS ActionKind = 1 // Expiration.Days
ActionKind_EXPIRATION_DATE ActionKind = 2 // Expiration.Date
ActionKind_NONCURRENT_DAYS ActionKind = 3 // NoncurrentVersionExpiration.NoncurrentDays (with optional NewerNoncurrent retention)
ActionKind_NEWER_NONCURRENT ActionKind = 4 // NoncurrentVersionExpiration.NewerNoncurrentVersions, count-only (no NoncurrentDays)
ActionKind_ABORT_MPU ActionKind = 5 // AbortIncompleteMultipartUpload.DaysAfterInitiation
ActionKind_EXPIRED_DELETE_MARKER ActionKind = 6 // Expiration.ExpiredObjectDeleteMarker
)
// Enum value maps for ActionKind.
var (
ActionKind_name = map[int32]string{
0: "ACTION_KIND_UNSPECIFIED",
1: "EXPIRATION_DAYS",
2: "EXPIRATION_DATE",
3: "NONCURRENT_DAYS",
4: "NEWER_NONCURRENT",
5: "ABORT_MPU",
6: "EXPIRED_DELETE_MARKER",
}
ActionKind_value = map[string]int32{
"ACTION_KIND_UNSPECIFIED": 0,
"EXPIRATION_DAYS": 1,
"EXPIRATION_DATE": 2,
"NONCURRENT_DAYS": 3,
"NEWER_NONCURRENT": 4,
"ABORT_MPU": 5,
"EXPIRED_DELETE_MARKER": 6,
}
)
func (x ActionKind) Enum() *ActionKind {
p := new(ActionKind)
*p = x
return p
}
func (x ActionKind) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (ActionKind) Descriptor() protoreflect.EnumDescriptor {
return file_s3_lifecycle_proto_enumTypes[0].Descriptor()
}
func (ActionKind) Type() protoreflect.EnumType {
return &file_s3_lifecycle_proto_enumTypes[0]
}
func (x ActionKind) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use ActionKind.Descriptor instead.
func (ActionKind) EnumDescriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{0}
}
// LifecycleDeleteOutcome captures every per-event verdict the worker needs.
// Cursor advance / pending mutation rules:
//
// DONE -> advance cursor / drop pending
// NOOP_RESOLVED -> advance cursor / drop pending (object already gone or stale identity)
// SKIPPED_OBJECT_LOCK -> log + counter; advance cursor (per design: object lock is operator concern)
// RETRY_LATER -> hold cursor; feed retry-budget; next batch retries from same position
// BLOCKED -> hold cursor; durable BlockerRecord written; operator must intervene
type LifecycleDeleteOutcome int32
const (
LifecycleDeleteOutcome_LIFECYCLE_DELETE_OUTCOME_UNSPECIFIED LifecycleDeleteOutcome = 0
LifecycleDeleteOutcome_DONE LifecycleDeleteOutcome = 1
LifecycleDeleteOutcome_NOOP_RESOLVED LifecycleDeleteOutcome = 2
LifecycleDeleteOutcome_SKIPPED_OBJECT_LOCK LifecycleDeleteOutcome = 3
LifecycleDeleteOutcome_RETRY_LATER LifecycleDeleteOutcome = 4
LifecycleDeleteOutcome_BLOCKED LifecycleDeleteOutcome = 5
)
// Enum value maps for LifecycleDeleteOutcome.
var (
LifecycleDeleteOutcome_name = map[int32]string{
0: "LIFECYCLE_DELETE_OUTCOME_UNSPECIFIED",
1: "DONE",
2: "NOOP_RESOLVED",
3: "SKIPPED_OBJECT_LOCK",
4: "RETRY_LATER",
5: "BLOCKED",
}
LifecycleDeleteOutcome_value = map[string]int32{
"LIFECYCLE_DELETE_OUTCOME_UNSPECIFIED": 0,
"DONE": 1,
"NOOP_RESOLVED": 2,
"SKIPPED_OBJECT_LOCK": 3,
"RETRY_LATER": 4,
"BLOCKED": 5,
}
)
func (x LifecycleDeleteOutcome) Enum() *LifecycleDeleteOutcome {
p := new(LifecycleDeleteOutcome)
*p = x
return p
}
func (x LifecycleDeleteOutcome) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (LifecycleDeleteOutcome) Descriptor() protoreflect.EnumDescriptor {
return file_s3_lifecycle_proto_enumTypes[1].Descriptor()
}
func (LifecycleDeleteOutcome) Type() protoreflect.EnumType {
return &file_s3_lifecycle_proto_enumTypes[1]
}
func (x LifecycleDeleteOutcome) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use LifecycleDeleteOutcome.Descriptor instead.
func (LifecycleDeleteOutcome) EnumDescriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{1}
}
// StreamKind classifies the four blockable streams. ORIGINAL/PREDICATE pause
// reader cursors; BOOTSTRAP pauses a bucket walker; PENDING pauses a rule's
// drain task. Zero is an UNSPECIFIED sentinel — a BlockerRecord whose
// stream_kind reads as UNSPECIFIED is a corruption signal, not a default.
type StreamKind int32
const (
StreamKind_STREAM_KIND_UNSPECIFIED StreamKind = 0
StreamKind_ORIGINAL StreamKind = 1
StreamKind_PREDICATE StreamKind = 2
StreamKind_BOOTSTRAP StreamKind = 3
StreamKind_PENDING StreamKind = 4
)
// Enum value maps for StreamKind.
var (
StreamKind_name = map[int32]string{
0: "STREAM_KIND_UNSPECIFIED",
1: "ORIGINAL",
2: "PREDICATE",
3: "BOOTSTRAP",
4: "PENDING",
}
StreamKind_value = map[string]int32{
"STREAM_KIND_UNSPECIFIED": 0,
"ORIGINAL": 1,
"PREDICATE": 2,
"BOOTSTRAP": 3,
"PENDING": 4,
}
)
func (x StreamKind) Enum() *StreamKind {
p := new(StreamKind)
*p = x
return p
}
func (x StreamKind) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (StreamKind) Descriptor() protoreflect.EnumDescriptor {
return file_s3_lifecycle_proto_enumTypes[2].Descriptor()
}
func (StreamKind) Type() protoreflect.EnumType {
return &file_s3_lifecycle_proto_enumTypes[2]
}
func (x StreamKind) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use StreamKind.Descriptor instead.
func (StreamKind) EnumDescriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{2}
}
// Proto3 best practice: zero value is an UNSPECIFIED sentinel so that
// legacy / partially-populated payloads don't silently default to a
// semantically active value. Persisted state files always set explicit
// non-zero values; reading UNSPECIFIED indicates corruption or a missing
// field.
type LifecycleState_RuleMode int32
const (
LifecycleState_RULE_MODE_UNSPECIFIED LifecycleState_RuleMode = 0
LifecycleState_EVENT_DRIVEN LifecycleState_RuleMode = 1
LifecycleState_SCAN_AT_DATE LifecycleState_RuleMode = 2
LifecycleState_SCAN_ONLY LifecycleState_RuleMode = 3
LifecycleState_DISABLED LifecycleState_RuleMode = 4
LifecycleState_PENDING_BOOTSTRAP LifecycleState_RuleMode = 5
)
// Enum value maps for LifecycleState_RuleMode.
var (
LifecycleState_RuleMode_name = map[int32]string{
0: "RULE_MODE_UNSPECIFIED",
1: "EVENT_DRIVEN",
2: "SCAN_AT_DATE",
3: "SCAN_ONLY",
4: "DISABLED",
5: "PENDING_BOOTSTRAP",
}
LifecycleState_RuleMode_value = map[string]int32{
"RULE_MODE_UNSPECIFIED": 0,
"EVENT_DRIVEN": 1,
"SCAN_AT_DATE": 2,
"SCAN_ONLY": 3,
"DISABLED": 4,
"PENDING_BOOTSTRAP": 5,
}
)
func (x LifecycleState_RuleMode) Enum() *LifecycleState_RuleMode {
p := new(LifecycleState_RuleMode)
*p = x
return p
}
func (x LifecycleState_RuleMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (LifecycleState_RuleMode) Descriptor() protoreflect.EnumDescriptor {
return file_s3_lifecycle_proto_enumTypes[3].Descriptor()
}
func (LifecycleState_RuleMode) Type() protoreflect.EnumType {
return &file_s3_lifecycle_proto_enumTypes[3]
}
func (x LifecycleState_RuleMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use LifecycleState_RuleMode.Descriptor instead.
func (LifecycleState_RuleMode) EnumDescriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{5, 0}
}
// DEGRADED_REASON_UNSPECIFIED replaces the old NONE sentinel: an unset
// / zero degraded_reason means "no active degradation" — operators
// treat UNSPECIFIED as healthy.
type LifecycleState_DegradedReason int32
const (
LifecycleState_DEGRADED_REASON_UNSPECIFIED LifecycleState_DegradedReason = 0
LifecycleState_LAG_HIGH LifecycleState_DegradedReason = 1
LifecycleState_PENDING_FULL LifecycleState_DegradedReason = 2
LifecycleState_DELETE_FAILURES LifecycleState_DegradedReason = 3
LifecycleState_OPERATOR_PAUSED LifecycleState_DegradedReason = 4
LifecycleState_RETENTION_BELOW_HORIZON LifecycleState_DegradedReason = 5
LifecycleState_LOST_LOG LifecycleState_DegradedReason = 6
)
// Enum value maps for LifecycleState_DegradedReason.
var (
LifecycleState_DegradedReason_name = map[int32]string{
0: "DEGRADED_REASON_UNSPECIFIED",
1: "LAG_HIGH",
2: "PENDING_FULL",
3: "DELETE_FAILURES",
4: "OPERATOR_PAUSED",
5: "RETENTION_BELOW_HORIZON",
6: "LOST_LOG",
}
LifecycleState_DegradedReason_value = map[string]int32{
"DEGRADED_REASON_UNSPECIFIED": 0,
"LAG_HIGH": 1,
"PENDING_FULL": 2,
"DELETE_FAILURES": 3,
"OPERATOR_PAUSED": 4,
"RETENTION_BELOW_HORIZON": 5,
"LOST_LOG": 6,
}
)
func (x LifecycleState_DegradedReason) Enum() *LifecycleState_DegradedReason {
p := new(LifecycleState_DegradedReason)
*p = x
return p
}
func (x LifecycleState_DegradedReason) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (LifecycleState_DegradedReason) Descriptor() protoreflect.EnumDescriptor {
return file_s3_lifecycle_proto_enumTypes[4].Descriptor()
}
func (LifecycleState_DegradedReason) Type() protoreflect.EnumType {
return &file_s3_lifecycle_proto_enumTypes[4]
}
func (x LifecycleState_DegradedReason) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use LifecycleState_DegradedReason.Descriptor instead.
func (LifecycleState_DegradedReason) EnumDescriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{5, 1}
}
type LifecycleDeleteRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Routing.
Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
ObjectPath string `protobuf:"bytes,2,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"` // bucket-relative; no leading slash
VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` // empty for non-versioned
RuleHash []byte `protobuf:"bytes,4,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"` // 8 bytes; matches the rule's per-rule dir
ActionKind ActionKind `protobuf:"varint,5,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"` // chooses dispatch within the rule
// Stream context (echoed in BlockerRecord on FATAL outcomes so operators
// can resolve the right (shard, delay) tuple).
StreamShard string `protobuf:"bytes,10,opt,name=stream_shard,json=streamShard,proto3" json:"stream_shard,omitempty"`
StreamDelaySeconds int64 `protobuf:"varint,11,opt,name=stream_delay_seconds,json=streamDelaySeconds,proto3" json:"stream_delay_seconds,omitempty"`
StreamPositionTsNs int64 `protobuf:"varint,12,opt,name=stream_position_ts_ns,json=streamPositionTsNs,proto3" json:"stream_position_ts_ns,omitempty"`
StreamPositionOffset int64 `protobuf:"varint,13,opt,name=stream_position_offset,json=streamPositionOffset,proto3" json:"stream_position_offset,omitempty"`
// CAS witness. The server re-fetches the live entry and aborts as
// NOOP_RESOLVED (STALE_IDENTITY) if any field doesn't match.
ExpectedIdentity *EntryIdentity `protobuf:"bytes,20,opt,name=expected_identity,json=expectedIdentity,proto3" json:"expected_identity,omitempty"`
// Snapshot id at the time the worker computed this verdict; the server
// verifies the (rule_hash, action_kind) is still in the current policy
// snapshot and aborts as NOOP_RESOLVED (STALE_POLICY) if not.
EngineSnapshotId uint64 `protobuf:"varint,21,opt,name=engine_snapshot_id,json=engineSnapshotId,proto3" json:"engine_snapshot_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *LifecycleDeleteRequest) Reset() {
*x = LifecycleDeleteRequest{}
mi := &file_s3_lifecycle_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *LifecycleDeleteRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LifecycleDeleteRequest) ProtoMessage() {}
func (x *LifecycleDeleteRequest) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use LifecycleDeleteRequest.ProtoReflect.Descriptor instead.
func (*LifecycleDeleteRequest) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{0}
}
func (x *LifecycleDeleteRequest) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *LifecycleDeleteRequest) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *LifecycleDeleteRequest) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *LifecycleDeleteRequest) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *LifecycleDeleteRequest) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
func (x *LifecycleDeleteRequest) GetStreamShard() string {
if x != nil {
return x.StreamShard
}
return ""
}
func (x *LifecycleDeleteRequest) GetStreamDelaySeconds() int64 {
if x != nil {
return x.StreamDelaySeconds
}
return 0
}
func (x *LifecycleDeleteRequest) GetStreamPositionTsNs() int64 {
if x != nil {
return x.StreamPositionTsNs
}
return 0
}
func (x *LifecycleDeleteRequest) GetStreamPositionOffset() int64 {
if x != nil {
return x.StreamPositionOffset
}
return 0
}
func (x *LifecycleDeleteRequest) GetExpectedIdentity() *EntryIdentity {
if x != nil {
return x.ExpectedIdentity
}
return nil
}
func (x *LifecycleDeleteRequest) GetEngineSnapshotId() uint64 {
if x != nil {
return x.EngineSnapshotId
}
return 0
}
type LifecycleDeleteResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Outcome LifecycleDeleteOutcome `protobuf:"varint,1,opt,name=outcome,proto3,enum=s3_lifecycle_pb.LifecycleDeleteOutcome" json:"outcome,omitempty"`
// Human-readable cause, e.g. "STALE_IDENTITY: mtime drift",
// "FATAL_EVENT_ERROR: malformed entry", or "TRANSPORT_ERROR: filer
// unavailable". Echoed into BlockerRecord.last_error on FATAL.
Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *LifecycleDeleteResponse) Reset() {
*x = LifecycleDeleteResponse{}
mi := &file_s3_lifecycle_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *LifecycleDeleteResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LifecycleDeleteResponse) ProtoMessage() {}
func (x *LifecycleDeleteResponse) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use LifecycleDeleteResponse.ProtoReflect.Descriptor instead.
func (*LifecycleDeleteResponse) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{1}
}
func (x *LifecycleDeleteResponse) GetOutcome() LifecycleDeleteOutcome {
if x != nil {
return x.Outcome
}
return LifecycleDeleteOutcome_LIFECYCLE_DELETE_OUTCOME_UNSPECIFIED
}
func (x *LifecycleDeleteResponse) GetReason() string {
if x != nil {
return x.Reason
}
return ""
}
// MessagePosition mirrors weed/util/log_buffer.MessagePosition for durable
// storage. ts_ns + offset uniquely identifies a position within a per-filer
// log buffer; per-shard cursors (see ReaderState) use this shape to skip past
// already-processed events when replaying.
type MessagePosition struct {
state protoimpl.MessageState `protogen:"open.v1"`
TsNs int64 `protobuf:"varint,1,opt,name=ts_ns,json=tsNs,proto3" json:"ts_ns,omitempty"`
Offset int64 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *MessagePosition) Reset() {
*x = MessagePosition{}
mi := &file_s3_lifecycle_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *MessagePosition) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*MessagePosition) ProtoMessage() {}
func (x *MessagePosition) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use MessagePosition.ProtoReflect.Descriptor instead.
func (*MessagePosition) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{2}
}
func (x *MessagePosition) GetTsNs() int64 {
if x != nil {
return x.TsNs
}
return 0
}
func (x *MessagePosition) GetOffset() int64 {
if x != nil {
return x.Offset
}
return 0
}
// Cursor map keyed by filer_id. Each delay group's cursor (ReaderState) and
// the predicate cursor (ReaderState) are per-filer-shard maps because
// LogEntry.Offset is per-filer and not globally unique.
type FilerShardCursor struct {
state protoimpl.MessageState `protogen:"open.v1"`
FilerId string `protobuf:"bytes,1,opt,name=filer_id,json=filerId,proto3" json:"filer_id,omitempty"`
Position *MessagePosition `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *FilerShardCursor) Reset() {
*x = FilerShardCursor{}
mi := &file_s3_lifecycle_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *FilerShardCursor) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*FilerShardCursor) ProtoMessage() {}
func (x *FilerShardCursor) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use FilerShardCursor.ProtoReflect.Descriptor instead.
func (*FilerShardCursor) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{3}
}
func (x *FilerShardCursor) GetFilerId() string {
if x != nil {
return x.FilerId
}
return ""
}
func (x *FilerShardCursor) GetPosition() *MessagePosition {
if x != nil {
return x.Position
}
return nil
}
// EntryIdentity is the CAS witness used by LifecycleDelete to detect that
// the live entry hasn't changed between worker decision and server execution.
// Mismatch -> STALE_IDENTITY -> NOOP_RESOLVED.
type EntryIdentity struct {
state protoimpl.MessageState `protogen:"open.v1"`
MtimeNs int64 `protobuf:"varint,1,opt,name=mtime_ns,json=mtimeNs,proto3" json:"mtime_ns,omitempty"`
Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"`
HeadFid string `protobuf:"bytes,3,opt,name=head_fid,json=headFid,proto3" json:"head_fid,omitempty"`
ExtendedHash []byte `protobuf:"bytes,4,opt,name=extended_hash,json=extendedHash,proto3" json:"extended_hash,omitempty"` // sha256 over sorted Extended map; cheap and stable
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *EntryIdentity) Reset() {
*x = EntryIdentity{}
mi := &file_s3_lifecycle_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *EntryIdentity) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*EntryIdentity) ProtoMessage() {}
func (x *EntryIdentity) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[4]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use EntryIdentity.ProtoReflect.Descriptor instead.
func (*EntryIdentity) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{4}
}
func (x *EntryIdentity) GetMtimeNs() int64 {
if x != nil {
return x.MtimeNs
}
return 0
}
func (x *EntryIdentity) GetSize() int64 {
if x != nil {
return x.Size
}
return 0
}
func (x *EntryIdentity) GetHeadFid() string {
if x != nil {
return x.HeadFid
}
return ""
}
func (x *EntryIdentity) GetExtendedHash() []byte {
if x != nil {
return x.ExtendedHash
}
return nil
}
// LifecycleState captures the durable per-action scheduling state. Keyed by
// (rule_hash, action_kind); persisted at
//
// /etc/s3/lifecycle/<bucket>/<rule_hash_hex>/<action_kind>/state
//
// A single XML <Rule> with N populated action sub-elements expands into N
// LifecycleState records, one per sibling action.
type LifecycleState struct {
state protoimpl.MessageState `protogen:"open.v1"`
RuleHash []byte `protobuf:"bytes,1,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"` // 8 bytes; matches the parent rule dir
ActionKind ActionKind `protobuf:"varint,2,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"` // matches the leaf dir name
RuleId string `protobuf:"bytes,3,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` // display only; identical across sibling actions
Mode LifecycleState_RuleMode `protobuf:"varint,4,opt,name=mode,proto3,enum=s3_lifecycle_pb.LifecycleState_RuleMode" json:"mode,omitempty"`
DegradedReason LifecycleState_DegradedReason `protobuf:"varint,5,opt,name=degraded_reason,json=degradedReason,proto3,enum=s3_lifecycle_pb.LifecycleState_DegradedReason" json:"degraded_reason,omitempty"`
DegradedSinceNs int64 `protobuf:"varint,6,opt,name=degraded_since_ns,json=degradedSinceNs,proto3" json:"degraded_since_ns,omitempty"`
BootstrapComplete bool `protobuf:"varint,7,opt,name=bootstrap_complete,json=bootstrapComplete,proto3" json:"bootstrap_complete,omitempty"`
BootstrapStartedAtNs int64 `protobuf:"varint,8,opt,name=bootstrap_started_at_ns,json=bootstrapStartedAtNs,proto3" json:"bootstrap_started_at_ns,omitempty"`
BootstrapCompletedAtNs int64 `protobuf:"varint,9,opt,name=bootstrap_completed_at_ns,json=bootstrapCompletedAtNs,proto3" json:"bootstrap_completed_at_ns,omitempty"`
// Safety-scan scheduling. Set by the safety-scan job when a SCAN_ONLY
// (or periodic safety-scan) bootstrap pass completes; consulted by the
// detector to decide whether to emit the next bootstrap task.
LastSafetyScanTsNs int64 `protobuf:"varint,10,opt,name=last_safety_scan_ts_ns,json=lastSafetyScanTsNs,proto3" json:"last_safety_scan_ts_ns,omitempty"`
NextSafetyScanTsNs int64 `protobuf:"varint,11,opt,name=next_safety_scan_ts_ns,json=nextSafetyScanTsNs,proto3" json:"next_safety_scan_ts_ns,omitempty"`
// Counters for observability; no behavior depends on these.
// - evaluated_total: live entries the worker considered for this action
// (filter-matched + due-checked); includes objects that ended up not
// yet eligible.
// - expired_total: successful DONE outcomes (object/version/marker/MPU
// removed) under this action.
// - metadata_only_total: subset of expired_total where the worker
// short-circuited via volume-TTL routing (chunks left to volume GC).
// - error_total: outcomes that did NOT advance the cursor under this
// action (RETRY_LATER, BLOCKED, FATAL_EVENT_ERROR).
EvaluatedTotal int64 `protobuf:"varint,12,opt,name=evaluated_total,json=evaluatedTotal,proto3" json:"evaluated_total,omitempty"`
ExpiredTotal int64 `protobuf:"varint,13,opt,name=expired_total,json=expiredTotal,proto3" json:"expired_total,omitempty"`
MetadataOnlyTotal int64 `protobuf:"varint,14,opt,name=metadata_only_total,json=metadataOnlyTotal,proto3" json:"metadata_only_total,omitempty"`
ErrorTotal int64 `protobuf:"varint,15,opt,name=error_total,json=errorTotal,proto3" json:"error_total,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *LifecycleState) Reset() {
*x = LifecycleState{}
mi := &file_s3_lifecycle_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *LifecycleState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LifecycleState) ProtoMessage() {}
func (x *LifecycleState) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[5]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use LifecycleState.ProtoReflect.Descriptor instead.
func (*LifecycleState) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{5}
}
func (x *LifecycleState) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *LifecycleState) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
func (x *LifecycleState) GetRuleId() string {
if x != nil {
return x.RuleId
}
return ""
}
func (x *LifecycleState) GetMode() LifecycleState_RuleMode {
if x != nil {
return x.Mode
}
return LifecycleState_RULE_MODE_UNSPECIFIED
}
func (x *LifecycleState) GetDegradedReason() LifecycleState_DegradedReason {
if x != nil {
return x.DegradedReason
}
return LifecycleState_DEGRADED_REASON_UNSPECIFIED
}
func (x *LifecycleState) GetDegradedSinceNs() int64 {
if x != nil {
return x.DegradedSinceNs
}
return 0
}
func (x *LifecycleState) GetBootstrapComplete() bool {
if x != nil {
return x.BootstrapComplete
}
return false
}
func (x *LifecycleState) GetBootstrapStartedAtNs() int64 {
if x != nil {
return x.BootstrapStartedAtNs
}
return 0
}
func (x *LifecycleState) GetBootstrapCompletedAtNs() int64 {
if x != nil {
return x.BootstrapCompletedAtNs
}
return 0
}
func (x *LifecycleState) GetLastSafetyScanTsNs() int64 {
if x != nil {
return x.LastSafetyScanTsNs
}
return 0
}
func (x *LifecycleState) GetNextSafetyScanTsNs() int64 {
if x != nil {
return x.NextSafetyScanTsNs
}
return 0
}
func (x *LifecycleState) GetEvaluatedTotal() int64 {
if x != nil {
return x.EvaluatedTotal
}
return 0
}
func (x *LifecycleState) GetExpiredTotal() int64 {
if x != nil {
return x.ExpiredTotal
}
return 0
}
func (x *LifecycleState) GetMetadataOnlyTotal() int64 {
if x != nil {
return x.MetadataOnlyTotal
}
return 0
}
func (x *LifecycleState) GetErrorTotal() int64 {
if x != nil {
return x.ErrorTotal
}
return 0
}
// PendingItem records a not-yet-due eligibility for late-predicate exceptions
// (e.g. tag added at age 30d on a 60d rule). Drained by s3.lifecycle.drain.
// One use only — not the steady-state path.
type PendingItem struct {
state protoimpl.MessageState `protogen:"open.v1"`
ObjectPath string `protobuf:"bytes,1,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"`
VersionId string `protobuf:"bytes,2,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
DueAtNs int64 `protobuf:"varint,3,opt,name=due_at_ns,json=dueAtNs,proto3" json:"due_at_ns,omitempty"`
ExpectedIdentity *EntryIdentity `protobuf:"bytes,4,opt,name=expected_identity,json=expectedIdentity,proto3" json:"expected_identity,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *PendingItem) Reset() {
*x = PendingItem{}
mi := &file_s3_lifecycle_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *PendingItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PendingItem) ProtoMessage() {}
func (x *PendingItem) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PendingItem.ProtoReflect.Descriptor instead.
func (*PendingItem) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{6}
}
func (x *PendingItem) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *PendingItem) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *PendingItem) GetDueAtNs() int64 {
if x != nil {
return x.DueAtNs
}
return 0
}
func (x *PendingItem) GetExpectedIdentity() *EntryIdentity {
if x != nil {
return x.ExpectedIdentity
}
return nil
}
// BootstrapState tracks the bucket walker's resume point. Operator-resolution
// of a BOOTSTRAP-stream blocker does NOT mutate this field — the next
// scheduled bootstrap task picks up from last_scanned_path and re-walks.
type BootstrapState struct {
state protoimpl.MessageState `protogen:"open.v1"`
LastScannedPath string `protobuf:"bytes,1,opt,name=last_scanned_path,json=lastScannedPath,proto3" json:"last_scanned_path,omitempty"`
StartedAtNs int64 `protobuf:"varint,2,opt,name=started_at_ns,json=startedAtNs,proto3" json:"started_at_ns,omitempty"`
CompletedAtNs int64 `protobuf:"varint,3,opt,name=completed_at_ns,json=completedAtNs,proto3" json:"completed_at_ns,omitempty"` // zero while in progress
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BootstrapState) Reset() {
*x = BootstrapState{}
mi := &file_s3_lifecycle_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BootstrapState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BootstrapState) ProtoMessage() {}
func (x *BootstrapState) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[7]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BootstrapState.ProtoReflect.Descriptor instead.
func (*BootstrapState) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{7}
}
func (x *BootstrapState) GetLastScannedPath() string {
if x != nil {
return x.LastScannedPath
}
return ""
}
func (x *BootstrapState) GetStartedAtNs() int64 {
if x != nil {
return x.StartedAtNs
}
return 0
}
func (x *BootstrapState) GetCompletedAtNs() int64 {
if x != nil {
return x.CompletedAtNs
}
return 0
}
// ReaderState is the cluster-singleton reader's durable cursors. One file at
// /etc/s3/lifecycle/_reader/reader_state, written by the singleton task.
type ReaderState struct {
state protoimpl.MessageState `protogen:"open.v1"`
PrimaryFilerEndpoint string `protobuf:"bytes,1,opt,name=primary_filer_endpoint,json=primaryFilerEndpoint,proto3" json:"primary_filer_endpoint,omitempty"`
// Per-delay-group, per-filer-shard cursors. Outer key is delay_seconds.
// Inner FilerShardCursor list maps filer_id -> MessagePosition.
LastProcessedOriginal map[int64]*FilerShardCursorList `protobuf:"bytes,2,rep,name=last_processed_original,json=lastProcessedOriginal,proto3" json:"last_processed_original,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
// Predicate-change pass cursor, keyed by filer_id.
LastProcessedPredicate []*FilerShardCursor `protobuf:"bytes,3,rep,name=last_processed_predicate,json=lastProcessedPredicate,proto3" json:"last_processed_predicate,omitempty"`
// Filer-shard keys whose cursor reached range.latest and were safely GC'd.
// Used by the lost-log gate at task entry to distinguish "F was tail-drained
// safely then pruned" from "F's logs vanished before catch-up". Encoded as
// stream-specific keys (same shape as RetryBudgetEntry.StreamKey).
TailDrainedStreams []*TailDrainedKey `protobuf:"bytes,4,rep,name=tail_drained_streams,json=tailDrainedStreams,proto3" json:"tail_drained_streams,omitempty"`
LastCheckpointNs int64 `protobuf:"varint,5,opt,name=last_checkpoint_ns,json=lastCheckpointNs,proto3" json:"last_checkpoint_ns,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ReaderState) Reset() {
*x = ReaderState{}
mi := &file_s3_lifecycle_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ReaderState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReaderState) ProtoMessage() {}
func (x *ReaderState) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[8]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReaderState.ProtoReflect.Descriptor instead.
func (*ReaderState) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{8}
}
func (x *ReaderState) GetPrimaryFilerEndpoint() string {
if x != nil {
return x.PrimaryFilerEndpoint
}
return ""
}
func (x *ReaderState) GetLastProcessedOriginal() map[int64]*FilerShardCursorList {
if x != nil {
return x.LastProcessedOriginal
}
return nil
}
func (x *ReaderState) GetLastProcessedPredicate() []*FilerShardCursor {
if x != nil {
return x.LastProcessedPredicate
}
return nil
}
func (x *ReaderState) GetTailDrainedStreams() []*TailDrainedKey {
if x != nil {
return x.TailDrainedStreams
}
return nil
}
func (x *ReaderState) GetLastCheckpointNs() int64 {
if x != nil {
return x.LastCheckpointNs
}
return 0
}
type FilerShardCursorList struct {
state protoimpl.MessageState `protogen:"open.v1"`
Cursors []*FilerShardCursor `protobuf:"bytes,1,rep,name=cursors,proto3" json:"cursors,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *FilerShardCursorList) Reset() {
*x = FilerShardCursorList{}
mi := &file_s3_lifecycle_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *FilerShardCursorList) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*FilerShardCursorList) ProtoMessage() {}
func (x *FilerShardCursorList) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[9]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use FilerShardCursorList.ProtoReflect.Descriptor instead.
func (*FilerShardCursorList) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{9}
}
func (x *FilerShardCursorList) GetCursors() []*FilerShardCursor {
if x != nil {
return x.Cursors
}
return nil
}
// TailDrainedKey identifies a (stream_kind, shard, [delay]) tuple whose
// cursor previously caught up to range.latest. Persisted in ReaderState so
// the lost-log gate can distinguish safe drain from data loss.
type TailDrainedKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
StreamKind StreamKind `protobuf:"varint,1,opt,name=stream_kind,json=streamKind,proto3,enum=s3_lifecycle_pb.StreamKind" json:"stream_kind,omitempty"`
FilerId string `protobuf:"bytes,2,opt,name=filer_id,json=filerId,proto3" json:"filer_id,omitempty"`
DelaySeconds int64 `protobuf:"varint,3,opt,name=delay_seconds,json=delaySeconds,proto3" json:"delay_seconds,omitempty"` // populated when stream_kind == ORIGINAL
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *TailDrainedKey) Reset() {
*x = TailDrainedKey{}
mi := &file_s3_lifecycle_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *TailDrainedKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*TailDrainedKey) ProtoMessage() {}
func (x *TailDrainedKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[10]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use TailDrainedKey.ProtoReflect.Descriptor instead.
func (*TailDrainedKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{10}
}
func (x *TailDrainedKey) GetStreamKind() StreamKind {
if x != nil {
return x.StreamKind
}
return StreamKind_STREAM_KIND_UNSPECIFIED
}
func (x *TailDrainedKey) GetFilerId() string {
if x != nil {
return x.FilerId
}
return ""
}
func (x *TailDrainedKey) GetDelaySeconds() int64 {
if x != nil {
return x.DelaySeconds
}
return 0
}
// BlockerRecord is the durable record of a paused stream. The cursor stays
// at the failing position until the operator clears it via
// `s3.lifecycle.blockers retry|resume|quarantine`. There is no automatic
// dead-letter — silently routing a failed delete decision aside is unsafe
// for lifecycle.
type BlockerRecord struct {
state protoimpl.MessageState `protogen:"open.v1"`
StreamKind StreamKind `protobuf:"varint,1,opt,name=stream_kind,json=streamKind,proto3,enum=s3_lifecycle_pb.StreamKind" json:"stream_kind,omitempty"`
// Stream-specific scoping; populated per stream_kind.
Shard string `protobuf:"bytes,2,opt,name=shard,proto3" json:"shard,omitempty"` // filer_id; ORIGINAL/PREDICATE only
DelaySeconds int64 `protobuf:"varint,3,opt,name=delay_seconds,json=delaySeconds,proto3" json:"delay_seconds,omitempty"` // ORIGINAL only
Position *MessagePosition `protobuf:"bytes,4,opt,name=position,proto3" json:"position,omitempty"` // ORIGINAL/PREDICATE only
// Common context. bucket/object_path/version_id always populated.
// rule_hash and action_kind are OPTIONAL: empty / UNSPECIFIED for
// pre-evaluation failures (e.g. handleEvent fetchLive FATAL where no
// action has been evaluated). When populated, both are set together —
// the failure is bound to a specific (rule, action) pair.
RuleHash []byte `protobuf:"bytes,5,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"`
Bucket string `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"`
ObjectPath string `protobuf:"bytes,7,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"`
VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
ActionKind ActionKind `protobuf:"varint,14,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"` // optional; UNSPECIFIED for pre-evaluation failures
Reason string `protobuf:"bytes,9,opt,name=reason,proto3" json:"reason,omitempty"` // "FATAL_EVENT_ERROR: malformed entry"
LastError string `protobuf:"bytes,10,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` // raw error string from the last attempt
FirstSeenAtNs int64 `protobuf:"varint,11,opt,name=first_seen_at_ns,json=firstSeenAtNs,proto3" json:"first_seen_at_ns,omitempty"`
LastRetryAtNs int64 `protobuf:"varint,12,opt,name=last_retry_at_ns,json=lastRetryAtNs,proto3" json:"last_retry_at_ns,omitempty"`
RetryCount int32 `protobuf:"varint,13,opt,name=retry_count,json=retryCount,proto3" json:"retry_count,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BlockerRecord) Reset() {
*x = BlockerRecord{}
mi := &file_s3_lifecycle_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BlockerRecord) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BlockerRecord) ProtoMessage() {}
func (x *BlockerRecord) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[11]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BlockerRecord.ProtoReflect.Descriptor instead.
func (*BlockerRecord) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{11}
}
func (x *BlockerRecord) GetStreamKind() StreamKind {
if x != nil {
return x.StreamKind
}
return StreamKind_STREAM_KIND_UNSPECIFIED
}
func (x *BlockerRecord) GetShard() string {
if x != nil {
return x.Shard
}
return ""
}
func (x *BlockerRecord) GetDelaySeconds() int64 {
if x != nil {
return x.DelaySeconds
}
return 0
}
func (x *BlockerRecord) GetPosition() *MessagePosition {
if x != nil {
return x.Position
}
return nil
}
func (x *BlockerRecord) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *BlockerRecord) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *BlockerRecord) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *BlockerRecord) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *BlockerRecord) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
func (x *BlockerRecord) GetReason() string {
if x != nil {
return x.Reason
}
return ""
}
func (x *BlockerRecord) GetLastError() string {
if x != nil {
return x.LastError
}
return ""
}
func (x *BlockerRecord) GetFirstSeenAtNs() int64 {
if x != nil {
return x.FirstSeenAtNs
}
return 0
}
func (x *BlockerRecord) GetLastRetryAtNs() int64 {
if x != nil {
return x.LastRetryAtNs
}
return 0
}
func (x *BlockerRecord) GetRetryCount() int32 {
if x != nil {
return x.RetryCount
}
return 0
}
// StreamKey is the shape used by retry-budget tracking. One of four shapes
// per stream_kind, since the identifying tuple differs.
type StreamKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Types that are valid to be assigned to Key:
//
// *StreamKey_Original
// *StreamKey_Predicate
// *StreamKey_Bootstrap
// *StreamKey_Pending
Key isStreamKey_Key `protobuf_oneof:"key"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *StreamKey) Reset() {
*x = StreamKey{}
mi := &file_s3_lifecycle_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *StreamKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*StreamKey) ProtoMessage() {}
func (x *StreamKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[12]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use StreamKey.ProtoReflect.Descriptor instead.
func (*StreamKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{12}
}
func (x *StreamKey) GetKey() isStreamKey_Key {
if x != nil {
return x.Key
}
return nil
}
func (x *StreamKey) GetOriginal() *OriginalKey {
if x != nil {
if x, ok := x.Key.(*StreamKey_Original); ok {
return x.Original
}
}
return nil
}
func (x *StreamKey) GetPredicate() *PredicateKey {
if x != nil {
if x, ok := x.Key.(*StreamKey_Predicate); ok {
return x.Predicate
}
}
return nil
}
func (x *StreamKey) GetBootstrap() *BootstrapKey {
if x != nil {
if x, ok := x.Key.(*StreamKey_Bootstrap); ok {
return x.Bootstrap
}
}
return nil
}
func (x *StreamKey) GetPending() *PendingKey {
if x != nil {
if x, ok := x.Key.(*StreamKey_Pending); ok {
return x.Pending
}
}
return nil
}
type isStreamKey_Key interface {
isStreamKey_Key()
}
type StreamKey_Original struct {
Original *OriginalKey `protobuf:"bytes,1,opt,name=original,proto3,oneof"`
}
type StreamKey_Predicate struct {
Predicate *PredicateKey `protobuf:"bytes,2,opt,name=predicate,proto3,oneof"`
}
type StreamKey_Bootstrap struct {
Bootstrap *BootstrapKey `protobuf:"bytes,3,opt,name=bootstrap,proto3,oneof"`
}
type StreamKey_Pending struct {
Pending *PendingKey `protobuf:"bytes,4,opt,name=pending,proto3,oneof"`
}
func (*StreamKey_Original) isStreamKey_Key() {}
func (*StreamKey_Predicate) isStreamKey_Key() {}
func (*StreamKey_Bootstrap) isStreamKey_Key() {}
func (*StreamKey_Pending) isStreamKey_Key() {}
type OriginalKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
Shard string `protobuf:"bytes,1,opt,name=shard,proto3" json:"shard,omitempty"`
DelaySeconds int64 `protobuf:"varint,2,opt,name=delay_seconds,json=delaySeconds,proto3" json:"delay_seconds,omitempty"`
Position *MessagePosition `protobuf:"bytes,3,opt,name=position,proto3" json:"position,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *OriginalKey) Reset() {
*x = OriginalKey{}
mi := &file_s3_lifecycle_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *OriginalKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OriginalKey) ProtoMessage() {}
func (x *OriginalKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[13]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use OriginalKey.ProtoReflect.Descriptor instead.
func (*OriginalKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{13}
}
func (x *OriginalKey) GetShard() string {
if x != nil {
return x.Shard
}
return ""
}
func (x *OriginalKey) GetDelaySeconds() int64 {
if x != nil {
return x.DelaySeconds
}
return 0
}
func (x *OriginalKey) GetPosition() *MessagePosition {
if x != nil {
return x.Position
}
return nil
}
type PredicateKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
Shard string `protobuf:"bytes,1,opt,name=shard,proto3" json:"shard,omitempty"`
Position *MessagePosition `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *PredicateKey) Reset() {
*x = PredicateKey{}
mi := &file_s3_lifecycle_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *PredicateKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PredicateKey) ProtoMessage() {}
func (x *PredicateKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[14]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PredicateKey.ProtoReflect.Descriptor instead.
func (*PredicateKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{14}
}
func (x *PredicateKey) GetShard() string {
if x != nil {
return x.Shard
}
return ""
}
func (x *PredicateKey) GetPosition() *MessagePosition {
if x != nil {
return x.Position
}
return nil
}
type BootstrapKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
ObjectPath string `protobuf:"bytes,2,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"`
VersionId string `protobuf:"bytes,3,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
RuleHash []byte `protobuf:"bytes,4,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"`
ActionKind ActionKind `protobuf:"varint,5,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"` // distinguishes per-action streams under one rule
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BootstrapKey) Reset() {
*x = BootstrapKey{}
mi := &file_s3_lifecycle_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BootstrapKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BootstrapKey) ProtoMessage() {}
func (x *BootstrapKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[15]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BootstrapKey.ProtoReflect.Descriptor instead.
func (*BootstrapKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{15}
}
func (x *BootstrapKey) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *BootstrapKey) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *BootstrapKey) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *BootstrapKey) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *BootstrapKey) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
type PendingKey struct {
state protoimpl.MessageState `protogen:"open.v1"`
Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
RuleHash []byte `protobuf:"bytes,2,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"`
ObjectPath string `protobuf:"bytes,3,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"`
VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
ActionKind ActionKind `protobuf:"varint,5,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *PendingKey) Reset() {
*x = PendingKey{}
mi := &file_s3_lifecycle_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *PendingKey) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PendingKey) ProtoMessage() {}
func (x *PendingKey) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[16]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PendingKey.ProtoReflect.Descriptor instead.
func (*PendingKey) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{16}
}
func (x *PendingKey) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *PendingKey) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *PendingKey) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *PendingKey) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *PendingKey) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
// RetryBudgetEntry tracks consecutive RETRY_LATER outcomes for a stream key.
// Promotes to BLOCKED when consecutive_retries >= retryBudgetMax (30) or age
// >= retryBudgetMaxAge (4h). Compacts on success (clearRetryBudget).
type RetryBudgetEntry struct {
state protoimpl.MessageState `protogen:"open.v1"`
Key *StreamKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
ConsecutiveRetries int32 `protobuf:"varint,2,opt,name=consecutive_retries,json=consecutiveRetries,proto3" json:"consecutive_retries,omitempty"`
FirstSeenAtNs int64 `protobuf:"varint,3,opt,name=first_seen_at_ns,json=firstSeenAtNs,proto3" json:"first_seen_at_ns,omitempty"`
LastRetryAtNs int64 `protobuf:"varint,4,opt,name=last_retry_at_ns,json=lastRetryAtNs,proto3" json:"last_retry_at_ns,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RetryBudgetEntry) Reset() {
*x = RetryBudgetEntry{}
mi := &file_s3_lifecycle_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RetryBudgetEntry) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RetryBudgetEntry) ProtoMessage() {}
func (x *RetryBudgetEntry) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[17]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RetryBudgetEntry.ProtoReflect.Descriptor instead.
func (*RetryBudgetEntry) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{17}
}
func (x *RetryBudgetEntry) GetKey() *StreamKey {
if x != nil {
return x.Key
}
return nil
}
func (x *RetryBudgetEntry) GetConsecutiveRetries() int32 {
if x != nil {
return x.ConsecutiveRetries
}
return 0
}
func (x *RetryBudgetEntry) GetFirstSeenAtNs() int64 {
if x != nil {
return x.FirstSeenAtNs
}
return 0
}
func (x *RetryBudgetEntry) GetLastRetryAtNs() int64 {
if x != nil {
return x.LastRetryAtNs
}
return 0
}
// RetryTarget carries routing info needed to (a) write a BlockerRecord on
// promotion and (b) re-invoke the right primitive on operator retry. We
// deliberately do NOT carry expected_identity or action: the handler
// re-fetches live state and re-evaluates from scratch.
type RetryTarget struct {
state protoimpl.MessageState `protogen:"open.v1"`
Key *StreamKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
ObjectPath string `protobuf:"bytes,3,opt,name=object_path,json=objectPath,proto3" json:"object_path,omitempty"`
VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"`
RuleHash []byte `protobuf:"bytes,5,opt,name=rule_hash,json=ruleHash,proto3" json:"rule_hash,omitempty"`
ActionKind ActionKind `protobuf:"varint,6,opt,name=action_kind,json=actionKind,proto3,enum=s3_lifecycle_pb.ActionKind" json:"action_kind,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RetryTarget) Reset() {
*x = RetryTarget{}
mi := &file_s3_lifecycle_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RetryTarget) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RetryTarget) ProtoMessage() {}
func (x *RetryTarget) ProtoReflect() protoreflect.Message {
mi := &file_s3_lifecycle_proto_msgTypes[18]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RetryTarget.ProtoReflect.Descriptor instead.
func (*RetryTarget) Descriptor() ([]byte, []int) {
return file_s3_lifecycle_proto_rawDescGZIP(), []int{18}
}
func (x *RetryTarget) GetKey() *StreamKey {
if x != nil {
return x.Key
}
return nil
}
func (x *RetryTarget) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *RetryTarget) GetObjectPath() string {
if x != nil {
return x.ObjectPath
}
return ""
}
func (x *RetryTarget) GetVersionId() string {
if x != nil {
return x.VersionId
}
return ""
}
func (x *RetryTarget) GetRuleHash() []byte {
if x != nil {
return x.RuleHash
}
return nil
}
func (x *RetryTarget) GetActionKind() ActionKind {
if x != nil {
return x.ActionKind
}
return ActionKind_ACTION_KIND_UNSPECIFIED
}
var File_s3_lifecycle_proto protoreflect.FileDescriptor
const file_s3_lifecycle_proto_rawDesc = "" +
"\n" +
"\x12s3_lifecycle.proto\x12\x0fs3_lifecycle_pb\"\x84\x04\n" +
"\x16LifecycleDeleteRequest\x12\x16\n" +
"\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x1f\n" +
"\vobject_path\x18\x02 \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\x03 \x01(\tR\tversionId\x12\x1b\n" +
"\trule_hash\x18\x04 \x01(\fR\bruleHash\x12<\n" +
"\vaction_kind\x18\x05 \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind\x12!\n" +
"\fstream_shard\x18\n" +
" \x01(\tR\vstreamShard\x120\n" +
"\x14stream_delay_seconds\x18\v \x01(\x03R\x12streamDelaySeconds\x121\n" +
"\x15stream_position_ts_ns\x18\f \x01(\x03R\x12streamPositionTsNs\x124\n" +
"\x16stream_position_offset\x18\r \x01(\x03R\x14streamPositionOffset\x12K\n" +
"\x11expected_identity\x18\x14 \x01(\v2\x1e.s3_lifecycle_pb.EntryIdentityR\x10expectedIdentity\x12,\n" +
"\x12engine_snapshot_id\x18\x15 \x01(\x04R\x10engineSnapshotId\"t\n" +
"\x17LifecycleDeleteResponse\x12A\n" +
"\aoutcome\x18\x01 \x01(\x0e2'.s3_lifecycle_pb.LifecycleDeleteOutcomeR\aoutcome\x12\x16\n" +
"\x06reason\x18\x02 \x01(\tR\x06reason\">\n" +
"\x0fMessagePosition\x12\x13\n" +
"\x05ts_ns\x18\x01 \x01(\x03R\x04tsNs\x12\x16\n" +
"\x06offset\x18\x02 \x01(\x03R\x06offset\"k\n" +
"\x10FilerShardCursor\x12\x19\n" +
"\bfiler_id\x18\x01 \x01(\tR\afilerId\x12<\n" +
"\bposition\x18\x02 \x01(\v2 .s3_lifecycle_pb.MessagePositionR\bposition\"~\n" +
"\rEntryIdentity\x12\x19\n" +
"\bmtime_ns\x18\x01 \x01(\x03R\amtimeNs\x12\x12\n" +
"\x04size\x18\x02 \x01(\x03R\x04size\x12\x19\n" +
"\bhead_fid\x18\x03 \x01(\tR\aheadFid\x12#\n" +
"\rextended_hash\x18\x04 \x01(\fR\fextendedHash\"\x97\b\n" +
"\x0eLifecycleState\x12\x1b\n" +
"\trule_hash\x18\x01 \x01(\fR\bruleHash\x12<\n" +
"\vaction_kind\x18\x02 \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind\x12\x17\n" +
"\arule_id\x18\x03 \x01(\tR\x06ruleId\x12<\n" +
"\x04mode\x18\x04 \x01(\x0e2(.s3_lifecycle_pb.LifecycleState.RuleModeR\x04mode\x12W\n" +
"\x0fdegraded_reason\x18\x05 \x01(\x0e2..s3_lifecycle_pb.LifecycleState.DegradedReasonR\x0edegradedReason\x12*\n" +
"\x11degraded_since_ns\x18\x06 \x01(\x03R\x0fdegradedSinceNs\x12-\n" +
"\x12bootstrap_complete\x18\a \x01(\bR\x11bootstrapComplete\x125\n" +
"\x17bootstrap_started_at_ns\x18\b \x01(\x03R\x14bootstrapStartedAtNs\x129\n" +
"\x19bootstrap_completed_at_ns\x18\t \x01(\x03R\x16bootstrapCompletedAtNs\x122\n" +
"\x16last_safety_scan_ts_ns\x18\n" +
" \x01(\x03R\x12lastSafetyScanTsNs\x122\n" +
"\x16next_safety_scan_ts_ns\x18\v \x01(\x03R\x12nextSafetyScanTsNs\x12'\n" +
"\x0fevaluated_total\x18\f \x01(\x03R\x0eevaluatedTotal\x12#\n" +
"\rexpired_total\x18\r \x01(\x03R\fexpiredTotal\x12.\n" +
"\x13metadata_only_total\x18\x0e \x01(\x03R\x11metadataOnlyTotal\x12\x1f\n" +
"\verror_total\x18\x0f \x01(\x03R\n" +
"errorTotal\"}\n" +
"\bRuleMode\x12\x19\n" +
"\x15RULE_MODE_UNSPECIFIED\x10\x00\x12\x10\n" +
"\fEVENT_DRIVEN\x10\x01\x12\x10\n" +
"\fSCAN_AT_DATE\x10\x02\x12\r\n" +
"\tSCAN_ONLY\x10\x03\x12\f\n" +
"\bDISABLED\x10\x04\x12\x15\n" +
"\x11PENDING_BOOTSTRAP\x10\x05\"\xa6\x01\n" +
"\x0eDegradedReason\x12\x1f\n" +
"\x1bDEGRADED_REASON_UNSPECIFIED\x10\x00\x12\f\n" +
"\bLAG_HIGH\x10\x01\x12\x10\n" +
"\fPENDING_FULL\x10\x02\x12\x13\n" +
"\x0fDELETE_FAILURES\x10\x03\x12\x13\n" +
"\x0fOPERATOR_PAUSED\x10\x04\x12\x1b\n" +
"\x17RETENTION_BELOW_HORIZON\x10\x05\x12\f\n" +
"\bLOST_LOG\x10\x06\"\xb6\x01\n" +
"\vPendingItem\x12\x1f\n" +
"\vobject_path\x18\x01 \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\x02 \x01(\tR\tversionId\x12\x1a\n" +
"\tdue_at_ns\x18\x03 \x01(\x03R\adueAtNs\x12K\n" +
"\x11expected_identity\x18\x04 \x01(\v2\x1e.s3_lifecycle_pb.EntryIdentityR\x10expectedIdentity\"\x88\x01\n" +
"\x0eBootstrapState\x12*\n" +
"\x11last_scanned_path\x18\x01 \x01(\tR\x0flastScannedPath\x12\"\n" +
"\rstarted_at_ns\x18\x02 \x01(\x03R\vstartedAtNs\x12&\n" +
"\x0fcompleted_at_ns\x18\x03 \x01(\x03R\rcompletedAtNs\"\x83\x04\n" +
"\vReaderState\x124\n" +
"\x16primary_filer_endpoint\x18\x01 \x01(\tR\x14primaryFilerEndpoint\x12o\n" +
"\x17last_processed_original\x18\x02 \x03(\v27.s3_lifecycle_pb.ReaderState.LastProcessedOriginalEntryR\x15lastProcessedOriginal\x12[\n" +
"\x18last_processed_predicate\x18\x03 \x03(\v2!.s3_lifecycle_pb.FilerShardCursorR\x16lastProcessedPredicate\x12Q\n" +
"\x14tail_drained_streams\x18\x04 \x03(\v2\x1f.s3_lifecycle_pb.TailDrainedKeyR\x12tailDrainedStreams\x12,\n" +
"\x12last_checkpoint_ns\x18\x05 \x01(\x03R\x10lastCheckpointNs\x1ao\n" +
"\x1aLastProcessedOriginalEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\x03R\x03key\x12;\n" +
"\x05value\x18\x02 \x01(\v2%.s3_lifecycle_pb.FilerShardCursorListR\x05value:\x028\x01\"S\n" +
"\x14FilerShardCursorList\x12;\n" +
"\acursors\x18\x01 \x03(\v2!.s3_lifecycle_pb.FilerShardCursorR\acursors\"\x8e\x01\n" +
"\x0eTailDrainedKey\x12<\n" +
"\vstream_kind\x18\x01 \x01(\x0e2\x1b.s3_lifecycle_pb.StreamKindR\n" +
"streamKind\x12\x19\n" +
"\bfiler_id\x18\x02 \x01(\tR\afilerId\x12#\n" +
"\rdelay_seconds\x18\x03 \x01(\x03R\fdelaySeconds\"\xa3\x04\n" +
"\rBlockerRecord\x12<\n" +
"\vstream_kind\x18\x01 \x01(\x0e2\x1b.s3_lifecycle_pb.StreamKindR\n" +
"streamKind\x12\x14\n" +
"\x05shard\x18\x02 \x01(\tR\x05shard\x12#\n" +
"\rdelay_seconds\x18\x03 \x01(\x03R\fdelaySeconds\x12<\n" +
"\bposition\x18\x04 \x01(\v2 .s3_lifecycle_pb.MessagePositionR\bposition\x12\x1b\n" +
"\trule_hash\x18\x05 \x01(\fR\bruleHash\x12\x16\n" +
"\x06bucket\x18\x06 \x01(\tR\x06bucket\x12\x1f\n" +
"\vobject_path\x18\a \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\b \x01(\tR\tversionId\x12<\n" +
"\vaction_kind\x18\x0e \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind\x12\x16\n" +
"\x06reason\x18\t \x01(\tR\x06reason\x12\x1d\n" +
"\n" +
"last_error\x18\n" +
" \x01(\tR\tlastError\x12'\n" +
"\x10first_seen_at_ns\x18\v \x01(\x03R\rfirstSeenAtNs\x12'\n" +
"\x10last_retry_at_ns\x18\f \x01(\x03R\rlastRetryAtNs\x12\x1f\n" +
"\vretry_count\x18\r \x01(\x05R\n" +
"retryCount\"\x85\x02\n" +
"\tStreamKey\x12:\n" +
"\boriginal\x18\x01 \x01(\v2\x1c.s3_lifecycle_pb.OriginalKeyH\x00R\boriginal\x12=\n" +
"\tpredicate\x18\x02 \x01(\v2\x1d.s3_lifecycle_pb.PredicateKeyH\x00R\tpredicate\x12=\n" +
"\tbootstrap\x18\x03 \x01(\v2\x1d.s3_lifecycle_pb.BootstrapKeyH\x00R\tbootstrap\x127\n" +
"\apending\x18\x04 \x01(\v2\x1b.s3_lifecycle_pb.PendingKeyH\x00R\apendingB\x05\n" +
"\x03key\"\x86\x01\n" +
"\vOriginalKey\x12\x14\n" +
"\x05shard\x18\x01 \x01(\tR\x05shard\x12#\n" +
"\rdelay_seconds\x18\x02 \x01(\x03R\fdelaySeconds\x12<\n" +
"\bposition\x18\x03 \x01(\v2 .s3_lifecycle_pb.MessagePositionR\bposition\"b\n" +
"\fPredicateKey\x12\x14\n" +
"\x05shard\x18\x01 \x01(\tR\x05shard\x12<\n" +
"\bposition\x18\x02 \x01(\v2 .s3_lifecycle_pb.MessagePositionR\bposition\"\xc1\x01\n" +
"\fBootstrapKey\x12\x16\n" +
"\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x1f\n" +
"\vobject_path\x18\x02 \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\x03 \x01(\tR\tversionId\x12\x1b\n" +
"\trule_hash\x18\x04 \x01(\fR\bruleHash\x12<\n" +
"\vaction_kind\x18\x05 \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind\"\xbf\x01\n" +
"\n" +
"PendingKey\x12\x16\n" +
"\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x1b\n" +
"\trule_hash\x18\x02 \x01(\fR\bruleHash\x12\x1f\n" +
"\vobject_path\x18\x03 \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\x04 \x01(\tR\tversionId\x12<\n" +
"\vaction_kind\x18\x05 \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind\"\xc3\x01\n" +
"\x10RetryBudgetEntry\x12,\n" +
"\x03key\x18\x01 \x01(\v2\x1a.s3_lifecycle_pb.StreamKeyR\x03key\x12/\n" +
"\x13consecutive_retries\x18\x02 \x01(\x05R\x12consecutiveRetries\x12'\n" +
"\x10first_seen_at_ns\x18\x03 \x01(\x03R\rfirstSeenAtNs\x12'\n" +
"\x10last_retry_at_ns\x18\x04 \x01(\x03R\rlastRetryAtNs\"\xee\x01\n" +
"\vRetryTarget\x12,\n" +
"\x03key\x18\x01 \x01(\v2\x1a.s3_lifecycle_pb.StreamKeyR\x03key\x12\x16\n" +
"\x06bucket\x18\x02 \x01(\tR\x06bucket\x12\x1f\n" +
"\vobject_path\x18\x03 \x01(\tR\n" +
"objectPath\x12\x1d\n" +
"\n" +
"version_id\x18\x04 \x01(\tR\tversionId\x12\x1b\n" +
"\trule_hash\x18\x05 \x01(\fR\bruleHash\x12<\n" +
"\vaction_kind\x18\x06 \x01(\x0e2\x1b.s3_lifecycle_pb.ActionKindR\n" +
"actionKind*\xa8\x01\n" +
"\n" +
"ActionKind\x12\x1b\n" +
"\x17ACTION_KIND_UNSPECIFIED\x10\x00\x12\x13\n" +
"\x0fEXPIRATION_DAYS\x10\x01\x12\x13\n" +
"\x0fEXPIRATION_DATE\x10\x02\x12\x13\n" +
"\x0fNONCURRENT_DAYS\x10\x03\x12\x14\n" +
"\x10NEWER_NONCURRENT\x10\x04\x12\r\n" +
"\tABORT_MPU\x10\x05\x12\x19\n" +
"\x15EXPIRED_DELETE_MARKER\x10\x06*\x96\x01\n" +
"\x16LifecycleDeleteOutcome\x12(\n" +
"$LIFECYCLE_DELETE_OUTCOME_UNSPECIFIED\x10\x00\x12\b\n" +
"\x04DONE\x10\x01\x12\x11\n" +
"\rNOOP_RESOLVED\x10\x02\x12\x17\n" +
"\x13SKIPPED_OBJECT_LOCK\x10\x03\x12\x0f\n" +
"\vRETRY_LATER\x10\x04\x12\v\n" +
"\aBLOCKED\x10\x05*b\n" +
"\n" +
"StreamKind\x12\x1b\n" +
"\x17STREAM_KIND_UNSPECIFIED\x10\x00\x12\f\n" +
"\bORIGINAL\x10\x01\x12\r\n" +
"\tPREDICATE\x10\x02\x12\r\n" +
"\tBOOTSTRAP\x10\x03\x12\v\n" +
"\aPENDING\x10\x042\x82\x01\n" +
"\x1aSeaweedS3LifecycleInternal\x12d\n" +
"\x0fLifecycleDelete\x12'.s3_lifecycle_pb.LifecycleDeleteRequest\x1a(.s3_lifecycle_pb.LifecycleDeleteResponseB\\\n" +
"\x10seaweedfs.clientB\x10S3LifecycleProtoZ6github.com/seaweedfs/seaweedfs/weed/pb/s3_lifecycle_pbb\x06proto3"
var (
file_s3_lifecycle_proto_rawDescOnce sync.Once
file_s3_lifecycle_proto_rawDescData []byte
)
func file_s3_lifecycle_proto_rawDescGZIP() []byte {
file_s3_lifecycle_proto_rawDescOnce.Do(func() {
file_s3_lifecycle_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_s3_lifecycle_proto_rawDesc), len(file_s3_lifecycle_proto_rawDesc)))
})
return file_s3_lifecycle_proto_rawDescData
}
var file_s3_lifecycle_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
var file_s3_lifecycle_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
var file_s3_lifecycle_proto_goTypes = []any{
(ActionKind)(0), // 0: s3_lifecycle_pb.ActionKind
(LifecycleDeleteOutcome)(0), // 1: s3_lifecycle_pb.LifecycleDeleteOutcome
(StreamKind)(0), // 2: s3_lifecycle_pb.StreamKind
(LifecycleState_RuleMode)(0), // 3: s3_lifecycle_pb.LifecycleState.RuleMode
(LifecycleState_DegradedReason)(0), // 4: s3_lifecycle_pb.LifecycleState.DegradedReason
(*LifecycleDeleteRequest)(nil), // 5: s3_lifecycle_pb.LifecycleDeleteRequest
(*LifecycleDeleteResponse)(nil), // 6: s3_lifecycle_pb.LifecycleDeleteResponse
(*MessagePosition)(nil), // 7: s3_lifecycle_pb.MessagePosition
(*FilerShardCursor)(nil), // 8: s3_lifecycle_pb.FilerShardCursor
(*EntryIdentity)(nil), // 9: s3_lifecycle_pb.EntryIdentity
(*LifecycleState)(nil), // 10: s3_lifecycle_pb.LifecycleState
(*PendingItem)(nil), // 11: s3_lifecycle_pb.PendingItem
(*BootstrapState)(nil), // 12: s3_lifecycle_pb.BootstrapState
(*ReaderState)(nil), // 13: s3_lifecycle_pb.ReaderState
(*FilerShardCursorList)(nil), // 14: s3_lifecycle_pb.FilerShardCursorList
(*TailDrainedKey)(nil), // 15: s3_lifecycle_pb.TailDrainedKey
(*BlockerRecord)(nil), // 16: s3_lifecycle_pb.BlockerRecord
(*StreamKey)(nil), // 17: s3_lifecycle_pb.StreamKey
(*OriginalKey)(nil), // 18: s3_lifecycle_pb.OriginalKey
(*PredicateKey)(nil), // 19: s3_lifecycle_pb.PredicateKey
(*BootstrapKey)(nil), // 20: s3_lifecycle_pb.BootstrapKey
(*PendingKey)(nil), // 21: s3_lifecycle_pb.PendingKey
(*RetryBudgetEntry)(nil), // 22: s3_lifecycle_pb.RetryBudgetEntry
(*RetryTarget)(nil), // 23: s3_lifecycle_pb.RetryTarget
nil, // 24: s3_lifecycle_pb.ReaderState.LastProcessedOriginalEntry
}
var file_s3_lifecycle_proto_depIdxs = []int32{
0, // 0: s3_lifecycle_pb.LifecycleDeleteRequest.action_kind:type_name -> s3_lifecycle_pb.ActionKind
9, // 1: s3_lifecycle_pb.LifecycleDeleteRequest.expected_identity:type_name -> s3_lifecycle_pb.EntryIdentity
1, // 2: s3_lifecycle_pb.LifecycleDeleteResponse.outcome:type_name -> s3_lifecycle_pb.LifecycleDeleteOutcome
7, // 3: s3_lifecycle_pb.FilerShardCursor.position:type_name -> s3_lifecycle_pb.MessagePosition
0, // 4: s3_lifecycle_pb.LifecycleState.action_kind:type_name -> s3_lifecycle_pb.ActionKind
3, // 5: s3_lifecycle_pb.LifecycleState.mode:type_name -> s3_lifecycle_pb.LifecycleState.RuleMode
4, // 6: s3_lifecycle_pb.LifecycleState.degraded_reason:type_name -> s3_lifecycle_pb.LifecycleState.DegradedReason
9, // 7: s3_lifecycle_pb.PendingItem.expected_identity:type_name -> s3_lifecycle_pb.EntryIdentity
24, // 8: s3_lifecycle_pb.ReaderState.last_processed_original:type_name -> s3_lifecycle_pb.ReaderState.LastProcessedOriginalEntry
8, // 9: s3_lifecycle_pb.ReaderState.last_processed_predicate:type_name -> s3_lifecycle_pb.FilerShardCursor
15, // 10: s3_lifecycle_pb.ReaderState.tail_drained_streams:type_name -> s3_lifecycle_pb.TailDrainedKey
8, // 11: s3_lifecycle_pb.FilerShardCursorList.cursors:type_name -> s3_lifecycle_pb.FilerShardCursor
2, // 12: s3_lifecycle_pb.TailDrainedKey.stream_kind:type_name -> s3_lifecycle_pb.StreamKind
2, // 13: s3_lifecycle_pb.BlockerRecord.stream_kind:type_name -> s3_lifecycle_pb.StreamKind
7, // 14: s3_lifecycle_pb.BlockerRecord.position:type_name -> s3_lifecycle_pb.MessagePosition
0, // 15: s3_lifecycle_pb.BlockerRecord.action_kind:type_name -> s3_lifecycle_pb.ActionKind
18, // 16: s3_lifecycle_pb.StreamKey.original:type_name -> s3_lifecycle_pb.OriginalKey
19, // 17: s3_lifecycle_pb.StreamKey.predicate:type_name -> s3_lifecycle_pb.PredicateKey
20, // 18: s3_lifecycle_pb.StreamKey.bootstrap:type_name -> s3_lifecycle_pb.BootstrapKey
21, // 19: s3_lifecycle_pb.StreamKey.pending:type_name -> s3_lifecycle_pb.PendingKey
7, // 20: s3_lifecycle_pb.OriginalKey.position:type_name -> s3_lifecycle_pb.MessagePosition
7, // 21: s3_lifecycle_pb.PredicateKey.position:type_name -> s3_lifecycle_pb.MessagePosition
0, // 22: s3_lifecycle_pb.BootstrapKey.action_kind:type_name -> s3_lifecycle_pb.ActionKind
0, // 23: s3_lifecycle_pb.PendingKey.action_kind:type_name -> s3_lifecycle_pb.ActionKind
17, // 24: s3_lifecycle_pb.RetryBudgetEntry.key:type_name -> s3_lifecycle_pb.StreamKey
17, // 25: s3_lifecycle_pb.RetryTarget.key:type_name -> s3_lifecycle_pb.StreamKey
0, // 26: s3_lifecycle_pb.RetryTarget.action_kind:type_name -> s3_lifecycle_pb.ActionKind
14, // 27: s3_lifecycle_pb.ReaderState.LastProcessedOriginalEntry.value:type_name -> s3_lifecycle_pb.FilerShardCursorList
5, // 28: s3_lifecycle_pb.SeaweedS3LifecycleInternal.LifecycleDelete:input_type -> s3_lifecycle_pb.LifecycleDeleteRequest
6, // 29: s3_lifecycle_pb.SeaweedS3LifecycleInternal.LifecycleDelete:output_type -> s3_lifecycle_pb.LifecycleDeleteResponse
29, // [29:30] is the sub-list for method output_type
28, // [28:29] is the sub-list for method input_type
28, // [28:28] is the sub-list for extension type_name
28, // [28:28] is the sub-list for extension extendee
0, // [0:28] is the sub-list for field type_name
}
func init() { file_s3_lifecycle_proto_init() }
func file_s3_lifecycle_proto_init() {
if File_s3_lifecycle_proto != nil {
return
}
file_s3_lifecycle_proto_msgTypes[12].OneofWrappers = []any{
(*StreamKey_Original)(nil),
(*StreamKey_Predicate)(nil),
(*StreamKey_Bootstrap)(nil),
(*StreamKey_Pending)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_s3_lifecycle_proto_rawDesc), len(file_s3_lifecycle_proto_rawDesc)),
NumEnums: 5,
NumMessages: 20,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_s3_lifecycle_proto_goTypes,
DependencyIndexes: file_s3_lifecycle_proto_depIdxs,
EnumInfos: file_s3_lifecycle_proto_enumTypes,
MessageInfos: file_s3_lifecycle_proto_msgTypes,
}.Build()
File_s3_lifecycle_proto = out.File
file_s3_lifecycle_proto_goTypes = nil
file_s3_lifecycle_proto_depIdxs = nil
}