Files
Alex StanfieldandGitHub 3fa7f5adcf feat: add CHASM-to-workflow scheduler migration (#9537)
## What Changed

This PR adds a safe rollback path for schedules by enabling migration
from CHASM-backed schedulers (V2) back to workflow-backed schedulers
(V1).

if we need to move a schedule off CHASM, migration should preserve
schedule behavior and state, remain idempotent under retries, and leave
the system in a consistent post-migration state.

## Expected Behavior

- A V2 schedule can be migrated to V1 through admin APIs.
- Migration preserves user-visible schedule semantics (including
paused/notes state and conflict-token value semantics).
- Migration is retry-safe/idempotent.
- Once migration completes, the V1 schedule is active and the CHASM
scheduler is no longer serving requests.
- Unpause is blocked while migration is pending to prevent state
divergence.
2026-03-20 10:34:21 -05:00

368 lines
13 KiB
Go

// Code generated by protoc-gen-go. DO NOT EDIT.
// plugins:
// protoc-gen-go
// protoc
// source: temporal/server/chasm/lib/scheduler/proto/v1/tasks.proto
package schedulerpb
import (
reflect "reflect"
sync "sync"
unsafe "unsafe"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
durationpb "google.golang.org/protobuf/types/known/durationpb"
)
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)
)
// Fires when the scheduler's idle period has lapsed, and the scheduler should
// be closed.
type SchedulerIdleTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Idle time total is set at time of task creation, so that if the dynamic config key
// controlling idle time changes, task validation will be aware.
IdleTimeTotal *durationpb.Duration `protobuf:"bytes,1,opt,name=idle_time_total,json=idleTimeTotal,proto3" json:"idle_time_total,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SchedulerIdleTask) Reset() {
*x = SchedulerIdleTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SchedulerIdleTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SchedulerIdleTask) ProtoMessage() {}
func (x *SchedulerIdleTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 SchedulerIdleTask.ProtoReflect.Descriptor instead.
func (*SchedulerIdleTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{0}
}
func (x *SchedulerIdleTask) GetIdleTimeTotal() *durationpb.Duration {
if x != nil {
return x.IdleTimeTotal
}
return nil
}
// Ensures that callbacks for all running buffered starts are attached. Used only
// during migration from V1, as workflows started by CHASM scheduler are started
// with callbacks attached.
type SchedulerCallbacksTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SchedulerCallbacksTask) Reset() {
*x = SchedulerCallbacksTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SchedulerCallbacksTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SchedulerCallbacksTask) ProtoMessage() {}
func (x *SchedulerCallbacksTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 SchedulerCallbacksTask.ProtoReflect.Descriptor instead.
func (*SchedulerCallbacksTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{1}
}
// Buffers actions based on the schedule's specification.
type GeneratorTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GeneratorTask) Reset() {
*x = GeneratorTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GeneratorTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GeneratorTask) ProtoMessage() {}
func (x *GeneratorTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 GeneratorTask.ProtoReflect.Descriptor instead.
func (*GeneratorTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{2}
}
// Processes buffered actions, deciding whether to execute, delay, or discard.
type InvokerProcessBufferTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *InvokerProcessBufferTask) Reset() {
*x = InvokerProcessBufferTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *InvokerProcessBufferTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*InvokerProcessBufferTask) ProtoMessage() {}
func (x *InvokerProcessBufferTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 InvokerProcessBufferTask.ProtoReflect.Descriptor instead.
func (*InvokerProcessBufferTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{3}
}
// Drives execution of pending buffered actions to completion by starting,
// canceling, or terminating workflows.
type InvokerExecuteTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *InvokerExecuteTask) Reset() {
*x = InvokerExecuteTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *InvokerExecuteTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*InvokerExecuteTask) ProtoMessage() {}
func (x *InvokerExecuteTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 InvokerExecuteTask.ProtoReflect.Descriptor instead.
func (*InvokerExecuteTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{4}
}
// Buffers actions based on a manually-requested backfill.
type BackfillerTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BackfillerTask) Reset() {
*x = BackfillerTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BackfillerTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BackfillerTask) ProtoMessage() {}
func (x *BackfillerTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 BackfillerTask.ProtoReflect.Descriptor instead.
func (*BackfillerTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{5}
}
// Triggers migration from CHASM (V2) to workflow-backed (V1) scheduler.
type SchedulerMigrateToWorkflowTask struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SchedulerMigrateToWorkflowTask) Reset() {
*x = SchedulerMigrateToWorkflowTask{}
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SchedulerMigrateToWorkflowTask) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SchedulerMigrateToWorkflowTask) ProtoMessage() {}
func (x *SchedulerMigrateToWorkflowTask) ProtoReflect() protoreflect.Message {
mi := &file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_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 SchedulerMigrateToWorkflowTask.ProtoReflect.Descriptor instead.
func (*SchedulerMigrateToWorkflowTask) Descriptor() ([]byte, []int) {
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP(), []int{6}
}
var File_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto protoreflect.FileDescriptor
const file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDesc = "" +
"\n" +
"8temporal/server/chasm/lib/scheduler/proto/v1/tasks.proto\x12,temporal.server.chasm.lib.scheduler.proto.v1\x1a\x1egoogle/protobuf/duration.proto\"V\n" +
"\x11SchedulerIdleTask\x12A\n" +
"\x0fidle_time_total\x18\x01 \x01(\v2\x19.google.protobuf.DurationR\ridleTimeTotal\"\x18\n" +
"\x16SchedulerCallbacksTask\"\x0f\n" +
"\rGeneratorTask\"\x1a\n" +
"\x18InvokerProcessBufferTask\"\x14\n" +
"\x12InvokerExecuteTask\"\x10\n" +
"\x0eBackfillerTask\" \n" +
"\x1eSchedulerMigrateToWorkflowTaskBGZEgo.temporal.io/server/chasm/lib/scheduler/gen/schedulerpb;schedulerpbb\x06proto3"
var (
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescOnce sync.Once
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescData []byte
)
func file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescGZIP() []byte {
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescOnce.Do(func() {
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDesc), len(file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDesc)))
})
return file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDescData
}
var file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_goTypes = []any{
(*SchedulerIdleTask)(nil), // 0: temporal.server.chasm.lib.scheduler.proto.v1.SchedulerIdleTask
(*SchedulerCallbacksTask)(nil), // 1: temporal.server.chasm.lib.scheduler.proto.v1.SchedulerCallbacksTask
(*GeneratorTask)(nil), // 2: temporal.server.chasm.lib.scheduler.proto.v1.GeneratorTask
(*InvokerProcessBufferTask)(nil), // 3: temporal.server.chasm.lib.scheduler.proto.v1.InvokerProcessBufferTask
(*InvokerExecuteTask)(nil), // 4: temporal.server.chasm.lib.scheduler.proto.v1.InvokerExecuteTask
(*BackfillerTask)(nil), // 5: temporal.server.chasm.lib.scheduler.proto.v1.BackfillerTask
(*SchedulerMigrateToWorkflowTask)(nil), // 6: temporal.server.chasm.lib.scheduler.proto.v1.SchedulerMigrateToWorkflowTask
(*durationpb.Duration)(nil), // 7: google.protobuf.Duration
}
var file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_depIdxs = []int32{
7, // 0: temporal.server.chasm.lib.scheduler.proto.v1.SchedulerIdleTask.idle_time_total:type_name -> google.protobuf.Duration
1, // [1:1] is the sub-list for method output_type
1, // [1:1] is the sub-list for method input_type
1, // [1:1] is the sub-list for extension type_name
1, // [1:1] is the sub-list for extension extendee
0, // [0:1] is the sub-list for field type_name
}
func init() { file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_init() }
func file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_init() {
if File_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDesc), len(file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_rawDesc)),
NumEnums: 0,
NumMessages: 7,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_goTypes,
DependencyIndexes: file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_depIdxs,
MessageInfos: file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_msgTypes,
}.Build()
File_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto = out.File
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_goTypes = nil
file_temporal_server_chasm_lib_scheduler_proto_v1_tasks_proto_depIdxs = nil
}