diff --git a/api/history/v1/message.pb.go b/api/history/v1/message.pb.go index 14caef6fa24..f2c61c63297 100644 --- a/api/history/v1/message.pb.go +++ b/api/history/v1/message.pb.go @@ -358,6 +358,49 @@ func (m *TaskRange) GetExclusiveMaxTaskKey() *TaskKey { return nil } +type HistoryEventPointer struct { + EventId int64 `protobuf:"varint,1,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` +} + +func (m *HistoryEventPointer) Reset() { *m = HistoryEventPointer{} } +func (*HistoryEventPointer) ProtoMessage() {} +func (*HistoryEventPointer) Descriptor() ([]byte, []int) { + return fileDescriptor_670cd05c700ece14, []int{6} +} +func (m *HistoryEventPointer) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HistoryEventPointer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HistoryEventPointer.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *HistoryEventPointer) XXX_Merge(src proto.Message) { + xxx_messageInfo_HistoryEventPointer.Merge(m, src) +} +func (m *HistoryEventPointer) XXX_Size() int { + return m.Size() +} +func (m *HistoryEventPointer) XXX_DiscardUnknown() { + xxx_messageInfo_HistoryEventPointer.DiscardUnknown(m) +} + +var xxx_messageInfo_HistoryEventPointer proto.InternalMessageInfo + +func (m *HistoryEventPointer) GetEventId() int64 { + if m != nil { + return m.EventId + } + return 0 +} + func init() { proto.RegisterType((*TransientWorkflowTaskInfo)(nil), "temporal.server.api.history.v1.TransientWorkflowTaskInfo") proto.RegisterType((*VersionHistoryItem)(nil), "temporal.server.api.history.v1.VersionHistoryItem") @@ -365,6 +408,7 @@ func init() { proto.RegisterType((*VersionHistories)(nil), "temporal.server.api.history.v1.VersionHistories") proto.RegisterType((*TaskKey)(nil), "temporal.server.api.history.v1.TaskKey") proto.RegisterType((*TaskRange)(nil), "temporal.server.api.history.v1.TaskRange") + proto.RegisterType((*HistoryEventPointer)(nil), "temporal.server.api.history.v1.HistoryEventPointer") } func init() { @@ -372,43 +416,44 @@ func init() { } var fileDescriptor_670cd05c700ece14 = []byte{ - // 575 bytes of a gzipped FileDescriptorProto + // 590 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x41, 0x4b, 0x1b, 0x41, - 0x14, 0xc7, 0x33, 0x89, 0x9a, 0x38, 0xb1, 0x22, 0x53, 0xb0, 0x31, 0xd0, 0x51, 0x03, 0x52, 0x0f, - 0x32, 0x8b, 0xe9, 0xb1, 0xf4, 0x50, 0xa1, 0x60, 0xac, 0x5e, 0xb6, 0xa1, 0x85, 0x22, 0x2c, 0x93, - 0xe4, 0x65, 0x1d, 0x92, 0x9d, 0x09, 0x33, 0x9b, 0x34, 0x1e, 0x0a, 0xfd, 0x08, 0x7e, 0x87, 0x5e, - 0xfa, 0x4d, 0xda, 0xa3, 0x47, 0x6f, 0xad, 0xeb, 0xa5, 0x47, 0x3f, 0x42, 0xd9, 0xd9, 0xd9, 0x04, - 0xdb, 0x62, 0xf1, 0x36, 0xf3, 0xe6, 0xff, 0x7e, 0xef, 0xff, 0xde, 0x3e, 0x16, 0xef, 0xc5, 0x10, - 0x8d, 0x94, 0xe6, 0x43, 0xcf, 0x80, 0x9e, 0x80, 0xf6, 0xf8, 0x48, 0x78, 0x67, 0xc2, 0xc4, 0x4a, - 0x9f, 0x7b, 0x93, 0x7d, 0x2f, 0x02, 0x63, 0x78, 0x08, 0x6c, 0xa4, 0x55, 0xac, 0x08, 0xcd, 0xd5, - 0x2c, 0x53, 0x33, 0x3e, 0x12, 0xcc, 0xa9, 0xd9, 0x64, 0xbf, 0xbe, 0x19, 0x2a, 0x15, 0x0e, 0xc1, - 0xb3, 0xea, 0xce, 0xb8, 0xef, 0xc5, 0x22, 0x02, 0x13, 0xf3, 0x68, 0x94, 0x01, 0xea, 0xdb, 0x3d, - 0x18, 0x81, 0xec, 0x81, 0xec, 0x0a, 0x30, 0x5e, 0xa8, 0x42, 0x65, 0xe3, 0xf6, 0xe4, 0x24, 0x3b, - 0x33, 0x47, 0xf7, 0x59, 0x69, 0x8c, 0xf1, 0x46, 0x5b, 0x73, 0x69, 0x04, 0xc8, 0xf8, 0xbd, 0xd2, - 0x83, 0xfe, 0x50, 0x7d, 0x6c, 0x73, 0x33, 0x68, 0xc9, 0xbe, 0x22, 0xc7, 0x78, 0xd5, 0x25, 0x06, - 0x66, 0xdc, 0xef, 0x8b, 0x69, 0xad, 0xb4, 0x55, 0xda, 0xad, 0x36, 0x77, 0xd8, 0xac, 0x81, 0xbb, - 0xce, 0xd9, 0x61, 0x76, 0x7c, 0x3d, 0x01, 0x19, 0xfb, 0x8f, 0xdc, 0xc3, 0x5b, 0x9b, 0x7b, 0xb4, - 0x50, 0x41, 0x6b, 0xc5, 0xa3, 0x85, 0x4a, 0x71, 0xad, 0xd4, 0x68, 0x61, 0xf2, 0x0e, 0xb4, 0x11, - 0x4a, 0xba, 0x8c, 0x56, 0x0c, 0x11, 0xd9, 0xc0, 0x15, 0x48, 0x33, 0x03, 0xd1, 0xab, 0xa1, 0x2d, - 0xb4, 0x5b, 0xf2, 0xcb, 0xf6, 0xde, 0xea, 0x91, 0x1a, 0x2e, 0x4f, 0xb2, 0x84, 0x5a, 0x31, 0x7b, - 0x71, 0xd7, 0xc6, 0x27, 0xbc, 0x7a, 0x17, 0x45, 0xb6, 0xf1, 0x4a, 0x47, 0x73, 0xd9, 0x3d, 0x0b, - 0x62, 0x35, 0x00, 0x69, 0x51, 0x2b, 0x7e, 0x35, 0x8b, 0xb5, 0xd3, 0x10, 0x39, 0xc4, 0x8b, 0x22, - 0x86, 0xc8, 0xd4, 0x8a, 0xb6, 0xa1, 0x26, 0xbb, 0xff, 0x8b, 0xb0, 0xbf, 0xcd, 0xfa, 0x19, 0xa0, - 0xf1, 0x05, 0xe1, 0xb5, 0x3b, 0xaf, 0x02, 0x0c, 0x79, 0x85, 0x9f, 0x76, 0xc7, 0x5a, 0xa7, 0xad, - 0x38, 0x9b, 0x41, 0x3e, 0x48, 0x21, 0x7b, 0x30, 0xb5, 0x96, 0x16, 0xfd, 0xba, 0x13, 0xfd, 0x41, - 0x4f, 0x15, 0xe4, 0x18, 0x2f, 0x9f, 0xe5, 0x3c, 0xe7, 0x92, 0x3d, 0xcc, 0xa5, 0x3f, 0x07, 0x34, - 0x38, 0x2e, 0xa7, 0x5f, 0xf5, 0x0d, 0x9c, 0x93, 0x27, 0xb8, 0x1c, 0x73, 0x33, 0x98, 0xcf, 0x78, - 0x29, 0xbd, 0xb6, 0x7a, 0xe4, 0x25, 0x5e, 0xee, 0x0b, 0x0d, 0x41, 0xba, 0x6c, 0x76, 0xc8, 0xd5, - 0x66, 0x9d, 0x65, 0x9b, 0xc8, 0xf2, 0x4d, 0x64, 0xed, 0x7c, 0x13, 0x0f, 0x16, 0x2e, 0x7e, 0x6c, - 0x22, 0xbf, 0x92, 0xa6, 0xa4, 0xc1, 0xc6, 0x37, 0x84, 0x97, 0xd3, 0x1a, 0x3e, 0x97, 0x21, 0x90, - 0x53, 0xbc, 0x2e, 0x64, 0x77, 0x38, 0x36, 0x62, 0x02, 0x41, 0x24, 0x64, 0x60, 0x6b, 0x0e, 0xe0, - 0xdc, 0x16, 0xad, 0x36, 0x9f, 0xfd, 0xaf, 0x17, 0x67, 0xd7, 0x7f, 0x3c, 0xc3, 0x9c, 0x08, 0x99, - 0xf7, 0x70, 0x8a, 0xd7, 0x61, 0x3a, 0xa3, 0xf3, 0xe9, 0x9c, 0x5e, 0x7c, 0x20, 0x7d, 0x86, 0x39, - 0xe1, 0x53, 0x17, 0x3c, 0xe8, 0x5c, 0x5e, 0xd3, 0xc2, 0xd5, 0x35, 0x2d, 0xdc, 0x5e, 0x53, 0xf4, - 0x39, 0xa1, 0xe8, 0x6b, 0x42, 0xd1, 0xf7, 0x84, 0xa2, 0xcb, 0x84, 0xa2, 0x9f, 0x09, 0x45, 0xbf, - 0x12, 0x5a, 0xb8, 0x4d, 0x28, 0xba, 0xb8, 0xa1, 0x85, 0xcb, 0x1b, 0x5a, 0xb8, 0xba, 0xa1, 0x85, - 0x0f, 0x7b, 0xa1, 0x9a, 0x57, 0x15, 0xea, 0xdf, 0x3f, 0x82, 0x17, 0xee, 0xd8, 0x59, 0xb2, 0x13, - 0x7d, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x70, 0x3d, 0xee, 0x87, 0x39, 0x04, 0x00, 0x00, + 0x14, 0xc7, 0x33, 0x89, 0x9a, 0x38, 0xb1, 0x22, 0x2b, 0xd8, 0x18, 0xe8, 0xa8, 0x0b, 0x52, 0x0f, + 0x32, 0x5b, 0xd3, 0x63, 0xe9, 0xa1, 0x42, 0xc1, 0x58, 0x85, 0xb2, 0x0d, 0x2d, 0x14, 0x61, 0x99, + 0x24, 0x2f, 0xeb, 0x90, 0xec, 0x4c, 0x98, 0xd9, 0xa4, 0xf1, 0x50, 0xe8, 0x47, 0xf0, 0x3b, 0xf4, + 0xd2, 0x6f, 0xd2, 0x1e, 0x3d, 0x7a, 0x6b, 0x5d, 0x2f, 0x3d, 0xfa, 0x11, 0xca, 0xce, 0xce, 0x26, + 0xb5, 0x2d, 0x16, 0x6f, 0x33, 0x6f, 0xfe, 0xef, 0x37, 0xff, 0x37, 0xef, 0x31, 0x78, 0x37, 0x86, + 0x68, 0x28, 0x15, 0x1b, 0x78, 0x1a, 0xd4, 0x18, 0x94, 0xc7, 0x86, 0xdc, 0x3b, 0xe5, 0x3a, 0x96, + 0xea, 0xcc, 0x1b, 0xef, 0x79, 0x11, 0x68, 0xcd, 0x42, 0xa0, 0x43, 0x25, 0x63, 0xe9, 0x90, 0x5c, + 0x4d, 0x33, 0x35, 0x65, 0x43, 0x4e, 0xad, 0x9a, 0x8e, 0xf7, 0xea, 0x1b, 0xa1, 0x94, 0xe1, 0x00, + 0x3c, 0xa3, 0x6e, 0x8f, 0x7a, 0x5e, 0xcc, 0x23, 0xd0, 0x31, 0x8b, 0x86, 0x19, 0xa0, 0xbe, 0xd5, + 0x85, 0x21, 0x88, 0x2e, 0x88, 0x0e, 0x07, 0xed, 0x85, 0x32, 0x94, 0x26, 0x6e, 0x56, 0x56, 0xb2, + 0x3d, 0x75, 0x74, 0x97, 0x15, 0x77, 0x84, 0xd7, 0x5b, 0x8a, 0x09, 0xcd, 0x41, 0xc4, 0xef, 0xa4, + 0xea, 0xf7, 0x06, 0xf2, 0x43, 0x8b, 0xe9, 0x7e, 0x53, 0xf4, 0xa4, 0x73, 0x84, 0x97, 0x6d, 0x62, + 0xa0, 0x47, 0xbd, 0x1e, 0x9f, 0xd4, 0x4a, 0x9b, 0xa5, 0x9d, 0x6a, 0x63, 0x9b, 0x4e, 0x0b, 0xb8, + 0xed, 0x9c, 0x1e, 0x64, 0xcb, 0x97, 0x63, 0x10, 0xb1, 0xff, 0xc0, 0x1e, 0xbc, 0x31, 0xb9, 0x87, + 0x73, 0x15, 0xb4, 0x52, 0x3c, 0x9c, 0xab, 0x14, 0x57, 0x4a, 0x6e, 0x13, 0x3b, 0x6f, 0x41, 0x69, + 0x2e, 0x85, 0xcd, 0x68, 0xc6, 0x10, 0x39, 0xeb, 0xb8, 0x02, 0x69, 0x66, 0xc0, 0xbb, 0x35, 0xb4, + 0x89, 0x76, 0x4a, 0x7e, 0xd9, 0xec, 0x9b, 0x5d, 0xa7, 0x86, 0xcb, 0xe3, 0x2c, 0xa1, 0x56, 0xcc, + 0x4e, 0xec, 0xd6, 0xfd, 0x88, 0x97, 0x6f, 0xa3, 0x9c, 0x2d, 0xbc, 0xd4, 0x56, 0x4c, 0x74, 0x4e, + 0x83, 0x58, 0xf6, 0x41, 0x18, 0xd4, 0x92, 0x5f, 0xcd, 0x62, 0xad, 0x34, 0xe4, 0x1c, 0xe0, 0x79, + 0x1e, 0x43, 0xa4, 0x6b, 0x45, 0x53, 0x50, 0x83, 0xde, 0xdd, 0x11, 0xfa, 0xb7, 0x59, 0x3f, 0x03, + 0xb8, 0x9f, 0x11, 0x5e, 0xb9, 0x75, 0xca, 0x41, 0x3b, 0x2f, 0xf0, 0xa3, 0xce, 0x48, 0xa9, 0xb4, + 0x14, 0x6b, 0x33, 0xc8, 0x1f, 0x92, 0x8b, 0x2e, 0x4c, 0x8c, 0xa5, 0x79, 0xbf, 0x6e, 0x45, 0x7f, + 0xd0, 0x53, 0x85, 0x73, 0x84, 0x17, 0x4f, 0x73, 0x9e, 0x75, 0x49, 0xef, 0xe7, 0xd2, 0x9f, 0x01, + 0x5c, 0x86, 0xcb, 0x69, 0x57, 0x5f, 0xc1, 0x99, 0xf3, 0x10, 0x97, 0x63, 0xa6, 0xfb, 0xb3, 0x37, + 0x5e, 0x48, 0xb7, 0xcd, 0xae, 0xf3, 0x1c, 0x2f, 0xf6, 0xb8, 0x82, 0x20, 0x1d, 0x36, 0xf3, 0xc8, + 0xd5, 0x46, 0x9d, 0x66, 0x93, 0x48, 0xf3, 0x49, 0xa4, 0xad, 0x7c, 0x12, 0xf7, 0xe7, 0xce, 0xbf, + 0x6f, 0x20, 0xbf, 0x92, 0xa6, 0xa4, 0x41, 0xf7, 0x2b, 0xc2, 0x8b, 0xe9, 0x1d, 0x3e, 0x13, 0x21, + 0x38, 0x27, 0x78, 0x8d, 0x8b, 0xce, 0x60, 0xa4, 0xf9, 0x18, 0x82, 0x88, 0x8b, 0xc0, 0xdc, 0xd9, + 0x87, 0x33, 0x73, 0x69, 0xb5, 0xf1, 0xf8, 0x7f, 0xb5, 0x58, 0xbb, 0xfe, 0xea, 0x14, 0x73, 0xcc, + 0x45, 0x5e, 0xc3, 0x09, 0x5e, 0x83, 0xc9, 0x94, 0xce, 0x26, 0x33, 0x7a, 0xf1, 0x9e, 0xf4, 0x29, + 0xe6, 0x98, 0x4d, 0x6c, 0xd0, 0x7d, 0x82, 0x57, 0x7f, 0x9f, 0xe3, 0xd7, 0x92, 0x8b, 0x18, 0xd4, + 0x1d, 0xd3, 0xb9, 0xdf, 0xbe, 0xb8, 0x22, 0x85, 0xcb, 0x2b, 0x52, 0xb8, 0xb9, 0x22, 0xe8, 0x53, + 0x42, 0xd0, 0x97, 0x84, 0xa0, 0x6f, 0x09, 0x41, 0x17, 0x09, 0x41, 0x3f, 0x12, 0x82, 0x7e, 0x26, + 0xa4, 0x70, 0x93, 0x10, 0x74, 0x7e, 0x4d, 0x0a, 0x17, 0xd7, 0xa4, 0x70, 0x79, 0x4d, 0x0a, 0xef, + 0x77, 0x43, 0x39, 0xf3, 0xc9, 0xe5, 0xbf, 0xbf, 0x8e, 0x67, 0x76, 0xd9, 0x5e, 0x30, 0x3d, 0x78, + 0xfa, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xeb, 0x9b, 0x7d, 0x47, 0x6b, 0x04, 0x00, 0x00, } func (this *TransientWorkflowTaskInfo) Equal(that interface{}) bool { @@ -589,6 +634,30 @@ func (this *TaskRange) Equal(that interface{}) bool { } return true } +func (this *HistoryEventPointer) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*HistoryEventPointer) + if !ok { + that2, ok := that.(HistoryEventPointer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.EventId != that1.EventId { + return false + } + return true +} func (this *TransientWorkflowTaskInfo) GoString() string { if this == nil { return "nil" @@ -664,6 +733,16 @@ func (this *TaskRange) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *HistoryEventPointer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&history.HistoryEventPointer{") + s = append(s, "EventId: "+fmt.Sprintf("%#v", this.EventId)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringMessage(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -913,6 +992,34 @@ func (m *TaskRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *HistoryEventPointer) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HistoryEventPointer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HistoryEventPointer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.EventId != 0 { + i = encodeVarintMessage(dAtA, i, uint64(m.EventId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintMessage(dAtA []byte, offset int, v uint64) int { offset -= sovMessage(v) base := offset @@ -1024,6 +1131,18 @@ func (m *TaskRange) Size() (n int) { return n } +func (m *HistoryEventPointer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EventId != 0 { + n += 1 + sovMessage(uint64(m.EventId)) + } + return n +} + func sovMessage(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1110,6 +1229,16 @@ func (this *TaskRange) String() string { }, "") return s } +func (this *HistoryEventPointer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HistoryEventPointer{`, + `EventId:` + fmt.Sprintf("%v", this.EventId) + `,`, + `}`, + }, "") + return s +} func valueToStringMessage(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -1756,6 +1885,78 @@ func (m *TaskRange) Unmarshal(dAtA []byte) error { } return nil } +func (m *HistoryEventPointer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HistoryEventPointer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HistoryEventPointer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EventId", wireType) + } + m.EventId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessage + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EventId |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMessage(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessage + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthMessage + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipMessage(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/api/persistence/v1/executions.pb.go b/api/persistence/v1/executions.pb.go index 0180a233e64..15dc0439144 100644 --- a/api/persistence/v1/executions.pb.go +++ b/api/persistence/v1/executions.pb.go @@ -2253,6 +2253,91 @@ func (m *Checksum) GetValue() []byte { return nil } +type UpdateInfo struct { + // Types that are valid to be assigned to Value: + // *UpdateInfo_AcceptancePointer + // *UpdateInfo_CompletedPointer + Value isUpdateInfo_Value `protobuf_oneof:"value"` +} + +func (m *UpdateInfo) Reset() { *m = UpdateInfo{} } +func (*UpdateInfo) ProtoMessage() {} +func (*UpdateInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_67a714d0e7ba9f37, []int{15} +} +func (m *UpdateInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UpdateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UpdateInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UpdateInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateInfo.Merge(m, src) +} +func (m *UpdateInfo) XXX_Size() int { + return m.Size() +} +func (m *UpdateInfo) XXX_DiscardUnknown() { + xxx_messageInfo_UpdateInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_UpdateInfo proto.InternalMessageInfo + +type isUpdateInfo_Value interface { + isUpdateInfo_Value() + Equal(interface{}) bool + MarshalTo([]byte) (int, error) + Size() int +} + +type UpdateInfo_AcceptancePointer struct { + AcceptancePointer *v13.HistoryEventPointer `protobuf:"bytes,1,opt,name=acceptance_pointer,json=acceptancePointer,proto3,oneof" json:"acceptance_pointer,omitempty"` +} +type UpdateInfo_CompletedPointer struct { + CompletedPointer *v13.HistoryEventPointer `protobuf:"bytes,2,opt,name=completed_pointer,json=completedPointer,proto3,oneof" json:"completed_pointer,omitempty"` +} + +func (*UpdateInfo_AcceptancePointer) isUpdateInfo_Value() {} +func (*UpdateInfo_CompletedPointer) isUpdateInfo_Value() {} + +func (m *UpdateInfo) GetValue() isUpdateInfo_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *UpdateInfo) GetAcceptancePointer() *v13.HistoryEventPointer { + if x, ok := m.GetValue().(*UpdateInfo_AcceptancePointer); ok { + return x.AcceptancePointer + } + return nil +} + +func (m *UpdateInfo) GetCompletedPointer() *v13.HistoryEventPointer { + if x, ok := m.GetValue().(*UpdateInfo_CompletedPointer); ok { + return x.CompletedPointer + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*UpdateInfo) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*UpdateInfo_AcceptancePointer)(nil), + (*UpdateInfo_CompletedPointer)(nil), + } +} + func init() { proto.RegisterType((*ShardInfo)(nil), "temporal.server.api.persistence.v1.ShardInfo") proto.RegisterMapType((map[int32]*QueueAckLevel)(nil), "temporal.server.api.persistence.v1.ShardInfo.QueueAckLevelsEntry") @@ -2275,6 +2360,7 @@ func init() { proto.RegisterType((*RequestCancelInfo)(nil), "temporal.server.api.persistence.v1.RequestCancelInfo") proto.RegisterType((*SignalInfo)(nil), "temporal.server.api.persistence.v1.SignalInfo") proto.RegisterType((*Checksum)(nil), "temporal.server.api.persistence.v1.Checksum") + proto.RegisterType((*UpdateInfo)(nil), "temporal.server.api.persistence.v1.UpdateInfo") } func init() { @@ -2282,235 +2368,238 @@ func init() { } var fileDescriptor_67a714d0e7ba9f37 = []byte{ - // 3635 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x73, 0xdb, 0xd6, - 0x76, 0xa6, 0x05, 0x49, 0xe0, 0x21, 0x45, 0x41, 0xd0, 0x17, 0xa4, 0xc8, 0x94, 0xcc, 0xd8, 0x89, - 0x9c, 0xd8, 0x54, 0x24, 0x3b, 0x75, 0x3e, 0xda, 0xb8, 0x92, 0x2c, 0xdb, 0x64, 0x1c, 0xdb, 0x81, - 0x94, 0x38, 0x93, 0x26, 0xc3, 0x81, 0x80, 0x2b, 0x09, 0x15, 0x09, 0xd0, 0x00, 0x28, 0x99, 0x99, - 0x2e, 0xb2, 0xe8, 0x64, 0x9d, 0xee, 0x3a, 0xd3, 0x3f, 0xd0, 0x65, 0x37, 0xdd, 0x77, 0xd1, 0x45, - 0x57, 0x9d, 0xec, 0x9a, 0x5d, 0x5f, 0x9c, 0xcd, 0xdb, 0xbc, 0x49, 0xe6, 0xfd, 0x82, 0x37, 0xf7, - 0xdc, 0x7b, 0xf1, 0x45, 0x48, 0x82, 0xfc, 0xe2, 0x45, 0x76, 0xc4, 0x3d, 0x1f, 0xf7, 0xdc, 0x73, - 0xcf, 0x3d, 0x9f, 0x84, 0x9b, 0x01, 0xe9, 0x74, 0x5d, 0xcf, 0x68, 0xaf, 0xf8, 0xc4, 0x3b, 0x22, - 0xde, 0x8a, 0xd1, 0xb5, 0x57, 0xba, 0xc4, 0xf3, 0x6d, 0x3f, 0x20, 0x8e, 0x49, 0x56, 0x8e, 0x56, - 0x57, 0xc8, 0x73, 0x62, 0xf6, 0x02, 0xdb, 0x75, 0xfc, 0x7a, 0xd7, 0x73, 0x03, 0x57, 0xad, 0x09, - 0xa2, 0x3a, 0x23, 0xaa, 0x1b, 0x5d, 0xbb, 0x1e, 0x23, 0xaa, 0x1f, 0xad, 0xce, 0x57, 0xf7, 0x5d, - 0x77, 0xbf, 0x4d, 0x56, 0x90, 0x62, 0xb7, 0xb7, 0xb7, 0x62, 0xf5, 0x3c, 0x83, 0x32, 0x61, 0x3c, - 0xe6, 0x17, 0xd3, 0xf0, 0xc0, 0xee, 0x10, 0x3f, 0x30, 0x3a, 0x5d, 0x8e, 0x70, 0xd9, 0x22, 0x5d, - 0xe2, 0x58, 0xc4, 0x31, 0x6d, 0xe2, 0xaf, 0xec, 0xbb, 0xfb, 0x2e, 0xae, 0xe3, 0x2f, 0x8e, 0x72, - 0x25, 0x14, 0x9e, 0x4a, 0x6d, 0xba, 0x9d, 0x8e, 0xeb, 0x50, 0x81, 0x3b, 0xc4, 0xf7, 0x8d, 0x7d, - 0x92, 0x89, 0x45, 0x9c, 0x5e, 0xc7, 0xa7, 0x48, 0xc7, 0xae, 0x77, 0xb8, 0xd7, 0x76, 0x8f, 0x39, - 0xd6, 0xd5, 0x04, 0xd6, 0x9e, 0x61, 0xb7, 0x7b, 0x1e, 0x19, 0x64, 0xf6, 0x46, 0x02, 0x4d, 0xf0, - 0x18, 0xc4, 0x7b, 0x2b, 0x4b, 0xaf, 0x66, 0xdb, 0x35, 0x0f, 0x07, 0x71, 0xaf, 0x65, 0xe1, 0x86, - 0x72, 0xb2, 0x63, 0x71, 0xd4, 0xb7, 0x4f, 0x45, 0x4d, 0x1d, 0xe9, 0xcd, 0x53, 0x91, 0x03, 0xc3, - 0x3f, 0xe4, 0x88, 0xef, 0xe6, 0xe2, 0xda, 0xa2, 0x14, 0xad, 0xa0, 0xdf, 0x15, 0x72, 0x5f, 0xcf, - 0x22, 0x3b, 0xb0, 0xfd, 0xc0, 0xf5, 0xfa, 0x83, 0xa7, 0x5c, 0xc9, 0x61, 0x69, 0xcf, 0x7a, 0xa4, - 0x47, 0xb8, 0x95, 0xcd, 0xdf, 0xc8, 0x22, 0x38, 0x51, 0xe3, 0xb5, 0xef, 0x46, 0xa1, 0xb8, 0x7d, - 0x60, 0x78, 0x56, 0xc3, 0xd9, 0x73, 0xd5, 0x39, 0x90, 0x7d, 0xfa, 0xd1, 0xb2, 0x2d, 0xad, 0xb0, - 0x54, 0x58, 0x1e, 0xd6, 0x47, 0xf1, 0xbb, 0x61, 0x51, 0x90, 0x67, 0x38, 0xfb, 0x84, 0x82, 0x2e, - 0x2e, 0x15, 0x96, 0x87, 0xf4, 0x51, 0xfc, 0x6e, 0x58, 0xea, 0x14, 0x0c, 0xbb, 0xc7, 0x0e, 0xf1, - 0xb4, 0xa1, 0xa5, 0xc2, 0x72, 0x51, 0x67, 0x1f, 0xea, 0x75, 0x50, 0xfd, 0xc0, 0x6d, 0x13, 0xa7, - 0xe5, 0xdb, 0x8e, 0x49, 0x5a, 0x1e, 0x71, 0xc8, 0xb1, 0x36, 0x82, 0x5c, 0x15, 0x06, 0xd9, 0xa6, - 0x00, 0x9d, 0xae, 0xab, 0xeb, 0x50, 0xea, 0x75, 0x2d, 0x23, 0x20, 0x2d, 0x6a, 0xd1, 0xda, 0xe8, - 0x52, 0x61, 0xb9, 0xb4, 0x36, 0x5f, 0x67, 0xe6, 0x5e, 0x17, 0xe6, 0x5e, 0xdf, 0x11, 0xe6, 0xbe, - 0x21, 0x7d, 0xff, 0xff, 0x8b, 0x05, 0x1d, 0x18, 0x11, 0x5d, 0x56, 0xff, 0xb9, 0x00, 0x73, 0x1e, - 0xe9, 0xb6, 0x6d, 0x13, 0x5f, 0x4c, 0xcb, 0x6a, 0x3f, 0x6b, 0x19, 0xe6, 0x61, 0xab, 0x4d, 0x8e, - 0x48, 0x5b, 0x1b, 0x5b, 0x1a, 0x5a, 0x2e, 0xad, 0x35, 0xea, 0x67, 0x3f, 0xc2, 0x7a, 0xa8, 0x8f, - 0xba, 0x1e, 0xb1, 0xbb, 0xdb, 0x7e, 0xb6, 0x6e, 0x1e, 0x3e, 0xa4, 0xbc, 0xb6, 0x9c, 0xc0, 0xeb, - 0xeb, 0x33, 0x5e, 0x26, 0x50, 0x3d, 0x04, 0x05, 0x2f, 0x24, 0xda, 0xdb, 0xd7, 0x14, 0xdc, 0x7c, - 0xfd, 0x7c, 0x9b, 0x7f, 0x4a, 0xb9, 0x08, 0xb6, 0x3e, 0xdb, 0xb4, 0xf2, 0x2c, 0xb1, 0xa8, 0x1a, - 0x50, 0x66, 0x9b, 0xf9, 0x81, 0x11, 0x10, 0x5f, 0x9b, 0xc0, 0x8d, 0x3e, 0x7a, 0x89, 0x8d, 0xb6, - 0x91, 0x01, 0xdb, 0xa5, 0xf4, 0x2c, 0x5a, 0x99, 0x6f, 0xc0, 0x6b, 0xa7, 0xa8, 0x41, 0x55, 0x60, - 0xe8, 0x90, 0xf4, 0xd1, 0x5a, 0x8a, 0x3a, 0xfd, 0x49, 0xcd, 0xe1, 0xc8, 0x68, 0xf7, 0x08, 0x37, - 0x13, 0xf6, 0xf1, 0xc1, 0xc5, 0xf7, 0x0a, 0xf3, 0x01, 0x4c, 0x66, 0x1c, 0x2a, 0xce, 0x62, 0x98, - 0xb1, 0xb8, 0x1f, 0x67, 0x51, 0x5a, 0x5b, 0xcd, 0x73, 0x9e, 0x04, 0xe7, 0xf8, 0xae, 0x0e, 0x28, - 0xe9, 0x13, 0x66, 0x6c, 0x79, 0x37, 0xb9, 0x65, 0x3d, 0xf7, 0x96, 0xc8, 0x36, 0xb6, 0x5f, 0x53, - 0x92, 0x25, 0x65, 0xb8, 0x29, 0xc9, 0xc3, 0xca, 0x48, 0x53, 0x92, 0x65, 0xa5, 0xd8, 0x94, 0xe4, - 0xa2, 0x02, 0x4d, 0x49, 0x06, 0xa5, 0xd4, 0x94, 0xe4, 0x92, 0x52, 0x6e, 0x4a, 0x72, 0x59, 0x19, - 0x6b, 0x4a, 0x72, 0x45, 0x19, 0x6f, 0x4a, 0xf2, 0xb8, 0xa2, 0xd4, 0xfe, 0xed, 0x0a, 0x4c, 0x3f, - 0xe5, 0xcf, 0x74, 0x4b, 0x84, 0x0e, 0x7c, 0x94, 0x97, 0xa1, 0xec, 0x18, 0x1d, 0xe2, 0x77, 0x0d, - 0x93, 0x88, 0x87, 0x59, 0xd4, 0x4b, 0xe1, 0x5a, 0xc3, 0x52, 0x17, 0xa1, 0x14, 0xfa, 0x1b, 0xfe, - 0x3e, 0x8b, 0x3a, 0x88, 0xa5, 0x86, 0xa5, 0xd6, 0x61, 0xb2, 0x6b, 0x78, 0xc4, 0x09, 0x5a, 0x09, - 0x56, 0xec, 0xc1, 0x4e, 0x30, 0xd0, 0xa3, 0x18, 0xc3, 0xeb, 0xa0, 0x72, 0xfc, 0x38, 0x5f, 0x09, - 0xd1, 0x15, 0x06, 0x79, 0x1a, 0x71, 0xaf, 0xc1, 0x18, 0xc7, 0xf6, 0x7a, 0x0e, 0x45, 0x1c, 0x66, - 0x22, 0xb2, 0x45, 0xbd, 0xe7, 0x24, 0x24, 0xb0, 0x1d, 0x3b, 0xb0, 0x8d, 0x80, 0xa0, 0x97, 0x19, - 0x41, 0x1b, 0xe1, 0x12, 0x34, 0x04, 0xa4, 0x61, 0xa9, 0xef, 0xc3, 0x9c, 0xe9, 0x76, 0xba, 0x6d, - 0x82, 0x6f, 0x99, 0x1c, 0x51, 0xca, 0x5d, 0x23, 0x30, 0x0f, 0x28, 0xd5, 0x28, 0x52, 0xcd, 0x44, - 0x08, 0x5b, 0x14, 0xbe, 0x41, 0xc1, 0x0d, 0x4b, 0xbd, 0x04, 0x80, 0x4e, 0x17, 0xad, 0x58, 0x2b, - 0xa2, 0x2c, 0x45, 0xba, 0x82, 0xf7, 0x45, 0xcf, 0x16, 0x39, 0xe7, 0x7e, 0x97, 0xa0, 0x4a, 0x34, - 0x60, 0x67, 0x13, 0x90, 0x9d, 0x7e, 0x97, 0x50, 0x85, 0xa8, 0x5f, 0xc3, 0x7c, 0x88, 0x1d, 0x86, - 0x74, 0x74, 0x52, 0x6e, 0x2f, 0xd0, 0x4a, 0x68, 0x2c, 0x73, 0x03, 0x7e, 0xea, 0x2e, 0x0f, 0xdb, - 0x1b, 0xd2, 0xbf, 0x52, 0x37, 0xa5, 0x1d, 0xa7, 0x6f, 0x76, 0x87, 0x31, 0x50, 0x3f, 0x85, 0xa9, - 0x90, 0x3d, 0x55, 0x9e, 0x60, 0x5c, 0xce, 0xc7, 0x38, 0x3c, 0x89, 0xde, 0x0b, 0x59, 0xee, 0xc2, - 0x25, 0x8b, 0xec, 0x19, 0xbd, 0x76, 0xec, 0xf2, 0x58, 0x10, 0xe2, 0xbc, 0xc7, 0xf2, 0xf1, 0x9e, - 0xe7, 0x5c, 0xc4, 0x45, 0xef, 0x18, 0xfe, 0xa1, 0xd8, 0xe3, 0x6d, 0x50, 0xdb, 0x86, 0x1f, 0xf0, - 0x7b, 0x41, 0xee, 0xb6, 0xa5, 0x4d, 0xe0, 0xb5, 0x8c, 0x53, 0x08, 0x5e, 0x08, 0xa5, 0x68, 0x58, - 0xea, 0x0d, 0x98, 0x44, 0xe4, 0x3d, 0xdb, 0x0b, 0x49, 0x6c, 0x4b, 0x53, 0x11, 0x5b, 0xa1, 0xa0, - 0x7b, 0x14, 0x82, 0x24, 0x0d, 0x4b, 0xfd, 0x18, 0x5e, 0x47, 0xf4, 0xa4, 0xf0, 0x7e, 0x60, 0x78, - 0xd4, 0x66, 0x42, 0xf2, 0x49, 0x24, 0xaf, 0x52, 0xd4, 0xb8, 0x84, 0xdb, 0x0c, 0x4f, 0x30, 0xbb, - 0x03, 0x80, 0x94, 0x2c, 0xac, 0x4c, 0xe5, 0x0c, 0x2b, 0x45, 0xa4, 0xc1, 0xa8, 0xd2, 0x04, 0x94, - 0xb0, 0x15, 0x8f, 0x4e, 0xd3, 0x39, 0xd9, 0x54, 0x28, 0xe5, 0x67, 0x51, 0x84, 0x5a, 0x83, 0xe9, - 0xe4, 0xa1, 0x8e, 0xa8, 0x3f, 0x71, 0x1d, 0x6d, 0x06, 0xcf, 0x32, 0x79, 0x1c, 0x3b, 0xc7, 0xe7, - 0x0c, 0xa4, 0xde, 0x83, 0xa5, 0x94, 0x22, 0xcc, 0x03, 0x62, 0xf5, 0xda, 0x71, 0x55, 0xcc, 0x22, - 0xf9, 0x42, 0x9c, 0x7c, 0x5b, 0x60, 0x09, 0x45, 0x6c, 0x40, 0xf5, 0x0c, 0x85, 0x6a, 0xc8, 0x65, - 0xfe, 0xf8, 0x64, 0x65, 0x6e, 0xa7, 0xe5, 0x17, 0x16, 0x35, 0x97, 0xcf, 0xa2, 0x12, 0x07, 0x14, - 0xa6, 0x34, 0xa0, 0x14, 0x23, 0xa0, 0xae, 0x37, 0xd0, 0xe6, 0xd1, 0x39, 0x27, 0x68, 0xd6, 0x19, - 0x28, 0xf1, 0x28, 0x13, 0x87, 0xc1, 0xeb, 0x79, 0x2d, 0xe7, 0xf5, 0xcc, 0x66, 0x1c, 0x15, 0xef, - 0xc9, 0x80, 0x85, 0x93, 0x74, 0x8e, 0x1b, 0x2c, 0xe4, 0xdc, 0x60, 0x2e, 0xf3, 0x46, 0x70, 0x0b, - 0x0f, 0xae, 0x26, 0xb7, 0x70, 0x3d, 0x7b, 0xdf, 0x76, 0x8c, 0x76, 0x7a, 0xaf, 0x6a, 0xce, 0xbd, - 0x2e, 0xc7, 0xf7, 0x7a, 0xcc, 0x99, 0x25, 0xf7, 0xbc, 0x0d, 0x5a, 0x72, 0x4f, 0x8f, 0x3c, 0xeb, - 0x11, 0x1f, 0x2f, 0x7f, 0x11, 0xdd, 0xdf, 0x74, 0x9c, 0x89, 0xce, 0xa0, 0x0d, 0x4b, 0xfd, 0x2a, - 0xee, 0x31, 0x45, 0x3a, 0xab, 0xdd, 0x5d, 0x2a, 0x2c, 0x57, 0x4e, 0x08, 0x94, 0x98, 0x06, 0xd3, - 0x10, 0x99, 0x70, 0x1e, 0xfd, 0x2e, 0x89, 0x79, 0x58, 0xbe, 0xa2, 0x3e, 0x4e, 0xab, 0xc2, 0xef, - 0xed, 0xef, 0x53, 0xb1, 0x4c, 0xd7, 0x09, 0x6c, 0x87, 0x66, 0x52, 0x7e, 0x8b, 0xe6, 0x8e, 0x5b, - 0x4b, 0x85, 0x65, 0x59, 0x5f, 0x4a, 0x28, 0x95, 0xa1, 0x6e, 0x72, 0xcc, 0x75, 0xff, 0x11, 0x39, - 0x1e, 0x7c, 0x32, 0x3c, 0xbb, 0x6e, 0xf9, 0xf6, 0x37, 0xa4, 0xb5, 0xdb, 0xa7, 0x89, 0xd2, 0xbd, - 0xc1, 0x27, 0xf3, 0x80, 0x61, 0x6d, 0xdb, 0xdf, 0x90, 0x0d, 0x8a, 0xa3, 0x5e, 0x03, 0xc5, 0x34, - 0x1c, 0x93, 0xb4, 0x85, 0xa2, 0x88, 0xa5, 0x5d, 0x42, 0x19, 0xc6, 0xd9, 0xba, 0x2e, 0x96, 0xd5, - 0xb7, 0x60, 0x22, 0x89, 0x4a, 0x75, 0xba, 0x84, 0x3a, 0x4d, 0xe2, 0x36, 0x10, 0xd7, 0x0f, 0x6c, - 0xf3, 0xb0, 0xdf, 0x8a, 0x45, 0xa9, 0xcb, 0x0c, 0x97, 0x01, 0x76, 0xc2, 0x58, 0xb5, 0x0f, 0x4b, - 0x1c, 0x57, 0x98, 0x45, 0x2b, 0x70, 0x5b, 0x91, 0x47, 0xa3, 0x8f, 0xaf, 0x96, 0xef, 0xf1, 0x2d, - 0x30, 0x46, 0xc2, 0x24, 0x76, 0xdc, 0x6d, 0xe1, 0xe3, 0xe8, 0x2b, 0xd4, 0x60, 0x54, 0xbc, 0xbb, - 0xd7, 0x59, 0xe2, 0xcf, 0x3f, 0xd5, 0xcf, 0x60, 0xc6, 0x23, 0x81, 0xd7, 0xe7, 0x71, 0xbb, 0xdd, - 0xb2, 0x9d, 0x80, 0x78, 0x47, 0x46, 0x5b, 0xbb, 0x92, 0x6f, 0xe3, 0x29, 0x24, 0x67, 0xb1, 0xbd, - 0xdd, 0xe0, 0xc4, 0x11, 0xdb, 0x8e, 0xf1, 0xdc, 0xee, 0xf4, 0x3a, 0x11, 0xdb, 0xab, 0xe7, 0x61, - 0xfb, 0x09, 0xa3, 0x0e, 0xd9, 0xde, 0x4a, 0xb3, 0xe5, 0xc7, 0xf0, 0xb5, 0x37, 0xf0, 0x58, 0x09, - 0x2a, 0xee, 0x4e, 0x7c, 0xf5, 0x03, 0x5a, 0x39, 0x50, 0xaa, 0x5d, 0xc3, 0x3c, 0x74, 0xf7, 0xf6, - 0x5a, 0xa6, 0x4b, 0xf6, 0xf6, 0x6c, 0xd3, 0x26, 0x4e, 0xa0, 0xbd, 0xb9, 0x54, 0x58, 0x2e, 0xe8, - 0xb3, 0x88, 0xb0, 0xc1, 0xe0, 0x9b, 0x11, 0x58, 0xed, 0x40, 0x2d, 0x23, 0x41, 0x20, 0xcf, 0xbb, - 0x36, 0x13, 0x97, 0x3d, 0xe3, 0xe5, 0x9c, 0xcf, 0x78, 0x71, 0x20, 0x53, 0xd8, 0x0a, 0x39, 0xe1, - 0x23, 0xbe, 0x0b, 0x8b, 0x4c, 0x54, 0xc7, 0x75, 0x5a, 0xf8, 0xcb, 0xd8, 0x6d, 0x93, 0x16, 0xf1, - 0x3c, 0xd7, 0xc3, 0x77, 0xe9, 0x6b, 0xd7, 0x96, 0x86, 0x96, 0x8b, 0xfa, 0x6b, 0x08, 0x7c, 0xe4, - 0x3a, 0xba, 0x40, 0xda, 0xa2, 0x38, 0xf4, 0xc9, 0xf9, 0xea, 0x32, 0x28, 0x07, 0x86, 0xcf, 0xe8, - 0x5b, 0x5d, 0xb7, 0x6d, 0x9b, 0x7d, 0xed, 0x2d, 0x34, 0xed, 0xca, 0x81, 0xe1, 0x23, 0xc5, 0x13, - 0x5c, 0x55, 0x5f, 0x87, 0x31, 0xd3, 0x73, 0x9d, 0xd0, 0xfe, 0xb4, 0xb7, 0xd1, 0x52, 0xcb, 0x74, - 0x51, 0xd8, 0x12, 0x4d, 0x51, 0x7d, 0x7b, 0x9f, 0x7a, 0x2f, 0xd3, 0xed, 0x39, 0x81, 0x56, 0xc7, - 0xd7, 0x55, 0x62, 0x6b, 0x9b, 0x74, 0x49, 0xbd, 0x0a, 0x15, 0xc3, 0x0c, 0xec, 0x23, 0x3b, 0xe8, - 0x73, 0xa4, 0xfb, 0x88, 0x34, 0x26, 0x56, 0x19, 0xda, 0x1a, 0x4c, 0x9b, 0x07, 0x76, 0xdb, 0x8a, - 0xa9, 0x92, 0x61, 0x3f, 0x60, 0x21, 0x12, 0x81, 0xa1, 0x6e, 0x18, 0xcd, 0x32, 0x28, 0x3d, 0x9f, - 0x78, 0xa8, 0x68, 0x8f, 0xa3, 0x37, 0x10, 0xbd, 0x42, 0xd7, 0xa9, 0xda, 0x3c, 0x86, 0xb9, 0x0e, - 0x97, 0xc4, 0xfb, 0xe4, 0xcf, 0x95, 0x3c, 0x0f, 0x88, 0x17, 0x09, 0xde, 0x64, 0x31, 0x90, 0x23, - 0x6d, 0x22, 0xce, 0x16, 0x47, 0x09, 0x05, 0xe4, 0x47, 0x4d, 0x91, 0x7e, 0xcc, 0x04, 0x64, 0xc0, - 0x24, 0xcd, 0xa7, 0x30, 0x61, 0xf4, 0x02, 0xb7, 0xe5, 0x11, 0x9f, 0x04, 0xad, 0xae, 0x6b, 0x3b, - 0x81, 0xaf, 0xdd, 0x44, 0x8b, 0xb8, 0x1a, 0xb9, 0x4f, 0xea, 0x37, 0xc3, 0x5e, 0xc4, 0xd1, 0x6a, - 0x5d, 0xa7, 0xd8, 0x4f, 0x10, 0x59, 0x1f, 0xa7, 0xf4, 0xb1, 0x05, 0xf5, 0x9f, 0x60, 0xc2, 0x27, - 0x86, 0x67, 0x1e, 0x50, 0x03, 0xf7, 0xec, 0xdd, 0x1e, 0x75, 0x6a, 0xb7, 0xb0, 0xfa, 0x7b, 0x9c, - 0xa7, 0x74, 0xc9, 0x2c, 0x35, 0xea, 0xdb, 0xc8, 0x72, 0x3d, 0xe4, 0xc8, 0xca, 0x41, 0xc5, 0x4f, - 0x2d, 0xab, 0x4f, 0x41, 0xea, 0x90, 0x8e, 0xab, 0xbd, 0x8b, 0x1b, 0x6e, 0xbe, 0xfc, 0x86, 0x9f, - 0x90, 0x8e, 0xcb, 0x36, 0x41, 0x86, 0xea, 0xd7, 0x30, 0xc1, 0x73, 0x22, 0xee, 0xb4, 0x6d, 0xe2, - 0x6b, 0x7f, 0x83, 0x9a, 0x7a, 0x27, 0x73, 0x17, 0xee, 0xda, 0xe9, 0x0e, 0x3c, 0x63, 0x7a, 0x20, - 0xe8, 0x74, 0xe5, 0x28, 0xb5, 0xa2, 0xde, 0x84, 0x19, 0x9e, 0x84, 0x86, 0xd6, 0xc5, 0x2b, 0x96, - 0xdb, 0x68, 0xd5, 0x93, 0x08, 0x0d, 0x45, 0x64, 0x95, 0xcb, 0x3f, 0xc0, 0x78, 0x84, 0x4e, 0xeb, - 0x6c, 0x5f, 0x7b, 0x0f, 0x25, 0x5a, 0xcb, 0x73, 0xee, 0x90, 0x19, 0xad, 0x13, 0x7d, 0xbd, 0x42, - 0x12, 0xdf, 0x89, 0x54, 0x83, 0x8a, 0x92, 0xf6, 0x1b, 0xef, 0x9f, 0x37, 0xd5, 0xd0, 0x7b, 0x69, - 0x8f, 0x71, 0x0b, 0x66, 0x07, 0xd2, 0xef, 0xe0, 0x39, 0x9e, 0xfa, 0x03, 0x66, 0xb3, 0xc9, 0x14, - 0x7c, 0xe7, 0x39, 0x3d, 0xf5, 0x2d, 0x98, 0xc1, 0x9e, 0x42, 0x2b, 0xf0, 0x0c, 0xc7, 0xb7, 0x63, - 0x2f, 0xf1, 0x43, 0x24, 0x9a, 0x42, 0xe8, 0x4e, 0x08, 0x64, 0x96, 0x7e, 0x1f, 0x2a, 0xc9, 0x22, - 0x49, 0xfb, 0xdb, 0x9c, 0x07, 0x18, 0x23, 0xf1, 0xd2, 0x48, 0x5d, 0x81, 0x29, 0x87, 0x1c, 0x0f, - 0xde, 0xd3, 0xdf, 0xb1, 0x8a, 0xd5, 0x21, 0xc7, 0xa9, 0x5b, 0x7a, 0x08, 0x65, 0x5e, 0x5f, 0x62, - 0xbf, 0x50, 0xfb, 0x08, 0xf7, 0xbd, 0x96, 0x79, 0x45, 0x88, 0xc1, 0x4c, 0xc6, 0x0c, 0x5c, 0x6f, - 0x93, 0x7e, 0x8a, 0x6a, 0x15, 0x3f, 0xd4, 0xf7, 0x40, 0x1b, 0xa8, 0x56, 0x45, 0xb2, 0x7e, 0x87, - 0x15, 0x9f, 0xa9, 0x92, 0x55, 0xe4, 0xeb, 0x37, 0x61, 0xc6, 0x6c, 0xbb, 0x3e, 0xd7, 0xdb, 0x1e, - 0x75, 0x4b, 0xbc, 0x3a, 0xfa, 0x7b, 0xee, 0xc1, 0x28, 0x74, 0x87, 0x03, 0x79, 0x85, 0x74, 0x1b, - 0x34, 0x46, 0x74, 0x64, 0xfb, 0xf6, 0xae, 0xdd, 0xa6, 0x4e, 0x52, 0x90, 0xad, 0x23, 0xd9, 0x34, - 0xc2, 0x3f, 0x0f, 0xc1, 0x9c, 0xf0, 0x0e, 0x00, 0xdf, 0x8d, 0xea, 0x7a, 0x23, 0x6f, 0x79, 0xc3, - 0x64, 0xa0, 0x7a, 0xde, 0x82, 0xc5, 0xec, 0x9d, 0x79, 0x6d, 0x4d, 0x2c, 0x6d, 0x13, 0xe3, 0xc2, - 0x42, 0x86, 0x00, 0x9b, 0x02, 0x47, 0xdd, 0x85, 0xc9, 0x5d, 0xc3, 0x27, 0xb1, 0xfb, 0xb2, 0x9d, - 0x3d, 0x57, 0x7b, 0x78, 0xca, 0x3b, 0x89, 0xbb, 0xba, 0x0d, 0xc3, 0x27, 0x09, 0xc7, 0xa0, 0x4f, - 0xec, 0xa6, 0x97, 0xe6, 0x2d, 0x98, 0xce, 0xf4, 0x4f, 0x19, 0x2d, 0xa8, 0x77, 0x93, 0xcd, 0x9c, - 0xc5, 0xa4, 0x93, 0xe5, 0xbd, 0xe1, 0xa3, 0xd5, 0xfa, 0x13, 0xa3, 0xdf, 0x76, 0x0d, 0x2b, 0xde, - 0x2d, 0xfa, 0x02, 0x8a, 0xa1, 0x53, 0xfa, 0x4d, 0x39, 0x87, 0xbd, 0xa0, 0xb0, 0xe7, 0xd3, 0x94, - 0x64, 0x45, 0x99, 0x68, 0x4a, 0xf2, 0x75, 0xe5, 0x46, 0x53, 0x92, 0x6f, 0x28, 0xf5, 0xa6, 0x24, - 0xaf, 0x28, 0xef, 0x34, 0x25, 0xf9, 0x1d, 0x65, 0xb5, 0x29, 0xc9, 0xab, 0xca, 0x5a, 0x53, 0x92, - 0xd7, 0x94, 0x9b, 0xb5, 0x9b, 0x50, 0x49, 0x3a, 0x12, 0x1a, 0x72, 0xe3, 0x69, 0x2d, 0xca, 0x38, - 0xa4, 0x97, 0x0e, 0xa2, 0x24, 0xb6, 0xf6, 0x4b, 0x01, 0x66, 0x06, 0xdc, 0x2e, 0xb6, 0xab, 0x30, - 0x5f, 0xf5, 0x08, 0x7d, 0xde, 0xb1, 0x7c, 0xb5, 0xc0, 0xf3, 0x55, 0x04, 0x44, 0xf9, 0xea, 0x34, - 0x8c, 0xf0, 0xc7, 0xc7, 0xfa, 0x4a, 0xc3, 0x1e, 0x3e, 0xb8, 0x26, 0x0c, 0xa3, 0x0b, 0xc0, 0x26, - 0x52, 0x65, 0xed, 0x56, 0xbe, 0x3a, 0x20, 0x29, 0x87, 0xce, 0x58, 0xa8, 0xf7, 0x60, 0x84, 0xfe, - 0xe8, 0xf9, 0xd8, 0x62, 0x4a, 0x14, 0x15, 0x67, 0x73, 0xe9, 0xf9, 0x3a, 0xa7, 0xae, 0xfd, 0x79, - 0x04, 0x94, 0xc4, 0xd3, 0xfa, 0xad, 0xfa, 0x67, 0x91, 0x0e, 0x86, 0xe2, 0x3a, 0xd8, 0x84, 0x62, - 0x54, 0x0f, 0x31, 0xd1, 0xdf, 0x38, 0x5d, 0x0f, 0x61, 0x1d, 0x24, 0x07, 0xa2, 0xfe, 0xa9, 0xc3, - 0x64, 0x60, 0x78, 0xfb, 0x24, 0xd5, 0x9b, 0x63, 0x3d, 0xb4, 0x09, 0x06, 0x4a, 0xf5, 0xe6, 0x38, - 0x7e, 0x5c, 0xe6, 0x11, 0xd6, 0xbf, 0x62, 0x90, 0x64, 0x6f, 0x8e, 0x63, 0xf3, 0x03, 0x8c, 0xb2, - 0xe3, 0xb3, 0x45, 0xe6, 0x3b, 0x93, 0x0d, 0x33, 0x39, 0xdd, 0x30, 0xfb, 0x10, 0xe6, 0x39, 0x0b, - 0x96, 0x9a, 0x85, 0xdb, 0xba, 0x4e, 0xbb, 0x8f, 0xfd, 0x35, 0x59, 0x9f, 0x65, 0x18, 0x9b, 0x14, - 0x41, 0xec, 0xfe, 0xd8, 0x69, 0xf7, 0x71, 0x0c, 0x30, 0xd8, 0xb1, 0x00, 0xd6, 0xfb, 0xf1, 0xd3, - 0x5d, 0x0a, 0x0d, 0x46, 0x85, 0x9b, 0x2d, 0xb1, 0x21, 0x03, 0xff, 0x54, 0x67, 0x61, 0x54, 0x78, - 0xc4, 0x32, 0x42, 0x46, 0x02, 0xe6, 0x02, 0x1b, 0x30, 0x1e, 0xf7, 0x5d, 0xd4, 0x0f, 0x8e, 0xe5, - 0xed, 0xcf, 0x44, 0x84, 0xe8, 0x0c, 0xaf, 0x83, 0x6a, 0x11, 0xea, 0xd0, 0x5a, 0xc6, 0x5e, 0x40, - 0x53, 0x49, 0xea, 0xf2, 0xb4, 0x71, 0x3c, 0xa0, 0xc2, 0x20, 0xeb, 0x14, 0xb0, 0x49, 0xd7, 0xd5, - 0x7f, 0x29, 0x00, 0x73, 0x8a, 0xf1, 0xbe, 0x20, 0x15, 0xd1, 0x22, 0x81, 0x61, 0x63, 0xd7, 0x9f, - 0x8a, 0xf1, 0x28, 0x4f, 0x96, 0x90, 0x36, 0xda, 0x3a, 0x6e, 0x11, 0x75, 0x0b, 0x0d, 0xff, 0xf0, - 0x2e, 0xe3, 0xfa, 0xe0, 0x82, 0x3e, 0x67, 0x9e, 0x04, 0x9c, 0xff, 0x0a, 0xe6, 0x4e, 0xa4, 0x54, - 0xef, 0xc0, 0x82, 0x69, 0x38, 0x2d, 0xff, 0xd0, 0xee, 0xc6, 0xdd, 0x3d, 0x75, 0xa9, 0x36, 0x2d, - 0xbc, 0x0a, 0x78, 0xd0, 0x39, 0xd3, 0x70, 0xb6, 0x0f, 0xed, 0x6e, 0xe4, 0xea, 0xd7, 0x39, 0xc2, - 0x46, 0x05, 0xca, 0xf1, 0x03, 0x32, 0x5f, 0x56, 0xfb, 0x4f, 0x09, 0x26, 0x63, 0x13, 0x82, 0xdf, - 0xcd, 0xbb, 0x8b, 0xd9, 0xda, 0x70, 0xd2, 0xd6, 0xae, 0x40, 0x25, 0xd5, 0xab, 0x64, 0x6d, 0xea, - 0xf2, 0x5e, 0xbc, 0x4f, 0x59, 0x83, 0x31, 0x87, 0x3c, 0x8f, 0x21, 0xb1, 0xae, 0x74, 0x89, 0x2e, - 0x0a, 0x9c, 0x6c, 0xeb, 0x97, 0x4f, 0xb0, 0xfe, 0xcb, 0x50, 0xde, 0xf5, 0x0c, 0xc7, 0x3c, 0x68, - 0x05, 0xee, 0x21, 0x61, 0x4f, 0xa0, 0xac, 0x97, 0xd8, 0xda, 0x0e, 0x5d, 0x12, 0x79, 0x11, 0x55, - 0x4a, 0x02, 0x75, 0x0c, 0x51, 0x69, 0x5e, 0xa4, 0xf7, 0x9c, 0x8d, 0x18, 0x41, 0xec, 0xdd, 0x8c, - 0x9f, 0xf5, 0x6e, 0x94, 0x97, 0x7c, 0x37, 0x0b, 0x00, 0x42, 0x28, 0xde, 0x05, 0x2e, 0xea, 0x32, - 0x13, 0xa5, 0x61, 0xa5, 0xa6, 0x1f, 0xe1, 0xdc, 0xa3, 0xf6, 0xa7, 0x21, 0x50, 0x53, 0x09, 0xcd, - 0xef, 0xdb, 0x6c, 0x62, 0xaa, 0x1e, 0x39, 0x4b, 0xd5, 0xa3, 0x2f, 0xa9, 0xea, 0x64, 0xc2, 0x27, - 0x9f, 0x3f, 0xe1, 0x4b, 0x36, 0xc4, 0x8b, 0xe7, 0x6f, 0x88, 0x9f, 0x96, 0xab, 0xc2, 0x29, 0xb9, - 0x6a, 0xed, 0x17, 0x09, 0xc6, 0xb0, 0x16, 0xff, 0xdd, 0x5c, 0xf5, 0x16, 0x94, 0x79, 0x93, 0x8d, - 0xf1, 0x19, 0x46, 0x3e, 0xb5, 0x13, 0x92, 0x13, 0xde, 0x4a, 0x43, 0x1e, 0xa5, 0x20, 0xfa, 0x50, - 0x49, 0xac, 0xc3, 0x2d, 0x1a, 0x4c, 0xc8, 0x6f, 0x04, 0xf9, 0xad, 0xe6, 0xcb, 0x9c, 0x78, 0xeb, - 0x09, 0xd9, 0x87, 0x4d, 0xf1, 0xd8, 0x62, 0xdc, 0x30, 0x47, 0x93, 0x86, 0x79, 0x0d, 0x42, 0x5f, - 0x13, 0x76, 0xd7, 0x65, 0x6c, 0x87, 0x8d, 0x8b, 0x75, 0xd1, 0x59, 0x9f, 0x03, 0x39, 0x74, 0x53, - 0x45, 0xc6, 0x85, 0x70, 0xef, 0x14, 0x33, 0x6f, 0x38, 0xcb, 0xbc, 0x4b, 0x2f, 0x69, 0xde, 0x69, - 0x0f, 0x58, 0x1e, 0xf4, 0x80, 0xd7, 0x40, 0x31, 0xda, 0x1e, 0x31, 0x2c, 0x11, 0xb9, 0x88, 0x85, - 0xde, 0x4f, 0xd6, 0xc7, 0xf9, 0xfa, 0x3a, 0x5f, 0xae, 0xfd, 0xc7, 0x45, 0x50, 0x44, 0xf0, 0x0a, - 0x8d, 0x2e, 0x76, 0x8c, 0x42, 0xe2, 0x18, 0x69, 0x6b, 0xbc, 0x78, 0xa6, 0x35, 0x0e, 0x9d, 0x62, - 0x8d, 0xd2, 0x89, 0xd6, 0x38, 0xfc, 0xd7, 0x3b, 0x9e, 0x91, 0xe4, 0xfd, 0xfe, 0x76, 0xfe, 0xa5, - 0xf6, 0x5d, 0x05, 0xca, 0xeb, 0xbc, 0x23, 0x87, 0xea, 0x8a, 0xed, 0x5a, 0x48, 0xee, 0x7a, 0x1b, - 0xb4, 0x74, 0x6c, 0x0b, 0x07, 0xb4, 0x6c, 0xf4, 0x3f, 0x9d, 0x8c, 0x70, 0x62, 0x3e, 0x7b, 0x1f, - 0x2a, 0xa9, 0x21, 0x87, 0x94, 0xb7, 0x49, 0xe0, 0x27, 0x06, 0x1a, 0xcb, 0xa0, 0x0c, 0x4c, 0xb1, - 0x98, 0x4f, 0xae, 0xf8, 0xc9, 0xc9, 0xd5, 0x26, 0x94, 0x13, 0x23, 0xa2, 0xbc, 0xea, 0x29, 0xf9, - 0xb1, 0xb1, 0xd0, 0x22, 0x94, 0xc2, 0x16, 0x26, 0x8f, 0xe2, 0x45, 0x1d, 0xc4, 0x12, 0xcb, 0xa3, - 0x63, 0xe5, 0x14, 0x1f, 0x3c, 0x7b, 0x61, 0x21, 0xf5, 0x25, 0xcc, 0x9d, 0xdc, 0xc5, 0x87, 0x7c, - 0x5d, 0xef, 0x19, 0x3f, 0xbb, 0x7f, 0x9f, 0xe2, 0x1d, 0xc5, 0x88, 0x73, 0x4c, 0xa9, 0x63, 0xbc, - 0x37, 0x45, 0xbc, 0xa0, 0xbc, 0x77, 0xb0, 0x15, 0x44, 0x65, 0x4d, 0x33, 0xce, 0x39, 0xa5, 0x9e, - 0x64, 0xd1, 0x23, 0xc9, 0xf5, 0x21, 0x4c, 0x1c, 0x10, 0xc3, 0x0b, 0x76, 0x89, 0x11, 0x9c, 0x77, - 0x34, 0xad, 0x84, 0x94, 0x82, 0x5b, 0xd6, 0xac, 0xa6, 0x72, 0x8e, 0x59, 0x0d, 0xcb, 0x8d, 0xb2, - 0x66, 0x35, 0xac, 0xab, 0x2c, 0xa6, 0x8c, 0xb4, 0x46, 0x55, 0x98, 0xeb, 0x0c, 0x44, 0x2c, 0x63, - 0x45, 0x68, 0x7c, 0x84, 0x32, 0x91, 0x1c, 0xa1, 0x24, 0xeb, 0x2b, 0x35, 0x5d, 0x5f, 0x5d, 0x8b, - 0xcc, 0xd8, 0xb6, 0x88, 0x13, 0xd8, 0x41, 0x1f, 0xa7, 0xdb, 0x38, 0x0f, 0xc2, 0xf5, 0x06, 0x5f, - 0xce, 0xec, 0xdb, 0x4f, 0x65, 0xf6, 0xed, 0x4f, 0x1e, 0xdb, 0x4c, 0xbf, 0x9a, 0xb1, 0xcd, 0xcc, - 0xab, 0x19, 0xdb, 0xcc, 0x9e, 0x32, 0xb6, 0xd9, 0x81, 0x69, 0x46, 0x95, 0xee, 0x9a, 0x6a, 0x39, - 0x9f, 0xf7, 0x24, 0x92, 0xa7, 0xfa, 0xa5, 0xa7, 0x0e, 0x83, 0xe6, 0x4e, 0x1f, 0x06, 0xe5, 0x98, - 0xce, 0xcc, 0x9f, 0x3d, 0x9d, 0x79, 0x04, 0x2a, 0xe3, 0xc2, 0xfa, 0xb6, 0xec, 0x5f, 0x95, 0x7c, - 0xac, 0xbd, 0x94, 0xcc, 0x3e, 0x38, 0x90, 0x86, 0x8c, 0x7b, 0xec, 0xa7, 0xae, 0x20, 0xed, 0x43, - 0xc3, 0x0f, 0xf8, 0x0a, 0x2d, 0xe0, 0x63, 0xfc, 0x68, 0xb8, 0x22, 0x5e, 0x64, 0x6a, 0x0b, 0x68, - 0x6a, 0xb3, 0x21, 0xd5, 0x53, 0x84, 0x87, 0x26, 0x97, 0x5d, 0xc2, 0x54, 0x4f, 0x28, 0x61, 0x3e, - 0x87, 0x19, 0xdc, 0x24, 0x7a, 0xda, 0xa2, 0x1a, 0x5e, 0xcc, 0x12, 0x7f, 0xa0, 0x61, 0xe6, 0xeb, - 0x53, 0x94, 0xfe, 0x81, 0x20, 0x17, 0xb5, 0xeb, 0xd7, 0x30, 0x9f, 0xe2, 0x1b, 0xff, 0x43, 0xc6, - 0x52, 0xde, 0x89, 0x7f, 0x82, 0x77, 0xf4, 0xcf, 0x8c, 0xa6, 0x24, 0x0f, 0x29, 0x52, 0x53, 0x92, - 0x47, 0x94, 0xd1, 0xa6, 0x24, 0x5f, 0x52, 0xaa, 0xb5, 0xff, 0x2d, 0x40, 0x11, 0xb3, 0xd5, 0x33, - 0xa2, 0x60, 0x56, 0x0c, 0xba, 0x98, 0x19, 0x83, 0xd6, 0xa1, 0x84, 0x76, 0xca, 0x23, 0xf4, 0x50, - 0xde, 0xbf, 0x38, 0x32, 0x22, 0x11, 0x81, 0xe2, 0x8e, 0x48, 0xc2, 0x7d, 0xd0, 0xb7, 0x70, 0x1f, - 0x34, 0x07, 0x32, 0xf3, 0x57, 0x61, 0x03, 0x69, 0x14, 0xbf, 0x1b, 0x56, 0xed, 0xff, 0x24, 0x50, - 0x37, 0x13, 0xd3, 0xb3, 0xb3, 0xe3, 0x7b, 0xd4, 0xfc, 0xce, 0x8e, 0xef, 0x21, 0x3c, 0x11, 0xdf, - 0xb3, 0x54, 0x32, 0x94, 0xa9, 0x92, 0x3a, 0x4c, 0x0a, 0xcc, 0x78, 0x5e, 0xc5, 0x5b, 0x5f, 0x1c, - 0x14, 0x6b, 0x66, 0x5d, 0x01, 0xc1, 0x41, 0x14, 0x9b, 0xac, 0xed, 0x25, 0x82, 0x3b, 0x6b, 0x67, - 0x65, 0x36, 0x37, 0xe5, 0xec, 0xe6, 0xe6, 0x02, 0x14, 0xc3, 0x04, 0x4f, 0x44, 0xec, 0x70, 0xe1, - 0x9c, 0x7f, 0x15, 0xfb, 0x22, 0xfc, 0x8b, 0x1b, 0x8b, 0x92, 0xdc, 0x3f, 0x97, 0x30, 0xdf, 0x5b, - 0x3e, 0xa1, 0x6a, 0x78, 0x22, 0xa6, 0x0e, 0x3e, 0x61, 0x9e, 0x5b, 0xfc, 0x19, 0x2e, 0xb6, 0x44, - 0xe5, 0x48, 0x5f, 0x45, 0xd8, 0x07, 0x53, 0x92, 0x97, 0x80, 0x43, 0x81, 0x61, 0x36, 0x03, 0x19, - 0x3b, 0xef, 0x0c, 0x84, 0xd1, 0x0d, 0x64, 0xc2, 0x95, 0x81, 0x4c, 0x38, 0xfc, 0x93, 0xe3, 0xa8, - 0x22, 0xd7, 0xfe, 0xab, 0x00, 0x13, 0x7a, 0x7c, 0x62, 0xfa, 0xaa, 0x0c, 0x2b, 0x33, 0x72, 0x0f, - 0x65, 0xff, 0xcb, 0x22, 0x5b, 0x65, 0x52, 0xb6, 0xca, 0x6a, 0xff, 0x5d, 0x00, 0xd8, 0xc6, 0xc9, - 0xed, 0xab, 0x92, 0x3d, 0x99, 0x1b, 0x0e, 0xa5, 0x73, 0xc3, 0x6c, 0x71, 0x47, 0xb3, 0xc5, 0x4d, - 0xfd, 0xc5, 0x94, 0x39, 0x2d, 0x59, 0x29, 0xd6, 0xbe, 0x2d, 0x80, 0xbc, 0x79, 0x40, 0xcc, 0x43, - 0xbf, 0xd7, 0x49, 0x1f, 0x62, 0x38, 0x3a, 0xc4, 0x5d, 0x18, 0xd9, 0x6b, 0x1b, 0x47, 0xae, 0x87, - 0x22, 0x57, 0xd6, 0xae, 0x9f, 0x5e, 0x8b, 0x08, 0x8e, 0xf7, 0x90, 0x46, 0xe7, 0xb4, 0xd1, 0xff, - 0x7c, 0x87, 0xb0, 0x48, 0x63, 0x1f, 0x1b, 0xff, 0xf8, 0xc3, 0x4f, 0xd5, 0x0b, 0x3f, 0xfe, 0x54, - 0xbd, 0xf0, 0xeb, 0x4f, 0xd5, 0xc2, 0xb7, 0x2f, 0xaa, 0x85, 0x7f, 0x7f, 0x51, 0x2d, 0xfc, 0xcf, - 0x8b, 0x6a, 0xe1, 0x87, 0x17, 0xd5, 0xc2, 0x1f, 0x5e, 0x54, 0x0b, 0x7f, 0x7c, 0x51, 0xbd, 0xf0, - 0xeb, 0x8b, 0x6a, 0xe1, 0xfb, 0x9f, 0xab, 0x17, 0x7e, 0xf8, 0xb9, 0x7a, 0xe1, 0xc7, 0x9f, 0xab, - 0x17, 0xbe, 0xbc, 0xb5, 0xef, 0x46, 0x32, 0xd8, 0xee, 0xc9, 0x7f, 0x76, 0xff, 0x30, 0xf6, 0xb9, - 0x3b, 0x82, 0x4e, 0xf3, 0xe6, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x75, 0xe5, 0xf0, 0x51, 0x8f, - 0x31, 0x00, 0x00, + // 3696 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x73, 0xdb, 0x46, + 0x74, 0xa2, 0x05, 0x89, 0xe0, 0x23, 0x45, 0x41, 0xd0, 0x17, 0xa4, 0xc8, 0x94, 0xcc, 0xd8, 0x89, + 0x9c, 0xd8, 0x54, 0x24, 0x39, 0x75, 0x3e, 0xda, 0xb8, 0x92, 0x2c, 0xdb, 0x64, 0x1c, 0xdb, 0x81, + 0x94, 0x38, 0x93, 0x26, 0xc3, 0x81, 0x80, 0x95, 0x84, 0x8a, 0x04, 0x68, 0x00, 0x94, 0xcc, 0x4c, + 0x0f, 0x39, 0x74, 0x72, 0x4e, 0x6f, 0x9d, 0xe9, 0x1f, 0xe8, 0xb1, 0x97, 0xde, 0x7b, 0xe8, 0xa1, + 0xa7, 0x4e, 0x6e, 0xcd, 0x2d, 0x8d, 0x73, 0xe9, 0xa5, 0x93, 0x4c, 0x7f, 0x41, 0x67, 0xdf, 0xee, + 0xe2, 0x8b, 0x90, 0x44, 0x39, 0xf1, 0x21, 0x37, 0x62, 0xdf, 0xc7, 0xbe, 0x7d, 0xfb, 0xf6, 0x7d, + 0x12, 0xd6, 0x03, 0xd2, 0xee, 0xb8, 0x9e, 0xd1, 0x5a, 0xf1, 0x89, 0x77, 0x4c, 0xbc, 0x15, 0xa3, + 0x63, 0xaf, 0x74, 0x88, 0xe7, 0xdb, 0x7e, 0x40, 0x1c, 0x93, 0xac, 0x1c, 0xaf, 0xae, 0x90, 0xe7, + 0xc4, 0xec, 0x06, 0xb6, 0xeb, 0xf8, 0xb5, 0x8e, 0xe7, 0x06, 0xae, 0x5a, 0x15, 0x44, 0x35, 0x46, + 0x54, 0x33, 0x3a, 0x76, 0x2d, 0x46, 0x54, 0x3b, 0x5e, 0x9d, 0xaf, 0x1c, 0xb8, 0xee, 0x41, 0x8b, + 0xac, 0x20, 0xc5, 0x5e, 0x77, 0x7f, 0xc5, 0xea, 0x7a, 0x06, 0x65, 0xc2, 0x78, 0xcc, 0x2f, 0xa6, + 0xe1, 0x81, 0xdd, 0x26, 0x7e, 0x60, 0xb4, 0x3b, 0x1c, 0xe1, 0x8a, 0x45, 0x3a, 0xc4, 0xb1, 0x88, + 0x63, 0xda, 0xc4, 0x5f, 0x39, 0x70, 0x0f, 0x5c, 0x5c, 0xc7, 0x5f, 0x1c, 0xe5, 0x6a, 0x28, 0x3c, + 0x95, 0xda, 0x74, 0xdb, 0x6d, 0xd7, 0xa1, 0x02, 0xb7, 0x89, 0xef, 0x1b, 0x07, 0x24, 0x13, 0x8b, + 0x38, 0xdd, 0xb6, 0x4f, 0x91, 0x4e, 0x5c, 0xef, 0x68, 0xbf, 0xe5, 0x9e, 0x70, 0xac, 0x6b, 0x09, + 0xac, 0x7d, 0xc3, 0x6e, 0x75, 0x3d, 0xd2, 0xcf, 0xec, 0x8d, 0x04, 0x9a, 0xe0, 0xd1, 0x8f, 0xf7, + 0x56, 0x96, 0x5e, 0xcd, 0x96, 0x6b, 0x1e, 0xf5, 0xe3, 0x5e, 0xcf, 0xc2, 0x0d, 0xe5, 0x64, 0xc7, + 0xe2, 0xa8, 0x6f, 0x9f, 0x89, 0x9a, 0x3a, 0xd2, 0x9b, 0x67, 0x22, 0x07, 0x86, 0x7f, 0xc4, 0x11, + 0xdf, 0x1d, 0x88, 0x6b, 0x93, 0x52, 0x34, 0x83, 0x5e, 0x47, 0xc8, 0x7d, 0x23, 0x8b, 0xec, 0xd0, + 0xf6, 0x03, 0xd7, 0xeb, 0xf5, 0x9f, 0x72, 0x65, 0x00, 0x4b, 0x7b, 0xd6, 0x25, 0x5d, 0xc2, 0xad, + 0x6c, 0xfe, 0x66, 0x16, 0xc1, 0xa9, 0x1a, 0xaf, 0x7e, 0x97, 0x87, 0xc2, 0xce, 0xa1, 0xe1, 0x59, + 0x75, 0x67, 0xdf, 0x55, 0xe7, 0x40, 0xf6, 0xe9, 0x47, 0xd3, 0xb6, 0xb4, 0xdc, 0x52, 0x6e, 0x79, + 0x44, 0xcf, 0xe3, 0x77, 0xdd, 0xa2, 0x20, 0xcf, 0x70, 0x0e, 0x08, 0x05, 0x5d, 0x5a, 0xca, 0x2d, + 0x0f, 0xeb, 0x79, 0xfc, 0xae, 0x5b, 0xea, 0x14, 0x8c, 0xb8, 0x27, 0x0e, 0xf1, 0xb4, 0xe1, 0xa5, + 0xdc, 0x72, 0x41, 0x67, 0x1f, 0xea, 0x0d, 0x50, 0xfd, 0xc0, 0x6d, 0x11, 0xa7, 0xe9, 0xdb, 0x8e, + 0x49, 0x9a, 0x1e, 0x71, 0xc8, 0x89, 0x36, 0x8a, 0x5c, 0x15, 0x06, 0xd9, 0xa1, 0x00, 0x9d, 0xae, + 0xab, 0x1b, 0x50, 0xec, 0x76, 0x2c, 0x23, 0x20, 0x4d, 0x6a, 0xd1, 0x5a, 0x7e, 0x29, 0xb7, 0x5c, + 0x5c, 0x9b, 0xaf, 0x31, 0x73, 0xaf, 0x09, 0x73, 0xaf, 0xed, 0x0a, 0x73, 0xdf, 0x94, 0xbe, 0xff, + 0x69, 0x31, 0xa7, 0x03, 0x23, 0xa2, 0xcb, 0xea, 0xdf, 0xe7, 0x60, 0xce, 0x23, 0x9d, 0x96, 0x6d, + 0xe2, 0x8b, 0x69, 0x5a, 0xad, 0x67, 0x4d, 0xc3, 0x3c, 0x6a, 0xb6, 0xc8, 0x31, 0x69, 0x69, 0x63, + 0x4b, 0xc3, 0xcb, 0xc5, 0xb5, 0x7a, 0xed, 0xfc, 0x47, 0x58, 0x0b, 0xf5, 0x51, 0xd3, 0x23, 0x76, + 0x77, 0x5b, 0xcf, 0x36, 0xcc, 0xa3, 0x87, 0x94, 0xd7, 0xb6, 0x13, 0x78, 0x3d, 0x7d, 0xc6, 0xcb, + 0x04, 0xaa, 0x47, 0xa0, 0xe0, 0x85, 0x44, 0x7b, 0xfb, 0x9a, 0x82, 0x9b, 0x6f, 0x5c, 0x6c, 0xf3, + 0x4f, 0x29, 0x17, 0xc1, 0xd6, 0x67, 0x9b, 0x96, 0x9f, 0x25, 0x16, 0x55, 0x03, 0x4a, 0x6c, 0x33, + 0x3f, 0x30, 0x02, 0xe2, 0x6b, 0x13, 0xb8, 0xd1, 0x47, 0x2f, 0xb1, 0xd1, 0x0e, 0x32, 0x60, 0xbb, + 0x14, 0x9f, 0x45, 0x2b, 0xf3, 0x75, 0x78, 0xed, 0x0c, 0x35, 0xa8, 0x0a, 0x0c, 0x1f, 0x91, 0x1e, + 0x5a, 0x4b, 0x41, 0xa7, 0x3f, 0xa9, 0x39, 0x1c, 0x1b, 0xad, 0x2e, 0xe1, 0x66, 0xc2, 0x3e, 0x3e, + 0xb8, 0xf4, 0x5e, 0x6e, 0x3e, 0x80, 0xc9, 0x8c, 0x43, 0xc5, 0x59, 0x8c, 0x30, 0x16, 0xf7, 0xe3, + 0x2c, 0x8a, 0x6b, 0xab, 0x83, 0x9c, 0x27, 0xc1, 0x39, 0xbe, 0xab, 0x03, 0x4a, 0xfa, 0x84, 0x19, + 0x5b, 0xde, 0x4d, 0x6e, 0x59, 0x1b, 0x78, 0x4b, 0x64, 0x1b, 0xdb, 0xaf, 0x21, 0xc9, 0x92, 0x32, + 0xd2, 0x90, 0xe4, 0x11, 0x65, 0xb4, 0x21, 0xc9, 0xb2, 0x52, 0x68, 0x48, 0x72, 0x41, 0x81, 0x86, + 0x24, 0x83, 0x52, 0x6c, 0x48, 0x72, 0x51, 0x29, 0x35, 0x24, 0xb9, 0xa4, 0x8c, 0x35, 0x24, 0xb9, + 0xac, 0x8c, 0x37, 0x24, 0x79, 0x5c, 0x51, 0xaa, 0xff, 0x74, 0x15, 0xa6, 0x9f, 0xf2, 0x67, 0xba, + 0x2d, 0x42, 0x07, 0x3e, 0xca, 0x2b, 0x50, 0x72, 0x8c, 0x36, 0xf1, 0x3b, 0x86, 0x49, 0xc4, 0xc3, + 0x2c, 0xe8, 0xc5, 0x70, 0xad, 0x6e, 0xa9, 0x8b, 0x50, 0x0c, 0xfd, 0x0d, 0x7f, 0x9f, 0x05, 0x1d, + 0xc4, 0x52, 0xdd, 0x52, 0x6b, 0x30, 0xd9, 0x31, 0x3c, 0xe2, 0x04, 0xcd, 0x04, 0x2b, 0xf6, 0x60, + 0x27, 0x18, 0xe8, 0x51, 0x8c, 0xe1, 0x0d, 0x50, 0x39, 0x7e, 0x9c, 0xaf, 0x84, 0xe8, 0x0a, 0x83, + 0x3c, 0x8d, 0xb8, 0x57, 0x61, 0x8c, 0x63, 0x7b, 0x5d, 0x87, 0x22, 0x8e, 0x30, 0x11, 0xd9, 0xa2, + 0xde, 0x75, 0x12, 0x12, 0xd8, 0x8e, 0x1d, 0xd8, 0x46, 0x40, 0xd0, 0xcb, 0x8c, 0xa2, 0x8d, 0x70, + 0x09, 0xea, 0x02, 0x52, 0xb7, 0xd4, 0xf7, 0x61, 0xce, 0x74, 0xdb, 0x9d, 0x16, 0xc1, 0xb7, 0x4c, + 0x8e, 0x29, 0xe5, 0x9e, 0x11, 0x98, 0x87, 0x94, 0x2a, 0x8f, 0x54, 0x33, 0x11, 0xc2, 0x36, 0x85, + 0x6f, 0x52, 0x70, 0xdd, 0x52, 0x2f, 0x03, 0xa0, 0xd3, 0x45, 0x2b, 0xd6, 0x0a, 0x28, 0x4b, 0x81, + 0xae, 0xe0, 0x7d, 0xd1, 0xb3, 0x45, 0xce, 0xb9, 0xd7, 0x21, 0xa8, 0x12, 0x0d, 0xd8, 0xd9, 0x04, + 0x64, 0xb7, 0xd7, 0x21, 0x54, 0x21, 0xea, 0xd7, 0x30, 0x1f, 0x62, 0x87, 0x21, 0x1d, 0x9d, 0x94, + 0xdb, 0x0d, 0xb4, 0x22, 0x1a, 0xcb, 0x5c, 0x9f, 0x9f, 0xba, 0xcb, 0xc3, 0xf6, 0xa6, 0xf4, 0x8f, + 0xd4, 0x4d, 0x69, 0x27, 0xe9, 0x9b, 0xdd, 0x65, 0x0c, 0xd4, 0x4f, 0x61, 0x2a, 0x64, 0x4f, 0x95, + 0x27, 0x18, 0x97, 0x06, 0x63, 0x1c, 0x9e, 0x44, 0xef, 0x86, 0x2c, 0xf7, 0xe0, 0xb2, 0x45, 0xf6, + 0x8d, 0x6e, 0x2b, 0x76, 0x79, 0x2c, 0x08, 0x71, 0xde, 0x63, 0x83, 0xf1, 0x9e, 0xe7, 0x5c, 0xc4, + 0x45, 0xef, 0x1a, 0xfe, 0x91, 0xd8, 0xe3, 0x6d, 0x50, 0x5b, 0x86, 0x1f, 0xf0, 0x7b, 0x41, 0xee, + 0xb6, 0xa5, 0x4d, 0xe0, 0xb5, 0x8c, 0x53, 0x08, 0x5e, 0x08, 0xa5, 0xa8, 0x5b, 0xea, 0x4d, 0x98, + 0x44, 0xe4, 0x7d, 0xdb, 0x0b, 0x49, 0x6c, 0x4b, 0x53, 0x11, 0x5b, 0xa1, 0xa0, 0x7b, 0x14, 0x82, + 0x24, 0x75, 0x4b, 0xfd, 0x18, 0x5e, 0x47, 0xf4, 0xa4, 0xf0, 0x7e, 0x60, 0x78, 0xd4, 0x66, 0x42, + 0xf2, 0x49, 0x24, 0xaf, 0x50, 0xd4, 0xb8, 0x84, 0x3b, 0x0c, 0x4f, 0x30, 0xbb, 0x03, 0x80, 0x94, + 0x2c, 0xac, 0x4c, 0x0d, 0x18, 0x56, 0x0a, 0x48, 0x83, 0x51, 0xa5, 0x01, 0x28, 0x61, 0x33, 0x1e, + 0x9d, 0xa6, 0x07, 0x64, 0x53, 0xa6, 0x94, 0x9f, 0x45, 0x11, 0x6a, 0x0d, 0xa6, 0x93, 0x87, 0x3a, + 0xa6, 0xfe, 0xc4, 0x75, 0xb4, 0x19, 0x3c, 0xcb, 0xe4, 0x49, 0xec, 0x1c, 0x9f, 0x33, 0x90, 0x7a, + 0x0f, 0x96, 0x52, 0x8a, 0x30, 0x0f, 0x89, 0xd5, 0x6d, 0xc5, 0x55, 0x31, 0x8b, 0xe4, 0x0b, 0x71, + 0xf2, 0x1d, 0x81, 0x25, 0x14, 0xb1, 0x09, 0x95, 0x73, 0x14, 0xaa, 0x21, 0x97, 0xf9, 0x93, 0xd3, + 0x95, 0xb9, 0x93, 0x96, 0x5f, 0x58, 0xd4, 0xdc, 0x60, 0x16, 0x95, 0x38, 0xa0, 0x30, 0xa5, 0x3e, + 0xa5, 0x18, 0x01, 0x75, 0xbd, 0x81, 0x36, 0x8f, 0xce, 0x39, 0x41, 0xb3, 0xc1, 0x40, 0x89, 0x47, + 0x99, 0x38, 0x0c, 0x5e, 0xcf, 0x6b, 0x03, 0x5e, 0xcf, 0x6c, 0xc6, 0x51, 0xf1, 0x9e, 0x0c, 0x58, + 0x38, 0x4d, 0xe7, 0xb8, 0xc1, 0xc2, 0x80, 0x1b, 0xcc, 0x65, 0xde, 0x08, 0x6e, 0xe1, 0xc1, 0xb5, + 0xe4, 0x16, 0xae, 0x67, 0x1f, 0xd8, 0x8e, 0xd1, 0x4a, 0xef, 0x55, 0x19, 0x70, 0xaf, 0x2b, 0xf1, + 0xbd, 0x1e, 0x73, 0x66, 0xc9, 0x3d, 0x6f, 0x83, 0x96, 0xdc, 0xd3, 0x23, 0xcf, 0xba, 0xc4, 0xc7, + 0xcb, 0x5f, 0x44, 0xf7, 0x37, 0x1d, 0x67, 0xa2, 0x33, 0x68, 0xdd, 0x52, 0xbf, 0x8a, 0x7b, 0x4c, + 0x91, 0xce, 0x6a, 0x77, 0x97, 0x72, 0xcb, 0xe5, 0x53, 0x02, 0x25, 0xa6, 0xc1, 0x34, 0x44, 0x26, + 0x9c, 0x47, 0xaf, 0x43, 0x62, 0x1e, 0x96, 0xaf, 0xa8, 0x8f, 0xd3, 0xaa, 0xf0, 0xbb, 0x07, 0x07, + 0x54, 0x2c, 0xd3, 0x75, 0x02, 0xdb, 0xa1, 0x99, 0x94, 0xdf, 0xa4, 0xb9, 0xe3, 0xf6, 0x52, 0x6e, + 0x59, 0xd6, 0x97, 0x12, 0x4a, 0x65, 0xa8, 0x5b, 0x1c, 0x73, 0xc3, 0x7f, 0x44, 0x4e, 0xfa, 0x9f, + 0x0c, 0xcf, 0xae, 0x9b, 0xbe, 0xfd, 0x0d, 0x69, 0xee, 0xf5, 0x68, 0xa2, 0x74, 0xaf, 0xff, 0xc9, + 0x3c, 0x60, 0x58, 0x3b, 0xf6, 0x37, 0x64, 0x93, 0xe2, 0xa8, 0xd7, 0x41, 0x31, 0x0d, 0xc7, 0x24, + 0x2d, 0xa1, 0x28, 0x62, 0x69, 0x97, 0x51, 0x86, 0x71, 0xb6, 0xae, 0x8b, 0x65, 0xf5, 0x2d, 0x98, + 0x48, 0xa2, 0x52, 0x9d, 0x2e, 0xa1, 0x4e, 0x93, 0xb8, 0x75, 0xc4, 0xf5, 0x03, 0xdb, 0x3c, 0xea, + 0x35, 0x63, 0x51, 0xea, 0x0a, 0xc3, 0x65, 0x80, 0xdd, 0x30, 0x56, 0x1d, 0xc0, 0x12, 0xc7, 0x15, + 0x66, 0xd1, 0x0c, 0xdc, 0x66, 0xe4, 0xd1, 0xe8, 0xe3, 0xab, 0x0e, 0xf6, 0xf8, 0x16, 0x18, 0x23, + 0x61, 0x12, 0xbb, 0xee, 0x8e, 0xf0, 0x71, 0xf4, 0x15, 0x6a, 0x90, 0x17, 0xef, 0xee, 0x75, 0x96, + 0xf8, 0xf3, 0x4f, 0xf5, 0x33, 0x98, 0xf1, 0x48, 0xe0, 0xf5, 0x78, 0xdc, 0x6e, 0x35, 0x6d, 0x27, + 0x20, 0xde, 0xb1, 0xd1, 0xd2, 0xae, 0x0e, 0xb6, 0xf1, 0x14, 0x92, 0xb3, 0xd8, 0xde, 0xaa, 0x73, + 0xe2, 0x88, 0x6d, 0xdb, 0x78, 0x6e, 0xb7, 0xbb, 0xed, 0x88, 0xed, 0xb5, 0x8b, 0xb0, 0xfd, 0x84, + 0x51, 0x87, 0x6c, 0x6f, 0xa5, 0xd9, 0xf2, 0x63, 0xf8, 0xda, 0x1b, 0x78, 0xac, 0x04, 0x15, 0x77, + 0x27, 0xbe, 0xfa, 0x01, 0xad, 0x1c, 0x28, 0xd5, 0x9e, 0x61, 0x1e, 0xb9, 0xfb, 0xfb, 0x4d, 0xd3, + 0x25, 0xfb, 0xfb, 0xb6, 0x69, 0x13, 0x27, 0xd0, 0xde, 0x5c, 0xca, 0x2d, 0xe7, 0xf4, 0x59, 0x44, + 0xd8, 0x64, 0xf0, 0xad, 0x08, 0xac, 0xb6, 0xa1, 0x9a, 0x91, 0x20, 0x90, 0xe7, 0x1d, 0x9b, 0x89, + 0xcb, 0x9e, 0xf1, 0xf2, 0x80, 0xcf, 0x78, 0xb1, 0x2f, 0x53, 0xd8, 0x0e, 0x39, 0xe1, 0x23, 0xbe, + 0x0b, 0x8b, 0x4c, 0x54, 0xc7, 0x75, 0x9a, 0xf8, 0xcb, 0xd8, 0x6b, 0x91, 0x26, 0xf1, 0x3c, 0xd7, + 0xc3, 0x77, 0xe9, 0x6b, 0xd7, 0x97, 0x86, 0x97, 0x0b, 0xfa, 0x6b, 0x08, 0x7c, 0xe4, 0x3a, 0xba, + 0x40, 0xda, 0xa6, 0x38, 0xf4, 0xc9, 0xf9, 0xea, 0x32, 0x28, 0x87, 0x86, 0xcf, 0xe8, 0x9b, 0x1d, + 0xb7, 0x65, 0x9b, 0x3d, 0xed, 0x2d, 0x34, 0xed, 0xf2, 0xa1, 0xe1, 0x23, 0xc5, 0x13, 0x5c, 0x55, + 0x5f, 0x87, 0x31, 0xd3, 0x73, 0x9d, 0xd0, 0xfe, 0xb4, 0xb7, 0xd1, 0x52, 0x4b, 0x74, 0x51, 0xd8, + 0x12, 0x4d, 0x51, 0x7d, 0xfb, 0x80, 0x7a, 0x2f, 0xd3, 0xed, 0x3a, 0x81, 0x56, 0xc3, 0xd7, 0x55, + 0x64, 0x6b, 0x5b, 0x74, 0x49, 0xbd, 0x06, 0x65, 0xc3, 0x0c, 0xec, 0x63, 0x3b, 0xe8, 0x71, 0xa4, + 0xfb, 0x88, 0x34, 0x26, 0x56, 0x19, 0xda, 0x1a, 0x4c, 0x9b, 0x87, 0x76, 0xcb, 0x8a, 0xa9, 0x92, + 0x61, 0x3f, 0x60, 0x21, 0x12, 0x81, 0xa1, 0x6e, 0x18, 0xcd, 0x32, 0x28, 0x5d, 0x9f, 0x78, 0xa8, + 0x68, 0x8f, 0xa3, 0xd7, 0x11, 0xbd, 0x4c, 0xd7, 0xa9, 0xda, 0x3c, 0x86, 0xb9, 0x01, 0x97, 0xc5, + 0xfb, 0xe4, 0xcf, 0x95, 0x3c, 0x0f, 0x88, 0x17, 0x09, 0xde, 0x60, 0x31, 0x90, 0x23, 0x6d, 0x21, + 0xce, 0x36, 0x47, 0x09, 0x05, 0xe4, 0x47, 0x4d, 0x91, 0x7e, 0xcc, 0x04, 0x64, 0xc0, 0x24, 0xcd, + 0xa7, 0x30, 0x61, 0x74, 0x03, 0xb7, 0xe9, 0x11, 0x9f, 0x04, 0xcd, 0x8e, 0x6b, 0x3b, 0x81, 0xaf, + 0xad, 0xa3, 0x45, 0x5c, 0x8b, 0xdc, 0x27, 0xf5, 0x9b, 0x61, 0x2f, 0xe2, 0x78, 0xb5, 0xa6, 0x53, + 0xec, 0x27, 0x88, 0xac, 0x8f, 0x53, 0xfa, 0xd8, 0x82, 0xfa, 0x77, 0x30, 0xe1, 0x13, 0xc3, 0x33, + 0x0f, 0xa9, 0x81, 0x7b, 0xf6, 0x5e, 0x97, 0x3a, 0xb5, 0x5b, 0x58, 0xfd, 0x3d, 0x1e, 0xa4, 0x74, + 0xc9, 0x2c, 0x35, 0x6a, 0x3b, 0xc8, 0x72, 0x23, 0xe4, 0xc8, 0xca, 0x41, 0xc5, 0x4f, 0x2d, 0xab, + 0x4f, 0x41, 0x6a, 0x93, 0xb6, 0xab, 0xbd, 0x8b, 0x1b, 0x6e, 0xbd, 0xfc, 0x86, 0x9f, 0x90, 0xb6, + 0xcb, 0x36, 0x41, 0x86, 0xea, 0xd7, 0x30, 0xc1, 0x73, 0x22, 0xee, 0xb4, 0x6d, 0xe2, 0x6b, 0x7f, + 0x81, 0x9a, 0x7a, 0x27, 0x73, 0x17, 0xee, 0xda, 0xe9, 0x0e, 0x3c, 0x63, 0x7a, 0x20, 0xe8, 0x74, + 0xe5, 0x38, 0xb5, 0xa2, 0xae, 0xc3, 0x0c, 0x4f, 0x42, 0x43, 0xeb, 0xe2, 0x15, 0xcb, 0x6d, 0xb4, + 0xea, 0x49, 0x84, 0x86, 0x22, 0xb2, 0xca, 0xe5, 0x6f, 0x60, 0x3c, 0x42, 0xa7, 0x75, 0xb6, 0xaf, + 0xbd, 0x87, 0x12, 0xad, 0x0d, 0x72, 0xee, 0x90, 0x19, 0xad, 0x13, 0x7d, 0xbd, 0x4c, 0x12, 0xdf, + 0x89, 0x54, 0x83, 0x8a, 0x92, 0xf6, 0x1b, 0xef, 0x5f, 0x34, 0xd5, 0xd0, 0xbb, 0x69, 0x8f, 0x71, + 0x0b, 0x66, 0xfb, 0xd2, 0xef, 0xe0, 0x39, 0x9e, 0xfa, 0x03, 0x66, 0xb3, 0xc9, 0x14, 0x7c, 0xf7, + 0x39, 0x3d, 0xf5, 0x2d, 0x98, 0xc1, 0x9e, 0x42, 0x33, 0xf0, 0x0c, 0xc7, 0xb7, 0x63, 0x2f, 0xf1, + 0x43, 0x24, 0x9a, 0x42, 0xe8, 0x6e, 0x08, 0x64, 0x96, 0x7e, 0x1f, 0xca, 0xc9, 0x22, 0x49, 0xfb, + 0xcb, 0x01, 0x0f, 0x30, 0x46, 0xe2, 0xa5, 0x91, 0xba, 0x02, 0x53, 0x0e, 0x39, 0xe9, 0xbf, 0xa7, + 0xbf, 0x62, 0x15, 0xab, 0x43, 0x4e, 0x52, 0xb7, 0xf4, 0x10, 0x4a, 0xbc, 0xbe, 0xc4, 0x7e, 0xa1, + 0xf6, 0x11, 0xee, 0x7b, 0x3d, 0xf3, 0x8a, 0x10, 0x83, 0x99, 0x8c, 0x19, 0xb8, 0xde, 0x16, 0xfd, + 0x14, 0xd5, 0x2a, 0x7e, 0xa8, 0xef, 0x81, 0xd6, 0x57, 0xad, 0x8a, 0x64, 0xfd, 0x0e, 0x2b, 0x3e, + 0x53, 0x25, 0xab, 0xc8, 0xd7, 0xd7, 0x61, 0xc6, 0x6c, 0xb9, 0x3e, 0xd7, 0xdb, 0x3e, 0x75, 0x4b, + 0xbc, 0x3a, 0xfa, 0x6b, 0xee, 0xc1, 0x28, 0x74, 0x97, 0x03, 0x79, 0x85, 0x74, 0x1b, 0x34, 0x46, + 0x74, 0x6c, 0xfb, 0xf6, 0x9e, 0xdd, 0xa2, 0x4e, 0x52, 0x90, 0x6d, 0x20, 0xd9, 0x34, 0xc2, 0x3f, + 0x0f, 0xc1, 0x9c, 0xf0, 0x0e, 0x00, 0xdf, 0x8d, 0xea, 0x7a, 0x73, 0xd0, 0xf2, 0x86, 0xc9, 0x40, + 0xf5, 0xbc, 0x0d, 0x8b, 0xd9, 0x3b, 0xf3, 0xda, 0x9a, 0x58, 0xda, 0x16, 0xc6, 0x85, 0x85, 0x0c, + 0x01, 0xb6, 0x04, 0x8e, 0xba, 0x07, 0x93, 0x7b, 0x86, 0x4f, 0x62, 0xf7, 0x65, 0x3b, 0xfb, 0xae, + 0xf6, 0xf0, 0x8c, 0x77, 0x12, 0x77, 0x75, 0x9b, 0x86, 0x4f, 0x12, 0x8e, 0x41, 0x9f, 0xd8, 0x4b, + 0x2f, 0xcd, 0x5b, 0x30, 0x9d, 0xe9, 0x9f, 0x32, 0x5a, 0x50, 0xef, 0x26, 0x9b, 0x39, 0x8b, 0x49, + 0x27, 0xcb, 0x7b, 0xc3, 0xc7, 0xab, 0xb5, 0x27, 0x46, 0xaf, 0xe5, 0x1a, 0x56, 0xbc, 0x5b, 0xf4, + 0x05, 0x14, 0x42, 0xa7, 0xf4, 0x87, 0x72, 0x0e, 0x7b, 0x41, 0x61, 0xcf, 0xa7, 0x21, 0xc9, 0x8a, + 0x32, 0xd1, 0x90, 0xe4, 0x1b, 0xca, 0xcd, 0x86, 0x24, 0xdf, 0x54, 0x6a, 0x0d, 0x49, 0x5e, 0x51, + 0xde, 0x69, 0x48, 0xf2, 0x3b, 0xca, 0x6a, 0x43, 0x92, 0x57, 0x95, 0xb5, 0x86, 0x24, 0xaf, 0x29, + 0xeb, 0xd5, 0x75, 0x28, 0x27, 0x1d, 0x09, 0x0d, 0xb9, 0xf1, 0xb4, 0x16, 0x65, 0x1c, 0xd6, 0x8b, + 0x87, 0x51, 0x12, 0x5b, 0xfd, 0x35, 0x07, 0x33, 0x7d, 0x6e, 0x17, 0xdb, 0x55, 0x98, 0xaf, 0x7a, + 0x84, 0x3e, 0xef, 0x58, 0xbe, 0x9a, 0xe3, 0xf9, 0x2a, 0x02, 0xa2, 0x7c, 0x75, 0x1a, 0x46, 0xf9, + 0xe3, 0x63, 0x7d, 0xa5, 0x11, 0x0f, 0x1f, 0x5c, 0x03, 0x46, 0xd0, 0x05, 0x60, 0x13, 0xa9, 0xbc, + 0x76, 0x6b, 0xb0, 0x3a, 0x20, 0x29, 0x87, 0xce, 0x58, 0xa8, 0xf7, 0x60, 0x94, 0xfe, 0xe8, 0xfa, + 0xd8, 0x62, 0x4a, 0x14, 0x15, 0xe7, 0x73, 0xe9, 0xfa, 0x3a, 0xa7, 0xae, 0xfe, 0xdf, 0x28, 0x28, + 0x89, 0xa7, 0xf5, 0x47, 0xf5, 0xcf, 0x22, 0x1d, 0x0c, 0xc7, 0x75, 0xb0, 0x05, 0x85, 0xa8, 0x1e, + 0x62, 0xa2, 0xbf, 0x71, 0xb6, 0x1e, 0xc2, 0x3a, 0x48, 0x0e, 0x44, 0xfd, 0x53, 0x83, 0xc9, 0xc0, + 0xf0, 0x0e, 0x48, 0xaa, 0x37, 0xc7, 0x7a, 0x68, 0x13, 0x0c, 0x94, 0xea, 0xcd, 0x71, 0xfc, 0xb8, + 0xcc, 0xa3, 0xac, 0x7f, 0xc5, 0x20, 0xc9, 0xde, 0x1c, 0xc7, 0xe6, 0x07, 0xc8, 0xb3, 0xe3, 0xb3, + 0x45, 0xe6, 0x3b, 0x93, 0x0d, 0x33, 0x39, 0xdd, 0x30, 0xfb, 0x10, 0xe6, 0x39, 0x0b, 0x96, 0x9a, + 0x85, 0xdb, 0xba, 0x4e, 0xab, 0x87, 0xfd, 0x35, 0x59, 0x9f, 0x65, 0x18, 0x5b, 0x14, 0x41, 0xec, + 0xfe, 0xd8, 0x69, 0xf5, 0x70, 0x0c, 0xd0, 0xdf, 0xb1, 0x00, 0xd6, 0xfb, 0xf1, 0xd3, 0x5d, 0x0a, + 0x0d, 0xf2, 0xc2, 0xcd, 0x16, 0xd9, 0x90, 0x81, 0x7f, 0xaa, 0xb3, 0x90, 0x17, 0x1e, 0xb1, 0x84, + 0x90, 0xd1, 0x80, 0xb9, 0xc0, 0x3a, 0x8c, 0xc7, 0x7d, 0x17, 0xf5, 0x83, 0x63, 0x83, 0xf6, 0x67, + 0x22, 0x42, 0x74, 0x86, 0x37, 0x40, 0xb5, 0x08, 0x75, 0x68, 0x4d, 0x63, 0x3f, 0xa0, 0xa9, 0x24, + 0x75, 0x79, 0xda, 0x38, 0x1e, 0x50, 0x61, 0x90, 0x0d, 0x0a, 0xd8, 0xa2, 0xeb, 0xea, 0x3f, 0xe4, + 0x80, 0x39, 0xc5, 0x78, 0x5f, 0x90, 0x8a, 0x68, 0x91, 0xc0, 0xb0, 0xb1, 0xeb, 0x4f, 0xc5, 0x78, + 0x34, 0x48, 0x96, 0x90, 0x36, 0xda, 0x1a, 0x6e, 0x11, 0x75, 0x0b, 0x0d, 0xff, 0xe8, 0x2e, 0xe3, + 0xfa, 0x60, 0x48, 0x9f, 0x33, 0x4f, 0x03, 0xce, 0x7f, 0x05, 0x73, 0xa7, 0x52, 0xaa, 0x77, 0x60, + 0xc1, 0x34, 0x9c, 0xa6, 0x7f, 0x64, 0x77, 0xe2, 0xee, 0x9e, 0xba, 0x54, 0x9b, 0x16, 0x5e, 0x39, + 0x3c, 0xe8, 0x9c, 0x69, 0x38, 0x3b, 0x47, 0x76, 0x27, 0x72, 0xf5, 0x1b, 0x1c, 0x61, 0xb3, 0x0c, + 0xa5, 0xf8, 0x01, 0x99, 0x2f, 0xab, 0xfe, 0xab, 0x04, 0x93, 0xb1, 0x09, 0xc1, 0x9f, 0xe6, 0xdd, + 0xc5, 0x6c, 0x6d, 0x24, 0x69, 0x6b, 0x57, 0xa1, 0x9c, 0xea, 0x55, 0xb2, 0x36, 0x75, 0x69, 0x3f, + 0xde, 0xa7, 0xac, 0xc2, 0x98, 0x43, 0x9e, 0xc7, 0x90, 0x58, 0x57, 0xba, 0x48, 0x17, 0x05, 0x4e, + 0xb6, 0xf5, 0xcb, 0xa7, 0x58, 0xff, 0x15, 0x28, 0xed, 0x79, 0x86, 0x63, 0x1e, 0x36, 0x03, 0xf7, + 0x88, 0xb0, 0x27, 0x50, 0xd2, 0x8b, 0x6c, 0x6d, 0x97, 0x2e, 0x89, 0xbc, 0x88, 0x2a, 0x25, 0x81, + 0x3a, 0x86, 0xa8, 0x34, 0x2f, 0xd2, 0xbb, 0xce, 0x66, 0x8c, 0x20, 0xf6, 0x6e, 0xc6, 0xcf, 0x7b, + 0x37, 0xca, 0x4b, 0xbe, 0x9b, 0x05, 0x00, 0x21, 0x14, 0xef, 0x02, 0x17, 0x74, 0x99, 0x89, 0x52, + 0xb7, 0x52, 0xd3, 0x8f, 0x70, 0xee, 0x51, 0xfd, 0xdf, 0x61, 0x50, 0x53, 0x09, 0xcd, 0x9f, 0xdb, + 0x6c, 0x62, 0xaa, 0x1e, 0x3d, 0x4f, 0xd5, 0xf9, 0x97, 0x54, 0x75, 0x32, 0xe1, 0x93, 0x2f, 0x9e, + 0xf0, 0x25, 0x1b, 0xe2, 0x85, 0x8b, 0x37, 0xc4, 0xcf, 0xca, 0x55, 0xe1, 0x8c, 0x5c, 0xb5, 0xfa, + 0xab, 0x04, 0x63, 0x58, 0x8b, 0xff, 0x69, 0xae, 0x7a, 0x1b, 0x4a, 0xbc, 0xc9, 0xc6, 0xf8, 0x8c, + 0x20, 0x9f, 0xea, 0x29, 0xc9, 0x09, 0x6f, 0xa5, 0x21, 0x8f, 0x62, 0x10, 0x7d, 0xa8, 0x24, 0xd6, + 0xe1, 0x16, 0x0d, 0x26, 0xe4, 0x37, 0x8a, 0xfc, 0x56, 0x07, 0xcb, 0x9c, 0x78, 0xeb, 0x09, 0xd9, + 0x87, 0x4d, 0xf1, 0xd8, 0x62, 0xdc, 0x30, 0xf3, 0x49, 0xc3, 0xbc, 0x0e, 0xa1, 0xaf, 0x09, 0xbb, + 0xeb, 0x32, 0xb6, 0xc3, 0xc6, 0xc5, 0xba, 0xe8, 0xac, 0xcf, 0x81, 0x1c, 0xba, 0xa9, 0x02, 0xe3, + 0x42, 0xb8, 0x77, 0x8a, 0x99, 0x37, 0x9c, 0x67, 0xde, 0xc5, 0x97, 0x34, 0xef, 0xb4, 0x07, 0x2c, + 0xf5, 0x7b, 0xc0, 0xeb, 0xa0, 0x18, 0x2d, 0x8f, 0x18, 0x96, 0x88, 0x5c, 0xc4, 0x42, 0xef, 0x27, + 0xeb, 0xe3, 0x7c, 0x7d, 0x83, 0x2f, 0x57, 0xff, 0xe5, 0x12, 0x28, 0x22, 0x78, 0x85, 0x46, 0x17, + 0x3b, 0x46, 0x2e, 0x71, 0x8c, 0xb4, 0x35, 0x5e, 0x3a, 0xd7, 0x1a, 0x87, 0xcf, 0xb0, 0x46, 0xe9, + 0x54, 0x6b, 0x1c, 0xf9, 0xfd, 0x8e, 0x67, 0x34, 0x79, 0xbf, 0x7f, 0x9c, 0x7f, 0xa9, 0x7e, 0x57, + 0x86, 0xd2, 0x06, 0xef, 0xc8, 0xa1, 0xba, 0x62, 0xbb, 0xe6, 0x92, 0xbb, 0xde, 0x06, 0x2d, 0x1d, + 0xdb, 0xc2, 0x01, 0x2d, 0x1b, 0xfd, 0x4f, 0x27, 0x23, 0x9c, 0x98, 0xcf, 0xde, 0x87, 0x72, 0x6a, + 0xc8, 0x21, 0x0d, 0xda, 0x24, 0xf0, 0x13, 0x03, 0x8d, 0x65, 0x50, 0xfa, 0xa6, 0x58, 0xcc, 0x27, + 0x97, 0xfd, 0xe4, 0xe4, 0x6a, 0x0b, 0x4a, 0x89, 0x11, 0xd1, 0xa0, 0xea, 0x29, 0xfa, 0xb1, 0xb1, + 0xd0, 0x22, 0x14, 0xc3, 0x16, 0x26, 0x8f, 0xe2, 0x05, 0x1d, 0xc4, 0x12, 0xcb, 0xa3, 0x63, 0xe5, + 0x14, 0x1f, 0x3c, 0x7b, 0x61, 0x21, 0xf5, 0x25, 0xcc, 0x9d, 0xde, 0xc5, 0x87, 0xc1, 0xba, 0xde, + 0x33, 0x7e, 0x76, 0xff, 0x3e, 0xc5, 0x3b, 0x8a, 0x11, 0x17, 0x98, 0x52, 0xc7, 0x78, 0x6f, 0x89, + 0x78, 0x41, 0x79, 0xef, 0x62, 0x2b, 0x88, 0xca, 0x9a, 0x66, 0x3c, 0xe0, 0x94, 0x7a, 0x92, 0x45, + 0x8f, 0x24, 0xd7, 0x87, 0x30, 0x71, 0x48, 0x0c, 0x2f, 0xd8, 0x23, 0x46, 0x70, 0xd1, 0xd1, 0xb4, + 0x12, 0x52, 0x0a, 0x6e, 0x59, 0xb3, 0x9a, 0xf2, 0x05, 0x66, 0x35, 0x2c, 0x37, 0xca, 0x9a, 0xd5, + 0xb0, 0xae, 0xb2, 0x98, 0x32, 0xd2, 0x1a, 0x55, 0x61, 0xae, 0x33, 0x10, 0xb1, 0x8c, 0x15, 0xa1, + 0xf1, 0x11, 0xca, 0x44, 0x72, 0x84, 0x92, 0xac, 0xaf, 0xd4, 0x74, 0x7d, 0x75, 0x3d, 0x32, 0x63, + 0xdb, 0x22, 0x4e, 0x60, 0x07, 0x3d, 0x9c, 0x6e, 0xe3, 0x3c, 0x08, 0xd7, 0xeb, 0x7c, 0x39, 0xb3, + 0x6f, 0x3f, 0x95, 0xd9, 0xb7, 0x3f, 0x7d, 0x6c, 0x33, 0xfd, 0x6a, 0xc6, 0x36, 0x33, 0xaf, 0x66, + 0x6c, 0x33, 0x7b, 0xc6, 0xd8, 0x66, 0x17, 0xa6, 0x19, 0x55, 0xba, 0x6b, 0xaa, 0x0d, 0xf8, 0xbc, + 0x27, 0x91, 0x3c, 0xd5, 0x2f, 0x3d, 0x73, 0x18, 0x34, 0x77, 0xf6, 0x30, 0x68, 0x80, 0xe9, 0xcc, + 0xfc, 0xf9, 0xd3, 0x99, 0x47, 0xa0, 0x32, 0x2e, 0xac, 0x6f, 0xcb, 0xfe, 0x55, 0xc9, 0xc7, 0xda, + 0x4b, 0xc9, 0xec, 0x83, 0x03, 0x69, 0xc8, 0xb8, 0xc7, 0x7e, 0xea, 0x0a, 0xd2, 0x3e, 0x34, 0xfc, + 0x80, 0xaf, 0xd0, 0x02, 0x3e, 0xc6, 0x8f, 0x86, 0x2b, 0xe2, 0x45, 0xa6, 0xb6, 0x80, 0xa6, 0x36, + 0x1b, 0x52, 0x3d, 0x45, 0x78, 0x68, 0x72, 0xd9, 0x25, 0x4c, 0xe5, 0x94, 0x12, 0xe6, 0x73, 0x98, + 0xc1, 0x4d, 0xa2, 0xa7, 0x2d, 0xaa, 0xe1, 0xc5, 0x2c, 0xf1, 0xfb, 0x1a, 0x66, 0xbe, 0x3e, 0x45, + 0xe9, 0x1f, 0x08, 0x72, 0x51, 0xbb, 0x7e, 0x0d, 0xf3, 0x29, 0xbe, 0xf1, 0x3f, 0x64, 0x2c, 0x0d, + 0x3a, 0xf1, 0x4f, 0xf0, 0x8e, 0xfe, 0x99, 0xd1, 0x90, 0xe4, 0x61, 0x45, 0x6a, 0x48, 0xf2, 0xa8, + 0x92, 0x6f, 0x48, 0xf2, 0x65, 0xa5, 0x52, 0xfd, 0xcf, 0x1c, 0x14, 0x30, 0x5b, 0x3d, 0x27, 0x0a, + 0x66, 0xc5, 0xa0, 0x4b, 0x99, 0x31, 0x68, 0x03, 0x8a, 0x68, 0xa7, 0x3c, 0x42, 0x0f, 0x0f, 0xfa, + 0x17, 0x47, 0x46, 0x24, 0x22, 0x50, 0xdc, 0x11, 0x49, 0xb8, 0x0f, 0xfa, 0x16, 0xee, 0x83, 0xe6, + 0x40, 0x66, 0xfe, 0x2a, 0x6c, 0x20, 0xe5, 0xf1, 0xbb, 0x6e, 0x55, 0xff, 0x4b, 0x02, 0x75, 0x2b, + 0x31, 0x3d, 0x3b, 0x3f, 0xbe, 0x47, 0xcd, 0xef, 0xec, 0xf8, 0x1e, 0xc2, 0x13, 0xf1, 0x3d, 0x4b, + 0x25, 0xc3, 0x99, 0x2a, 0xa9, 0xc1, 0xa4, 0xc0, 0x8c, 0xe7, 0x55, 0xbc, 0xf5, 0xc5, 0x41, 0xb1, + 0x66, 0xd6, 0x55, 0x10, 0x1c, 0x44, 0xb1, 0xc9, 0xda, 0x5e, 0x22, 0xb8, 0xb3, 0x76, 0x56, 0x66, + 0x73, 0x53, 0xce, 0x6e, 0x6e, 0x2e, 0x40, 0x21, 0x4c, 0xf0, 0x44, 0xc4, 0x0e, 0x17, 0x2e, 0xf8, + 0x57, 0xb1, 0x2f, 0xc2, 0xbf, 0xb8, 0xb1, 0x28, 0xc9, 0xfd, 0x73, 0x11, 0xf3, 0xbd, 0xe5, 0x53, + 0xaa, 0x86, 0x27, 0x62, 0xea, 0xe0, 0x13, 0xe6, 0xb9, 0xc5, 0x9f, 0xe1, 0x62, 0x4b, 0x54, 0x8e, + 0xf4, 0x55, 0x84, 0x7d, 0x30, 0x25, 0x79, 0x09, 0x38, 0x14, 0x18, 0x61, 0x33, 0x90, 0xb1, 0x8b, + 0xce, 0x40, 0x18, 0x5d, 0x5f, 0x26, 0x5c, 0xee, 0xcb, 0x84, 0xc3, 0x3f, 0x39, 0xe6, 0x15, 0xb9, + 0xfa, 0x6f, 0x39, 0x98, 0xd0, 0xe3, 0x13, 0xd3, 0x57, 0x65, 0x58, 0x99, 0x91, 0x7b, 0x38, 0xfb, + 0x5f, 0x16, 0xd9, 0x2a, 0x93, 0xb2, 0x55, 0x56, 0xfd, 0xf7, 0x1c, 0xc0, 0x0e, 0x4e, 0x6e, 0x5f, + 0x95, 0xec, 0xc9, 0xdc, 0x70, 0x38, 0x9d, 0x1b, 0x66, 0x8b, 0x9b, 0xcf, 0x16, 0x37, 0xf5, 0x17, + 0x53, 0xe6, 0xb4, 0x64, 0xa5, 0x50, 0xfd, 0x36, 0x07, 0xf2, 0xd6, 0x21, 0x31, 0x8f, 0xfc, 0x6e, + 0x3b, 0x7d, 0x88, 0x91, 0xe8, 0x10, 0x77, 0x61, 0x74, 0xbf, 0x65, 0x1c, 0xbb, 0x1e, 0x8a, 0x5c, + 0x5e, 0xbb, 0x71, 0x76, 0x2d, 0x22, 0x38, 0xde, 0x43, 0x1a, 0x9d, 0xd3, 0x46, 0xff, 0xf3, 0x1d, + 0xc6, 0x22, 0x8d, 0x7d, 0x54, 0x7f, 0xca, 0x01, 0x30, 0xc7, 0x8a, 0x9a, 0xb4, 0x40, 0x35, 0x4c, + 0x93, 0x74, 0x02, 0x7a, 0x3d, 0x6c, 0xf4, 0x4d, 0x3c, 0x94, 0xa7, 0xb8, 0xb6, 0x7e, 0xde, 0x44, + 0x97, 0xff, 0x23, 0x07, 0x4f, 0xfd, 0x84, 0x91, 0x3e, 0x18, 0xd2, 0x27, 0x22, 0x86, 0x7c, 0x51, + 0xdd, 0x83, 0x89, 0x70, 0x5e, 0x15, 0x6e, 0x72, 0xe9, 0xf7, 0x6c, 0xa2, 0x84, 0xfc, 0xf8, 0xda, + 0x66, 0x9e, 0x1f, 0x77, 0xf3, 0x6f, 0x7f, 0xf8, 0xb9, 0x32, 0xf4, 0xe3, 0xcf, 0x95, 0xa1, 0xdf, + 0x7e, 0xae, 0xe4, 0xbe, 0x7d, 0x51, 0xc9, 0xfd, 0xf3, 0x8b, 0x4a, 0xee, 0x3f, 0x5e, 0x54, 0x72, + 0x3f, 0xbc, 0xa8, 0xe4, 0xfe, 0xfb, 0x45, 0x25, 0xf7, 0x3f, 0x2f, 0x2a, 0x43, 0xbf, 0xbd, 0xa8, + 0xe4, 0xbe, 0xff, 0xa5, 0x32, 0xf4, 0xc3, 0x2f, 0x95, 0xa1, 0x1f, 0x7f, 0xa9, 0x0c, 0x7d, 0x79, + 0xeb, 0xc0, 0x8d, 0x24, 0xb1, 0xdd, 0xd3, 0xff, 0xce, 0xff, 0x61, 0xec, 0x73, 0x6f, 0x14, 0xc3, + 0xc2, 0xfa, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xc5, 0x7e, 0xfc, 0x71, 0x32, 0x00, 0x00, } func (this *ShardInfo) Equal(that interface{}) bool { @@ -3665,6 +3754,84 @@ func (this *Checksum) Equal(that interface{}) bool { } return true } +func (this *UpdateInfo) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UpdateInfo) + if !ok { + that2, ok := that.(UpdateInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if that1.Value == nil { + if this.Value != nil { + return false + } + } else if this.Value == nil { + return false + } else if !this.Value.Equal(that1.Value) { + return false + } + return true +} +func (this *UpdateInfo_AcceptancePointer) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UpdateInfo_AcceptancePointer) + if !ok { + that2, ok := that.(UpdateInfo_AcceptancePointer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.AcceptancePointer.Equal(that1.AcceptancePointer) { + return false + } + return true +} +func (this *UpdateInfo_CompletedPointer) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UpdateInfo_CompletedPointer) + if !ok { + that2, ok := that.(UpdateInfo_CompletedPointer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.CompletedPointer.Equal(that1.CompletedPointer) { + return false + } + return true +} func (this *ShardInfo) GoString() string { if this == nil { return "nil" @@ -4090,6 +4257,34 @@ func (this *Checksum) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *UpdateInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&persistence.UpdateInfo{") + if this.Value != nil { + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UpdateInfo_AcceptancePointer) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&persistence.UpdateInfo_AcceptancePointer{` + + `AcceptancePointer:` + fmt.Sprintf("%#v", this.AcceptancePointer) + `}`}, ", ") + return s +} +func (this *UpdateInfo_CompletedPointer) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&persistence.UpdateInfo_CompletedPointer{` + + `CompletedPointer:` + fmt.Sprintf("%#v", this.CompletedPointer) + `}`}, ", ") + return s +} func valueToGoStringExecutions(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -6107,6 +6302,80 @@ func (m *Checksum) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *UpdateInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UpdateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *UpdateInfo_AcceptancePointer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UpdateInfo_AcceptancePointer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AcceptancePointer != nil { + { + size, err := m.AcceptancePointer.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintExecutions(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *UpdateInfo_CompletedPointer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UpdateInfo_CompletedPointer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.CompletedPointer != nil { + { + size, err := m.CompletedPointer.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintExecutions(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} func encodeVarintExecutions(dAtA []byte, offset int, v uint64) int { offset -= sovExecutions(v) base := offset @@ -7007,6 +7276,43 @@ func (m *Checksum) Size() (n int) { return n } +func (m *UpdateInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *UpdateInfo_AcceptancePointer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AcceptancePointer != nil { + l = m.AcceptancePointer.Size() + n += 1 + l + sovExecutions(uint64(l)) + } + return n +} +func (m *UpdateInfo_CompletedPointer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CompletedPointer != nil { + l = m.CompletedPointer.Size() + n += 1 + l + sovExecutions(uint64(l)) + } + return n +} + func sovExecutions(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -7412,6 +7718,36 @@ func (this *Checksum) String() string { }, "") return s } +func (this *UpdateInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateInfo{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *UpdateInfo_AcceptancePointer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateInfo_AcceptancePointer{`, + `AcceptancePointer:` + strings.Replace(fmt.Sprintf("%v", this.AcceptancePointer), "HistoryEventPointer", "v13.HistoryEventPointer", 1) + `,`, + `}`, + }, "") + return s +} +func (this *UpdateInfo_CompletedPointer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateInfo_CompletedPointer{`, + `CompletedPointer:` + strings.Replace(fmt.Sprintf("%v", this.CompletedPointer), "HistoryEventPointer", "v13.HistoryEventPointer", 1) + `,`, + `}`, + }, "") + return s +} func valueToStringExecutions(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -13956,6 +14292,129 @@ func (m *Checksum) Unmarshal(dAtA []byte) error { } return nil } +func (m *UpdateInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowExecutions + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptancePointer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowExecutions + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthExecutions + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthExecutions + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &v13.HistoryEventPointer{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &UpdateInfo_AcceptancePointer{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedPointer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowExecutions + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthExecutions + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthExecutions + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &v13.HistoryEventPointer{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &UpdateInfo_CompletedPointer{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipExecutions(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthExecutions + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthExecutions + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipExecutions(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/api/persistence/v1/workflow_mutable_state.pb.go b/api/persistence/v1/workflow_mutable_state.pb.go index d3a7cf1adb2..243ffa1a024 100644 --- a/api/persistence/v1/workflow_mutable_state.pb.go +++ b/api/persistence/v1/workflow_mutable_state.pb.go @@ -63,6 +63,8 @@ type WorkflowMutableState struct { NextEventId int64 `protobuf:"varint,9,opt,name=next_event_id,json=nextEventId,proto3" json:"next_event_id,omitempty"` BufferedEvents []*v1.HistoryEvent `protobuf:"bytes,10,rep,name=buffered_events,json=bufferedEvents,proto3" json:"buffered_events,omitempty"` Checksum *Checksum `protobuf:"bytes,11,opt,name=checksum,proto3" json:"checksum,omitempty"` + // map key here is UpdateID + UpdateInfos map[string]*UpdateInfo `protobuf:"bytes,12,rep,name=update_infos,json=updateInfos,proto3" json:"update_infos,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (m *WorkflowMutableState) Reset() { *m = WorkflowMutableState{} } @@ -174,6 +176,13 @@ func (m *WorkflowMutableState) GetChecksum() *Checksum { return nil } +func (m *WorkflowMutableState) GetUpdateInfos() map[string]*UpdateInfo { + if m != nil { + return m.UpdateInfos + } + return nil +} + func init() { proto.RegisterType((*WorkflowMutableState)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState") proto.RegisterMapType((map[int64]*ActivityInfo)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState.ActivityInfosEntry") @@ -181,6 +190,7 @@ func init() { proto.RegisterMapType((map[int64]*RequestCancelInfo)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState.RequestCancelInfosEntry") proto.RegisterMapType((map[int64]*SignalInfo)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState.SignalInfosEntry") proto.RegisterMapType((map[string]*TimerInfo)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState.TimerInfosEntry") + proto.RegisterMapType((map[string]*UpdateInfo)(nil), "temporal.server.api.persistence.v1.WorkflowMutableState.UpdateInfosEntry") } func init() { @@ -188,50 +198,52 @@ func init() { } var fileDescriptor_0b5581c180807aa7 = []byte{ - // 677 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x95, 0x4f, 0x6f, 0xd3, 0x3e, - 0x18, 0xc7, 0xeb, 0xf5, 0xb7, 0xfd, 0x36, 0x77, 0xff, 0x64, 0x86, 0x88, 0x7a, 0xb0, 0xaa, 0x49, - 0x93, 0x7a, 0x80, 0x74, 0x7f, 0x00, 0xc1, 0x38, 0x20, 0x28, 0x43, 0xab, 0x06, 0x08, 0x32, 0x24, - 0x24, 0x2e, 0x21, 0x4b, 0x9e, 0x6e, 0x66, 0x69, 0x52, 0x6c, 0xb7, 0x5b, 0x25, 0x84, 0x10, 0x12, - 0x77, 0x5e, 0x06, 0x2f, 0x85, 0xe3, 0x8e, 0x3b, 0xb2, 0xec, 0xc2, 0x71, 0x37, 0xae, 0x28, 0x4e, - 0xda, 0xba, 0x6b, 0x27, 0x42, 0x6f, 0xf1, 0xe3, 0x3e, 0x9f, 0xcf, 0xd7, 0x8e, 0x9e, 0x06, 0x3f, - 0x94, 0xd0, 0x68, 0x86, 0xdc, 0xf1, 0x2b, 0x02, 0x78, 0x1b, 0x78, 0xc5, 0x69, 0xb2, 0x4a, 0x13, - 0xb8, 0x60, 0x42, 0x42, 0xe0, 0x42, 0xa5, 0xbd, 0x56, 0x39, 0x0a, 0xf9, 0x61, 0xdd, 0x0f, 0x8f, - 0xec, 0x46, 0x4b, 0x3a, 0x7b, 0x3e, 0xd8, 0x42, 0x3a, 0x12, 0xcc, 0x26, 0x0f, 0x65, 0x48, 0x96, - 0xbb, 0x00, 0x33, 0x01, 0x98, 0x4e, 0x93, 0x99, 0x1a, 0xc0, 0x6c, 0xaf, 0x15, 0x57, 0x7a, 0x92, - 0x98, 0x7e, 0xc0, 0x84, 0x0c, 0x79, 0x27, 0x26, 0x37, 0x40, 0x08, 0x67, 0x3f, 0x45, 0x15, 0x37, - 0x32, 0x64, 0x81, 0x63, 0x70, 0x5b, 0x92, 0x85, 0x81, 0x48, 0x9a, 0x96, 0x7f, 0xcf, 0xe2, 0xa5, - 0x37, 0x69, 0xc0, 0xe7, 0x49, 0xbe, 0xdd, 0x38, 0x1e, 0xe1, 0x78, 0xde, 0x71, 0x25, 0x6b, 0x33, - 0xd9, 0xb1, 0x59, 0x50, 0x0f, 0x85, 0x81, 0x4a, 0xf9, 0x72, 0x61, 0x7d, 0xc7, 0xfc, 0x7b, 0x62, - 0x73, 0x14, 0xd1, 0x7c, 0x94, 0xe2, 0x6a, 0x31, 0x6d, 0x2b, 0x90, 0xbc, 0x63, 0xcd, 0x39, 0x7a, - 0x8d, 0x30, 0x5c, 0x90, 0xac, 0x01, 0x3c, 0x15, 0x4e, 0x28, 0xe1, 0xf6, 0xd8, 0xc2, 0xd7, 0x31, - 0x4b, 0xb3, 0x61, 0xd9, 0x2b, 0x90, 0xaf, 0x08, 0x5f, 0x77, 0x0f, 0x98, 0xef, 0xd9, 0xbd, 0x2b, - 0x49, 0xad, 0x79, 0x65, 0x7d, 0x35, 0xb6, 0xb5, 0x1a, 0x53, 0xb7, 0xba, 0x50, 0x4d, 0x7f, 0xcd, - 0x1d, 0xde, 0x21, 0x5f, 0x10, 0x5e, 0xe2, 0xf0, 0xa1, 0x05, 0x42, 0xda, 0xae, 0x13, 0xb8, 0xe0, - 0xa7, 0x31, 0xfe, 0x53, 0x31, 0x5e, 0x8e, 0x1d, 0xc3, 0x4a, 0xa0, 0x55, 0xc5, 0xd4, 0x52, 0x10, - 0x3e, 0xb4, 0x41, 0x7c, 0x3c, 0x2b, 0xd8, 0x7e, 0xe0, 0x74, 0xdd, 0x93, 0xca, 0x5d, 0x1b, 0xdb, - 0xbd, 0xab, 0x60, 0x9a, 0xb4, 0x20, 0xfa, 0x15, 0xb2, 0x8a, 0x97, 0x52, 0x5b, 0x1a, 0x05, 0x3c, - 0x9b, 0x79, 0xc2, 0x98, 0x2a, 0xe5, 0xcb, 0x33, 0x16, 0x49, 0xf6, 0xac, 0xee, 0x56, 0xcd, 0x13, - 0xe4, 0x1d, 0x9e, 0x1f, 0x7c, 0x4b, 0xc6, 0xff, 0x25, 0x54, 0x2e, 0xac, 0xdf, 0xff, 0x97, 0x84, - 0x03, 0x17, 0x6f, 0xcd, 0x81, 0xbe, 0x24, 0x2e, 0x5e, 0xe8, 0x1b, 0xd4, 0x7c, 0x1a, 0xd3, 0x4a, - 0xb1, 0x39, 0x96, 0x42, 0x5d, 0x83, 0xd5, 0x0f, 0x9d, 0x8c, 0xd4, 0x32, 0x9e, 0x0b, 0xe0, 0x58, - 0xda, 0xd0, 0x86, 0x40, 0xda, 0xcc, 0x33, 0x66, 0x4a, 0xa8, 0x9c, 0xb7, 0x0a, 0x71, 0x71, 0x2b, - 0xae, 0xd5, 0x3c, 0xf2, 0x02, 0x2f, 0xec, 0xb5, 0xea, 0x75, 0xe0, 0xe0, 0x25, 0xbf, 0x13, 0x06, - 0x56, 0x6f, 0x63, 0xa5, 0x1f, 0x24, 0x4e, 0x90, 0xfe, 0x0b, 0xc4, 0xf6, 0xed, 0xe4, 0x51, 0x11, - 0xac, 0xf9, 0x6e, 0xb7, 0x5a, 0x0a, 0xb2, 0x8d, 0xa7, 0xdd, 0x03, 0x70, 0x0f, 0x45, 0xab, 0x61, - 0x14, 0xd4, 0x89, 0x6e, 0x66, 0x39, 0x51, 0x35, 0xed, 0xb1, 0x7a, 0xdd, 0x45, 0x8e, 0xc9, 0xf0, - 0x04, 0x93, 0x45, 0x9c, 0x3f, 0x84, 0x8e, 0x81, 0xd4, 0x49, 0xe2, 0x47, 0xf2, 0x14, 0x4f, 0xb6, - 0x1d, 0xbf, 0x05, 0xc6, 0x84, 0xd2, 0xad, 0x66, 0xd1, 0xe9, 0x60, 0x2b, 0x69, 0xdf, 0x9c, 0xb8, - 0x87, 0x8a, 0x3e, 0x5e, 0xb8, 0x34, 0xc4, 0xba, 0x70, 0x26, 0x11, 0x56, 0x07, 0x85, 0xb7, 0xb2, - 0x08, 0x7b, 0x54, 0xdd, 0xf6, 0x09, 0x1b, 0x57, 0x0d, 0xef, 0x88, 0x73, 0x3e, 0x1b, 0xd4, 0xde, - 0xcd, 0x76, 0xad, 0x97, 0xf1, 0xba, 0xff, 0x23, 0xbe, 0x71, 0xc5, 0xd4, 0x8e, 0xd0, 0xef, 0x0c, - 0xea, 0xef, 0x64, 0xd1, 0x0f, 0xd1, 0x75, 0x7b, 0x80, 0x17, 0x2f, 0xcf, 0xed, 0x08, 0xed, 0x93, - 0x41, 0xad, 0x99, 0x45, 0xdb, 0xc7, 0x6a, 0xbe, 0xc7, 0xef, 0x4f, 0xce, 0x68, 0xee, 0xf4, 0x8c, - 0xe6, 0x2e, 0xce, 0x28, 0xfa, 0x1c, 0x51, 0xf4, 0x3d, 0xa2, 0xe8, 0x47, 0x44, 0xd1, 0x49, 0x44, - 0xd1, 0xcf, 0x88, 0xa2, 0x5f, 0x11, 0xcd, 0x5d, 0x44, 0x14, 0x7d, 0x3b, 0xa7, 0xb9, 0x93, 0x73, - 0x9a, 0x3b, 0x3d, 0xa7, 0xb9, 0xb7, 0xb7, 0xf7, 0xc3, 0xbe, 0x92, 0x85, 0x57, 0x7f, 0xea, 0x1e, - 0x68, 0xcb, 0xbd, 0x29, 0xf5, 0xb1, 0xdb, 0xf8, 0x13, 0x00, 0x00, 0xff, 0xff, 0x67, 0x0d, 0xa0, - 0x51, 0xaf, 0x07, 0x00, 0x00, + // 712 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0x4d, 0x6f, 0xd3, 0x3e, + 0x1c, 0xc7, 0xeb, 0xf5, 0xbf, 0xfd, 0x37, 0x77, 0xeb, 0x26, 0x33, 0x44, 0xd4, 0x83, 0x55, 0x4d, + 0x9a, 0xd4, 0x03, 0xa4, 0x7b, 0x00, 0x04, 0xe3, 0x80, 0xa0, 0x0c, 0xad, 0x1a, 0x20, 0xc8, 0x40, + 0x48, 0x5c, 0x42, 0x96, 0xb8, 0x9b, 0x59, 0x9a, 0x14, 0xdb, 0xe9, 0x56, 0x09, 0x21, 0x84, 0xc4, + 0x9d, 0x97, 0xc1, 0x4b, 0xe1, 0xb8, 0x0b, 0xd2, 0x8e, 0x2c, 0xbb, 0x70, 0xdc, 0x4b, 0x40, 0x71, + 0xd2, 0xc6, 0x7d, 0x12, 0xa1, 0xdc, 0x9a, 0x9f, 0xeb, 0xcf, 0xe7, 0xeb, 0x87, 0xfc, 0x02, 0xef, + 0x0b, 0xd2, 0x6c, 0xf9, 0xcc, 0x72, 0xab, 0x9c, 0xb0, 0x36, 0x61, 0x55, 0xab, 0x45, 0xab, 0x2d, + 0xc2, 0x38, 0xe5, 0x82, 0x78, 0x36, 0xa9, 0xb6, 0xd7, 0xab, 0xc7, 0x3e, 0x3b, 0x6a, 0xb8, 0xfe, + 0xb1, 0xd9, 0x0c, 0x84, 0xb5, 0xef, 0x12, 0x93, 0x0b, 0x4b, 0x10, 0xbd, 0xc5, 0x7c, 0xe1, 0xa3, + 0x95, 0x2e, 0x40, 0x8f, 0x01, 0xba, 0xd5, 0xa2, 0xba, 0x02, 0xd0, 0xdb, 0xeb, 0xa5, 0xd5, 0x9e, + 0x24, 0xa2, 0x1f, 0x52, 0x2e, 0x7c, 0xd6, 0x89, 0xc8, 0x4d, 0xc2, 0xb9, 0x75, 0x90, 0xa0, 0x4a, + 0x9b, 0x19, 0xb2, 0x90, 0x13, 0x62, 0x07, 0x82, 0xfa, 0x1e, 0x8f, 0x27, 0xad, 0xfc, 0x28, 0xc2, + 0xe5, 0xd7, 0x49, 0xc0, 0xa7, 0x71, 0xbe, 0xbd, 0x28, 0x1e, 0x62, 0xb0, 0x68, 0xd9, 0x82, 0xb6, + 0xa9, 0xe8, 0x98, 0xd4, 0x6b, 0xf8, 0x5c, 0x03, 0xe5, 0x7c, 0xa5, 0xb0, 0xb1, 0xab, 0xff, 0x39, + 0xb1, 0x3e, 0x8a, 0xa8, 0x3f, 0x48, 0x70, 0xf5, 0x88, 0xb6, 0xed, 0x09, 0xd6, 0x31, 0x16, 0x2c, + 0xb5, 0x86, 0x28, 0x2c, 0x08, 0xda, 0x24, 0x2c, 0x11, 0x4e, 0x49, 0xe1, 0xce, 0xc4, 0xc2, 0x97, + 0x11, 0x4b, 0xb1, 0x41, 0xd1, 0x2b, 0xa0, 0x2f, 0x00, 0x5e, 0xb5, 0x0f, 0xa9, 0xeb, 0x98, 0xbd, + 0x2d, 0x49, 0xac, 0x79, 0x69, 0x7d, 0x31, 0xb1, 0xb5, 0x16, 0x51, 0xb7, 0xbb, 0x50, 0x45, 0x7f, + 0xc5, 0x1e, 0x1e, 0x41, 0x9f, 0x01, 0x5c, 0x66, 0xe4, 0x7d, 0x40, 0xb8, 0x30, 0x6d, 0xcb, 0xb3, + 0x89, 0x9b, 0xc4, 0xf8, 0x4f, 0xc6, 0x78, 0x3e, 0x71, 0x0c, 0x23, 0x86, 0xd6, 0x24, 0x53, 0x49, + 0x81, 0xd8, 0xd0, 0x00, 0x72, 0xe1, 0x3c, 0xa7, 0x07, 0x9e, 0xd5, 0x75, 0x4f, 0x4b, 0x77, 0x7d, + 0x62, 0xf7, 0x9e, 0x84, 0x29, 0xd2, 0x02, 0x4f, 0x2b, 0x68, 0x0d, 0x2e, 0x27, 0xb6, 0x24, 0x0a, + 0x71, 0x4c, 0xea, 0x70, 0x6d, 0xa6, 0x9c, 0xaf, 0xcc, 0x19, 0x28, 0x1e, 0x33, 0xba, 0x43, 0x75, + 0x87, 0xa3, 0xb7, 0xb0, 0xd8, 0x7f, 0x4a, 0xda, 0xff, 0x65, 0x50, 0x29, 0x6c, 0xdc, 0xfd, 0x9b, + 0x84, 0x7d, 0x1b, 0x6f, 0x2c, 0x10, 0xf5, 0x11, 0xd9, 0x70, 0x31, 0x35, 0xc8, 0xf7, 0x53, 0x9b, + 0x95, 0x8a, 0xad, 0x89, 0x14, 0x72, 0x1b, 0x8c, 0x34, 0x74, 0xfc, 0x4a, 0xad, 0xc0, 0x05, 0x8f, + 0x9c, 0x08, 0x93, 0xb4, 0x89, 0x27, 0x4c, 0xea, 0x68, 0x73, 0x65, 0x50, 0xc9, 0x1b, 0x85, 0xa8, + 0xb8, 0x1d, 0xd5, 0xea, 0x0e, 0x7a, 0x06, 0x17, 0xf7, 0x83, 0x46, 0x83, 0x30, 0xe2, 0xc4, 0xff, + 0xe3, 0x1a, 0x94, 0xa7, 0xb1, 0x9a, 0x06, 0x89, 0x12, 0x24, 0x5d, 0x20, 0xb2, 0xef, 0xc4, 0x3f, + 0x25, 0xc1, 0x28, 0x76, 0x67, 0xcb, 0x47, 0x8e, 0x76, 0xe0, 0xac, 0x7d, 0x48, 0xec, 0x23, 0x1e, + 0x34, 0xb5, 0x82, 0x5c, 0xd1, 0xf5, 0x2c, 0x2b, 0xaa, 0x25, 0x73, 0x8c, 0xde, 0xec, 0xe8, 0x92, + 0x04, 0x2d, 0xc7, 0x12, 0x24, 0xb9, 0x24, 0xf3, 0xff, 0x78, 0x49, 0x5e, 0x49, 0x98, 0x7a, 0x49, + 0x82, 0xb4, 0x52, 0x62, 0x10, 0x0d, 0xf7, 0x0b, 0xb4, 0x04, 0xf3, 0x47, 0xa4, 0xa3, 0x01, 0xb9, + 0x6f, 0xd1, 0x4f, 0xf4, 0x18, 0x4e, 0xb7, 0x2d, 0x37, 0x20, 0xda, 0x94, 0x5c, 0xdc, 0x5a, 0x96, + 0x38, 0x2a, 0xd8, 0x88, 0xa7, 0x6f, 0x4d, 0xdd, 0x01, 0x25, 0x17, 0x2e, 0x0e, 0xb4, 0x0c, 0x55, + 0x38, 0x17, 0x0b, 0x6b, 0xfd, 0xc2, 0x1b, 0x59, 0x84, 0x3d, 0xaa, 0x6a, 0xfb, 0x08, 0xb5, 0x71, + 0xad, 0x62, 0xc4, 0x3a, 0x9f, 0xf4, 0x6b, 0x6f, 0x67, 0x3b, 0xc4, 0x41, 0xbc, 0xea, 0xff, 0x00, + 0xaf, 0x8d, 0xe9, 0x11, 0x23, 0xf4, 0xbb, 0xfd, 0xfa, 0x5b, 0x59, 0xf4, 0x43, 0x74, 0xd5, 0xee, + 0xc1, 0xa5, 0xc1, 0x2e, 0x31, 0x42, 0xfb, 0xa8, 0x5f, 0xab, 0x67, 0xd1, 0xa6, 0xd8, 0x01, 0xdf, + 0xe0, 0x85, 0x1b, 0x71, 0xb8, 0x93, 0xf8, 0x52, 0xac, 0xe2, 0x7b, 0xf8, 0xee, 0xf4, 0x1c, 0xe7, + 0xce, 0xce, 0x71, 0xee, 0xf2, 0x1c, 0x83, 0x4f, 0x21, 0x06, 0xdf, 0x42, 0x0c, 0xbe, 0x87, 0x18, + 0x9c, 0x86, 0x18, 0xfc, 0x0c, 0x31, 0xf8, 0x15, 0xe2, 0xdc, 0x65, 0x88, 0xc1, 0xd7, 0x0b, 0x9c, + 0x3b, 0xbd, 0xc0, 0xb9, 0xb3, 0x0b, 0x9c, 0x7b, 0x73, 0xf3, 0xc0, 0x4f, 0x95, 0xd4, 0x1f, 0xff, + 0x21, 0xbf, 0xa7, 0x3c, 0xee, 0xcf, 0xc8, 0x4f, 0xf9, 0xe6, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xd2, 0x7d, 0x37, 0x89, 0x8d, 0x08, 0x00, 0x00, } func (this *WorkflowMutableState) Equal(that interface{}) bool { @@ -321,13 +333,21 @@ func (this *WorkflowMutableState) Equal(that interface{}) bool { if !this.Checksum.Equal(that1.Checksum) { return false } + if len(this.UpdateInfos) != len(that1.UpdateInfos) { + return false + } + for i := range this.UpdateInfos { + if !this.UpdateInfos[i].Equal(that1.UpdateInfos[i]) { + return false + } + } return true } func (this *WorkflowMutableState) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 15) + s := make([]string, 0, 16) s = append(s, "&persistence.WorkflowMutableState{") keysForActivityInfos := make([]int64, 0, len(this.ActivityInfos)) for k, _ := range this.ActivityInfos { @@ -408,6 +428,19 @@ func (this *WorkflowMutableState) GoString() string { if this.Checksum != nil { s = append(s, "Checksum: "+fmt.Sprintf("%#v", this.Checksum)+",\n") } + keysForUpdateInfos := make([]string, 0, len(this.UpdateInfos)) + for k, _ := range this.UpdateInfos { + keysForUpdateInfos = append(keysForUpdateInfos, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForUpdateInfos) + mapStringForUpdateInfos := "map[string]*UpdateInfo{" + for _, k := range keysForUpdateInfos { + mapStringForUpdateInfos += fmt.Sprintf("%#v: %#v,", k, this.UpdateInfos[k]) + } + mapStringForUpdateInfos += "}" + if this.UpdateInfos != nil { + s = append(s, "UpdateInfos: "+mapStringForUpdateInfos+",\n") + } s = append(s, "}") return strings.Join(s, "") } @@ -439,6 +472,32 @@ func (m *WorkflowMutableState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.UpdateInfos) > 0 { + for k := range m.UpdateInfos { + v := m.UpdateInfos[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintWorkflowMutableState(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintWorkflowMutableState(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintWorkflowMutableState(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x62 + } + } if m.Checksum != nil { { size, err := m.Checksum.MarshalToSizedBuffer(dAtA[:i]) @@ -737,6 +796,19 @@ func (m *WorkflowMutableState) Size() (n int) { l = m.Checksum.Size() n += 1 + l + sovWorkflowMutableState(uint64(l)) } + if len(m.UpdateInfos) > 0 { + for k, v := range m.UpdateInfos { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovWorkflowMutableState(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovWorkflowMutableState(uint64(len(k))) + l + n += mapEntrySize + 1 + sovWorkflowMutableState(uint64(mapEntrySize)) + } + } return n } @@ -805,6 +877,16 @@ func (this *WorkflowMutableState) String() string { mapStringForSignalInfos += fmt.Sprintf("%v: %v,", k, this.SignalInfos[k]) } mapStringForSignalInfos += "}" + keysForUpdateInfos := make([]string, 0, len(this.UpdateInfos)) + for k, _ := range this.UpdateInfos { + keysForUpdateInfos = append(keysForUpdateInfos, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForUpdateInfos) + mapStringForUpdateInfos := "map[string]*UpdateInfo{" + for _, k := range keysForUpdateInfos { + mapStringForUpdateInfos += fmt.Sprintf("%v: %v,", k, this.UpdateInfos[k]) + } + mapStringForUpdateInfos += "}" s := strings.Join([]string{`&WorkflowMutableState{`, `ActivityInfos:` + mapStringForActivityInfos + `,`, `TimerInfos:` + mapStringForTimerInfos + `,`, @@ -817,6 +899,7 @@ func (this *WorkflowMutableState) String() string { `NextEventId:` + fmt.Sprintf("%v", this.NextEventId) + `,`, `BufferedEvents:` + repeatedStringForBufferedEvents + `,`, `Checksum:` + strings.Replace(fmt.Sprintf("%v", this.Checksum), "Checksum", "Checksum", 1) + `,`, + `UpdateInfos:` + mapStringForUpdateInfos + `,`, `}`, }, "") return s @@ -1640,6 +1723,135 @@ func (m *WorkflowMutableState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWorkflowMutableState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthWorkflowMutableState + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthWorkflowMutableState + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UpdateInfos == nil { + m.UpdateInfos = make(map[string]*UpdateInfo) + } + var mapkey string + var mapvalue *UpdateInfo + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWorkflowMutableState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWorkflowMutableState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthWorkflowMutableState + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthWorkflowMutableState + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWorkflowMutableState + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthWorkflowMutableState + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthWorkflowMutableState + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &UpdateInfo{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipWorkflowMutableState(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWorkflowMutableState + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.UpdateInfos[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipWorkflowMutableState(dAtA[iNdEx:]) diff --git a/common/persistence/cassandra/mutable_state_store.go b/common/persistence/cassandra/mutable_state_store.go index dc484f27207..9ced45981f8 100644 --- a/common/persistence/cassandra/mutable_state_store.go +++ b/common/persistence/cassandra/mutable_state_store.go @@ -81,6 +81,7 @@ const ( templateGetWorkflowExecutionQuery = `SELECT execution, execution_encoding, execution_state, execution_state_encoding, next_event_id, activity_map, activity_map_encoding, timer_map, timer_map_encoding, ` + `child_executions_map, child_executions_map_encoding, request_cancel_map, request_cancel_map_encoding, signal_map, signal_map_encoding, signal_requested, buffered_events_list, ` + + `update_info_map, update_info_map_encoding, ` + `checksum, checksum_encoding, db_record_version ` + `FROM executions ` + `WHERE shard_id = ? ` + @@ -243,6 +244,16 @@ const ( `and visibility_ts = ? ` + `and task_id = ? ` + templateResetUpdateInfoQuery = `UPDATE executions ` + + `SET update_info_map = ?, update_info_map_encoding = ? ` + + `WHERE shard_id = ? ` + + `and type = ? ` + + `and namespace_id = ? ` + + `and workflow_id = ? ` + + `and run_id = ? ` + + `and visibility_ts = ? ` + + `and task_id = ? ` + templateUpdateSignalRequestedQuery = `UPDATE executions ` + `SET signal_requested = signal_requested + ? ` + `WHERE shard_id = ? ` + @@ -263,6 +274,16 @@ const ( `and visibility_ts = ? ` + `and task_id = ? ` + templateUpdateUpdateInfoQuery = `UPDATE executions ` + + `SET update_info_map[ ? ] = ? , update_info_map_encoding = ? ` + + `WHERE shard_id = ? ` + + `and type = ? ` + + `and namespace_id = ? ` + + `and workflow_id = ? ` + + `and run_id = ? ` + + `and visibility_ts = ? ` + + `and task_id = ? ` + templateAppendBufferedEventsQuery = `UPDATE executions ` + `SET buffered_events_list = buffered_events_list + ? ` + `WHERE shard_id = ? ` + @@ -293,6 +314,16 @@ const ( `and visibility_ts = ? ` + `and task_id = ? ` + templateDeleteUpdateInfoQuery = `DELETE update_info_map[ ? ] ` + + `FROM executions ` + + `WHERE shard_id = ? ` + + `and type = ? ` + + `and namespace_id = ? ` + + `and workflow_id = ? ` + + `and run_id = ? ` + + `and visibility_ts = ? ` + + `and task_id = ? ` + templateDeleteTimerInfoQuery = `DELETE timer_map[ ? ] ` + `FROM executions ` + `WHERE shard_id = ? ` + @@ -522,6 +553,14 @@ func (d *MutableStateStore) GetWorkflowExecution( } state.TimerInfos = timerInfos + updateInfos := make(map[string]*commonpb.DataBlob) + uMapEncoding := result["update_info_map_encoding"].(string) + uMap := result["update_info_map"].(map[string][]byte) + for key, value := range uMap { + updateInfos[key] = p.NewDataBlob(value, uMapEncoding) + } + state.UpdateInfos = updateInfos + childExecutionInfos := make(map[int64]*commonpb.DataBlob) cMap := result["child_executions_map"].(map[int64][]byte) cMapEncoding := result["child_executions_map_encoding"].(string) diff --git a/common/persistence/cassandra/util.go b/common/persistence/cassandra/util.go index 292e76c1e8f..f54070d710a 100644 --- a/common/persistence/cassandra/util.go +++ b/common/persistence/cassandra/util.go @@ -135,6 +135,16 @@ func applyWorkflowMutationBatch( runID, ) + updateUpdateInfos( + batch, + workflowMutation.UpsertUpdateInfos, + workflowMutation.DeleteUpdateInfos, + shardID, + namespaceID, + workflowID, + runID, + ) + updateBufferedEvents( batch, workflowMutation.NewBufferedEvents, @@ -247,6 +257,15 @@ func applyWorkflowSnapshotBatchAsReset( runID, ) + resetUpdateInfos( + batch, + workflowSnapshot.UpdateInfos, + shardID, + namespaceID, + workflowID, + runID, + ) + deleteBufferedEvents( batch, shardID, @@ -350,6 +369,16 @@ func applyWorkflowSnapshotBatchAsNew( runID, ) + updateUpdateInfos( + batch, + workflowSnapshot.UpdateInfos, + nil, + shardID, + namespaceID, + workflowID, + runID, + ) + // transfer / replication / timer tasks return applyTasks( batch, @@ -998,6 +1027,64 @@ func resetSignalRequested( rowTypeExecutionTaskID) } +func updateUpdateInfos( + batch gocql.Batch, + updateInfos map[string]*commonpb.DataBlob, + deletedUpdateInfos map[string]struct{}, + shardID int32, + namespaceID string, + workflowID string, + runID string, +) { + for id, blob := range updateInfos { + batch.Query(templateUpdateUpdateInfoQuery, + id, + blob.Data, + blob.EncodingType.String(), + shardID, + rowTypeExecution, + namespaceID, + workflowID, + runID, + defaultVisibilityTimestamp, + rowTypeExecutionTaskID) + } + + for deleteID := range deletedUpdateInfos { + batch.Query(templateDeleteUpdateInfoQuery, + deleteID, + shardID, + rowTypeExecution, + namespaceID, + workflowID, + runID, + defaultVisibilityTimestamp, + rowTypeExecutionTaskID) + } +} + +func resetUpdateInfos( + batch gocql.Batch, + updateInfos map[string]*commonpb.DataBlob, + shardID int32, + namespaceID string, + workflowID string, + runID string, +) { + uMap, uMapEncoding := resetBlobMap(updateInfos) + + batch.Query(templateResetUpdateInfoQuery, + uMap, + uMapEncoding.String(), + shardID, + rowTypeExecution, + namespaceID, + workflowID, + runID, + defaultVisibilityTimestamp, + rowTypeExecutionTaskID) +} + func updateBufferedEvents( batch gocql.Batch, newBufferedEvents *commonpb.DataBlob, @@ -1105,6 +1192,18 @@ func resetSignalInfoMap( return sMap, encoding, nil } +func resetBlobMap[K comparable]( + m map[K]*commonpb.DataBlob, +) (map[K][]byte, enumspb.EncodingType) { + out := make(map[K][]byte, len(m)) + var encoding enumspb.EncodingType + for k, blob := range m { + encoding = blob.EncodingType + out[k] = blob.Data + } + return out, encoding +} + func createHistoryEventBatchBlob( result map[string]interface{}, ) *commonpb.DataBlob { diff --git a/common/persistence/dataInterfaces.go b/common/persistence/dataInterfaces.go index f7e2d719f45..d1f8a77b4e8 100644 --- a/common/persistence/dataInterfaces.go +++ b/common/persistence/dataInterfaces.go @@ -360,6 +360,8 @@ type ( DeleteSignalInfos map[int64]struct{} UpsertSignalRequestedIDs map[string]struct{} DeleteSignalRequestedIDs map[string]struct{} + UpsertUpdateInfos map[string]*persistencespb.UpdateInfo + DeleteUpdateInfos map[string]struct{} NewBufferedEvents []*historypb.HistoryEvent ClearBufferedEvents bool @@ -384,6 +386,7 @@ type ( RequestCancelInfos map[int64]*persistencespb.RequestCancelInfo SignalInfos map[int64]*persistencespb.SignalInfo SignalRequestedIDs map[string]struct{} + UpdateInfos map[string]*persistencespb.UpdateInfo Tasks map[tasks.Category][]tasks.Task diff --git a/common/persistence/execution_manager.go b/common/persistence/execution_manager.go index ecf35622d51..91cb96df9e6 100644 --- a/common/persistence/execution_manager.go +++ b/common/persistence/execution_manager.go @@ -493,6 +493,9 @@ func (m *executionManagerImpl) SerializeWorkflowMutation( // unexport UpsertSignalRequestedIDs: input.UpsertSignalRequestedIDs, DeleteSignalRequestedIDs: input.DeleteSignalRequestedIDs, + UpsertUpdateInfos: make(map[string]*commonpb.DataBlob, len(input.UpsertUpdateInfos)), + DeleteUpdateInfos: input.DeleteUpdateInfos, + NewBufferedEvents: nil, ClearBufferedEvents: input.ClearBufferedEvents, @@ -555,6 +558,14 @@ func (m *executionManagerImpl) SerializeWorkflowMutation( // unexport result.UpsertSignalInfos[key] = blob } + for key, rec := range input.UpsertUpdateInfos { + blob, err := m.serializer.UpdateInfoToBlob(rec, enumspb.ENCODING_TYPE_PROTO3) + if err != nil { + return nil, err + } + result.UpsertUpdateInfos[key] = blob + } + if len(input.NewBufferedEvents) > 0 { result.NewBufferedEvents, err = m.serializer.SerializeEvents(input.NewBufferedEvents, enumspb.ENCODING_TYPE_PROTO3) if err != nil { @@ -593,6 +604,7 @@ func (m *executionManagerImpl) SerializeWorkflowSnapshot( // unexport ChildExecutionInfos: make(map[int64]*commonpb.DataBlob, len(input.ChildExecutionInfos)), RequestCancelInfos: make(map[int64]*commonpb.DataBlob, len(input.RequestCancelInfos)), SignalInfos: make(map[int64]*commonpb.DataBlob, len(input.SignalInfos)), + UpdateInfos: make(map[string]*commonpb.DataBlob, len(input.UpdateInfos)), ExecutionInfo: input.ExecutionInfo, ExecutionState: input.ExecutionState, @@ -653,6 +665,13 @@ func (m *executionManagerImpl) SerializeWorkflowSnapshot( // unexport } result.SignalInfos[key] = blob } + for key, rec := range input.UpdateInfos { + blob, err := m.serializer.UpdateInfoToBlob(rec, enumspb.ENCODING_TYPE_PROTO3) + if err != nil { + return nil, err + } + result.UpdateInfos[key] = blob + } for key := range input.SignalRequestedIDs { result.SignalRequestedIDs[key] = struct{}{} } @@ -933,6 +952,7 @@ func (m *executionManagerImpl) toWorkflowMutableState(internState *InternalWorkf SignalRequestedIds: internState.SignalRequestedIDs, NextEventId: internState.NextEventID, BufferedEvents: make([]*historypb.HistoryEvent, len(internState.BufferedEvents)), + UpdateInfos: make(map[string]*persistencespb.UpdateInfo, len(internState.UpdateInfos)), } for key, blob := range internState.ActivityInfos { info, err := m.serializer.ActivityInfoFromBlob(blob) @@ -983,6 +1003,13 @@ func (m *executionManagerImpl) toWorkflowMutableState(internState *InternalWorkf return nil, err } state.BufferedEvents, err = m.DeserializeBufferedEvents(internState.BufferedEvents) + for key, blob := range internState.UpdateInfos { + rec, err := m.serializer.UpdateInfoFromBlob(blob) + if err != nil { + return nil, err + } + state.UpdateInfos[key] = rec + } if err != nil { return nil, err } diff --git a/common/persistence/persistenceInterface.go b/common/persistence/persistenceInterface.go index d9f10259e7a..8f7a98acbe9 100644 --- a/common/persistence/persistenceInterface.go +++ b/common/persistence/persistenceInterface.go @@ -349,6 +349,7 @@ type ( RequestCancelInfos map[int64]*commonpb.DataBlob // RequestCancelInfo SignalInfos map[int64]*commonpb.DataBlob // SignalInfo SignalRequestedIDs []string + UpdateInfos map[string]*commonpb.DataBlob ExecutionInfo *commonpb.DataBlob // WorkflowExecutionInfo ExecutionState *commonpb.DataBlob // WorkflowExecutionState NextEventID int64 @@ -402,6 +403,8 @@ type ( DeleteSignalInfos map[int64]struct{} UpsertSignalRequestedIDs map[string]struct{} DeleteSignalRequestedIDs map[string]struct{} + UpsertUpdateInfos map[string]*commonpb.DataBlob + DeleteUpdateInfos map[string]struct{} NewBufferedEvents *commonpb.DataBlob ClearBufferedEvents bool @@ -434,6 +437,7 @@ type ( RequestCancelInfos map[int64]*commonpb.DataBlob SignalInfos map[int64]*commonpb.DataBlob SignalRequestedIDs map[string]struct{} + UpdateInfos map[string]*commonpb.DataBlob Tasks map[tasks.Category][]InternalHistoryTask diff --git a/common/persistence/serialization/serializer.go b/common/persistence/serialization/serializer.go index 755e49d70ce..f942ea74729 100644 --- a/common/persistence/serialization/serializer.go +++ b/common/persistence/serialization/serializer.go @@ -76,6 +76,9 @@ type ( ActivityInfoToBlob(info *persistencespb.ActivityInfo, encodingType enumspb.EncodingType) (*commonpb.DataBlob, error) ActivityInfoFromBlob(data *commonpb.DataBlob) (*persistencespb.ActivityInfo, error) + UpdateInfoToBlob(rec *persistencespb.UpdateInfo, encodingType enumspb.EncodingType) (*commonpb.DataBlob, error) + UpdateInfoFromBlob(data *commonpb.DataBlob) (*persistencespb.UpdateInfo, error) + ChildExecutionInfoToBlob(info *persistencespb.ChildExecutionInfo, encodingType enumspb.EncodingType) (*commonpb.DataBlob, error) ChildExecutionInfoFromBlob(data *commonpb.DataBlob) (*persistencespb.ChildExecutionInfo, error) @@ -383,6 +386,15 @@ func (t *serializerImpl) HistoryTreeInfoFromBlob(data *commonpb.DataBlob) (*pers return result, ProtoDecodeBlob(data, result) } +func (t *serializerImpl) UpdateInfoToBlob(rec *persistencespb.UpdateInfo, encodingType enumspb.EncodingType) (*commonpb.DataBlob, error) { + return ProtoEncodeBlob(rec, encodingType) +} + +func (t *serializerImpl) UpdateInfoFromBlob(data *commonpb.DataBlob) (*persistencespb.UpdateInfo, error) { + result := &persistencespb.UpdateInfo{} + return result, ProtoDecodeBlob(data, result) +} + func (t *serializerImpl) HistoryBranchToBlob(info *persistencespb.HistoryBranch, encodingType enumspb.EncodingType) (*commonpb.DataBlob, error) { return ProtoEncodeBlob(info, encodingType) } diff --git a/common/persistence/sql/execution.go b/common/persistence/sql/execution.go index cc882a19661..52180db60da 100644 --- a/common/persistence/sql/execution.go +++ b/common/persistence/sql/execution.go @@ -275,6 +275,17 @@ func (m *sqlExecutionStore) GetWorkflowExecution( return nil, serviceerror.NewUnavailable(fmt.Sprintf("GetWorkflowExecution: failed to get timer info. Error: %v", err)) } + state.UpdateInfos, err = getUpdateInfoMap(ctx, + m.Db, + request.ShardID, + namespaceID, + workflowID, + runID, + ) + if err != nil { + return nil, serviceerror.NewUnavailable(fmt.Sprintf("GetWorkflowExecution: failed to get update records. Error: %v", err)) + } + state.ChildExecutionInfos, err = getChildExecutionInfoMap(ctx, m.Db, request.ShardID, diff --git a/common/persistence/sql/execution_state_map.go b/common/persistence/sql/execution_state_map.go index b364bd8fcae..e50f3187c04 100644 --- a/common/persistence/sql/execution_state_map.go +++ b/common/persistence/sql/execution_state_map.go @@ -131,6 +131,96 @@ func deleteActivityInfoMap( return nil } +func updateUpdateInfoMap( + ctx context.Context, + tx sqlplugin.Tx, + updateInfos map[string]*commonpb.DataBlob, + deleteIDs map[string]struct{}, + shardID int32, + namespaceID primitives.UUID, + workflowID string, + runID primitives.UUID, +) error { + + if len(updateInfos) > 0 { + rows := make([]sqlplugin.UpdateInfoMapsRow, 0, len(updateInfos)) + for updateID, blob := range updateInfos { + rows = append(rows, sqlplugin.UpdateInfoMapsRow{ + ShardID: shardID, + NamespaceID: namespaceID, + WorkflowID: workflowID, + RunID: runID, + UpdateID: updateID, + Data: blob.Data, + DataEncoding: blob.EncodingType.String(), + }) + } + + if _, err := tx.ReplaceIntoUpdateInfoMaps(ctx, rows); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update update records. Failed to execute update query. Error: %v", err)) + } + } + + if len(deleteIDs) > 0 { + if _, err := tx.DeleteFromUpdateInfoMaps(ctx, sqlplugin.UpdateInfoMapsFilter{ + ShardID: shardID, + NamespaceID: namespaceID, + WorkflowID: workflowID, + RunID: runID, + UpdateIDs: convert.StringSetToSlice(deleteIDs), + }); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update update records. Failed to execute delete query. Error: %v", err)) + } + } + return nil +} + +func getUpdateInfoMap( + ctx context.Context, + db sqlplugin.DB, + shardID int32, + namespaceID primitives.UUID, + workflowID string, + runID primitives.UUID, +) (map[string]*commonpb.DataBlob, error) { + rows, err := db.SelectAllFromUpdateInfoMaps(ctx, sqlplugin.UpdateInfoMapsAllFilter{ + ShardID: shardID, + NamespaceID: namespaceID, + WorkflowID: workflowID, + RunID: runID, + }) + if err != nil && err != sql.ErrNoRows { + return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get activity info. Error: %v", err)) + } + + ret := make(map[string]*commonpb.DataBlob, len(rows)) + for _, row := range rows { + ret[row.UpdateID] = persistence.NewDataBlob(row.Data, row.DataEncoding) + } + + return ret, nil +} + +func deleteUpdateInfoMap( + ctx context.Context, + tx sqlplugin.Tx, + shardID int32, + namespaceID primitives.UUID, + workflowID string, + runID primitives.UUID, +) error { + + if _, err := tx.DeleteAllFromUpdateInfoMaps(ctx, sqlplugin.UpdateInfoMapsAllFilter{ + ShardID: shardID, + NamespaceID: namespaceID, + WorkflowID: workflowID, + RunID: runID, + }); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete update records map. Error: %v", err)) + } + return nil +} + func updateTimerInfos( ctx context.Context, tx sqlplugin.Tx, diff --git a/common/persistence/sql/execution_util.go b/common/persistence/sql/execution_util.go index a5f20685c54..dc5363a47ff 100644 --- a/common/persistence/sql/execution_util.go +++ b/common/persistence/sql/execution_util.go @@ -116,6 +116,18 @@ func applyWorkflowMutationTx( return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowMutationTx failed. Error: %v", err)) } + if err := updateUpdateInfoMap(ctx, + tx, + workflowMutation.UpsertUpdateInfos, + workflowMutation.DeleteUpdateInfos, + shardID, + namespaceIDBytes, + workflowID, + runIDBytes, + ); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowMutationTx failed. Error: %v", err)) + } + if err := updateTimerInfos(ctx, tx, workflowMutation.UpsertTimerInfos, @@ -270,6 +282,16 @@ func applyWorkflowSnapshotTxAsReset( return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsReset failed. Failed to clear activity info map. Error: %v", err)) } + if err := deleteUpdateInfoMap(ctx, + tx, + shardID, + namespaceIDBytes, + workflowID, + runIDBytes, + ); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsReset failed. Failed to clear update record map. Error: %v", err)) + } + if err := updateActivityInfos(ctx, tx, workflowSnapshot.ActivityInfos, @@ -282,6 +304,18 @@ func applyWorkflowSnapshotTxAsReset( return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsReset failed. Failed to insert into activity info map after clearing. Error: %v", err)) } + if err := updateUpdateInfoMap(ctx, + tx, + workflowSnapshot.UpdateInfos, + nil, + shardID, + namespaceIDBytes, + workflowID, + runIDBytes, + ); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsReset failed. Failed to insert into update record map after clearing. Error: %v", err)) + } + if err := deleteTimerInfoMap(ctx, tx, shardID, @@ -457,6 +491,18 @@ func (m *sqlExecutionStore) applyWorkflowSnapshotTxAsNew( return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsNew failed. Failed to insert into activity info map after clearing. Error: %v", err)) } + if err := updateUpdateInfoMap(ctx, + tx, + workflowSnapshot.UpdateInfos, + nil, + shardID, + namespaceIDBytes, + workflowID, + runIDBytes, + ); err != nil { + return serviceerror.NewUnavailable(fmt.Sprintf("applyWorkflowSnapshotTxAsNew failed. Failed to insert into update record map after clearing. Error: %v", err)) + } + if err := updateTimerInfos(ctx, tx, workflowSnapshot.TimerInfos, diff --git a/common/persistence/sql/sqlplugin/history_info_records.go b/common/persistence/sql/sqlplugin/history_info_records.go new file mode 100644 index 00000000000..2da33e73e94 --- /dev/null +++ b/common/persistence/sql/sqlplugin/history_info_records.go @@ -0,0 +1,72 @@ +// The MIT License +// +// Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sqlplugin + +import ( + "context" + "database/sql" + + "go.temporal.io/server/common/primitives" +) + +type ( + // UpdateInfoMapsRow represents a row in update_info_maps table + UpdateInfoMapsRow struct { + ShardID int32 + NamespaceID primitives.UUID + WorkflowID string + RunID primitives.UUID + UpdateID string + Data []byte + DataEncoding string + } + + UpdateInfoMapsFilter struct { + ShardID int32 + NamespaceID primitives.UUID + WorkflowID string + RunID primitives.UUID + UpdateIDs []string + } + + UpdateInfoMapsAllFilter struct { + ShardID int32 + NamespaceID primitives.UUID + WorkflowID string + RunID primitives.UUID + } + + // HistoryExecutionUpdateInfo is the SQL persistence interface for history execution updates + HistoryExecutionUpdateInfo interface { + // ReplaceIntoUpdateInfoMaps replace one or more rows into update_info_maps table + ReplaceIntoUpdateInfoMaps(ctx context.Context, rows []UpdateInfoMapsRow) (sql.Result, error) + // SelectAllFromUpdateInfoMaps returns all rows from update_info_maps table + SelectAllFromUpdateInfoMaps(ctx context.Context, filter UpdateInfoMapsAllFilter) ([]UpdateInfoMapsRow, error) + // DeleteFromUpdateInfoMaps deletes one or more rows from update_info_maps table + DeleteFromUpdateInfoMaps(ctx context.Context, filter UpdateInfoMapsFilter) (sql.Result, error) + // DeleteAllFromUpdateInfoMaps deletes all rows from update_info_maps table + DeleteAllFromUpdateInfoMaps(ctx context.Context, filter UpdateInfoMapsAllFilter) (sql.Result, error) + } +) diff --git a/common/persistence/sql/sqlplugin/interfaces.go b/common/persistence/sql/sqlplugin/interfaces.go index 303e5916297..74cd7e1f388 100644 --- a/common/persistence/sql/sqlplugin/interfaces.go +++ b/common/persistence/sql/sqlplugin/interfaces.go @@ -71,6 +71,7 @@ type ( HistoryExecutionActivity HistoryExecutionChildWorkflow HistoryExecutionTimer + HistoryExecutionUpdateInfo HistoryExecutionRequestCancel HistoryExecutionSignal HistoryExecutionSignalRequest diff --git a/common/persistence/sql/sqlplugin/mysql/execution_maps.go b/common/persistence/sql/sqlplugin/mysql/execution_maps.go index 021f3050117..0ad2cc47930 100644 --- a/common/persistence/sql/sqlplugin/mysql/execution_maps.go +++ b/common/persistence/sql/sqlplugin/mysql/execution_maps.go @@ -288,6 +288,92 @@ func (mdb *db) DeleteAllFromTimerInfoMaps( ) } +var ( + updateInfoColumns = []string{ + "data", + "data_encoding", + } + updateInfoTableName = "update_info_maps" + updateInfoKey = "update_id" + + deleteUpdateInfoMapSQLQuery = makeDeleteMapQry(updateInfoTableName) + setKeyInUpdateInfoMapSQLQuery = makeSetKeyInMapQry(updateInfoTableName, updateInfoColumns, updateInfoKey) + deleteKeyInUpdateInfoMapSQLQuery = makeDeleteKeyInMapQry(updateInfoTableName, updateInfoKey) + getUpdateInfoMapSQLQuery = makeGetMapQryTemplate(updateInfoTableName, updateInfoColumns, updateInfoKey) +) + +// ReplaceIntoUpdateInfoMaps replaces one or more rows in update_info_maps table +func (mdb *db) ReplaceIntoUpdateInfoMaps( + ctx context.Context, + rows []sqlplugin.UpdateInfoMapsRow, +) (sql.Result, error) { + return mdb.conn.NamedExecContext(ctx, + setKeyInUpdateInfoMapSQLQuery, + rows, + ) +} + +// SelectAllFromUpdateInfoMaps reads all rows from update_info_maps table +func (mdb *db) SelectAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) ([]sqlplugin.UpdateInfoMapsRow, error) { + var rows []sqlplugin.UpdateInfoMapsRow + if err := mdb.conn.SelectContext(ctx, + &rows, + getUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ); err != nil { + return nil, err + } + for i := 0; i < len(rows); i++ { + rows[i].ShardID = filter.ShardID + rows[i].NamespaceID = filter.NamespaceID + rows[i].WorkflowID = filter.WorkflowID + rows[i].RunID = filter.RunID + } + return rows, nil +} + +// DeleteFromUpdateInfoMaps deletes one or more rows from update_info_maps table +func (mdb *db) DeleteFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsFilter, +) (sql.Result, error) { + query, args, err := sqlx.In( + deleteKeyInUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + filter.UpdateIDs, + ) + if err != nil { + return nil, err + } + return mdb.conn.ExecContext(ctx, + mdb.conn.Rebind(query), + args..., + ) +} + +// DeleteAllFromUpdateInfoMaps deletes all rows from update_info_maps table +func (mdb *db) DeleteAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) (sql.Result, error) { + return mdb.conn.ExecContext(ctx, + deleteUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ) +} + var ( childExecutionInfoColumns = []string{ "data", diff --git a/common/persistence/sql/sqlplugin/postgresql/execution_maps.go b/common/persistence/sql/sqlplugin/postgresql/execution_maps.go index 90393c7d2d3..62d280d037c 100644 --- a/common/persistence/sql/sqlplugin/postgresql/execution_maps.go +++ b/common/persistence/sql/sqlplugin/postgresql/execution_maps.go @@ -234,6 +234,92 @@ func (pdb *db) DeleteAllFromActivityInfoMaps( ) } +var ( + // Omit shard_id, run_id, namespace_id, workflow_id, update_id since they're in the primary key + updateInfoColumns = []string{ + "data", + "data_encoding", + } + updateInfoTableName = "update_info_maps" + updateInfoKey = "update_id" + + deleteUpdateInfoMapQry = makeDeleteMapQry(updateInfoTableName) + setKeyInUpdateInfoMapQry = makeSetKeyInMapQry(updateInfoTableName, updateInfoColumns, updateInfoKey) + deleteKeyInUpdateInfoMapQry = makeDeleteKeyInMapQry(updateInfoTableName, updateInfoKey) + getUpdateInfoMapQry = makeGetMapQryTemplate(updateInfoTableName, updateInfoColumns, updateInfoKey) +) + +// ReplaceIntoUpdateInfoMaps replaces one or more rows in update_info_maps table +func (pdb *db) ReplaceIntoUpdateInfoMaps( + ctx context.Context, + rows []sqlplugin.UpdateInfoMapsRow, +) (sql.Result, error) { + return pdb.conn.NamedExecContext(ctx, + setKeyInUpdateInfoMapQry, + rows, + ) +} + +// SelectAllFromUpdateInfoMaps reads all rows from update_info_maps table +func (pdb *db) SelectAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) ([]sqlplugin.UpdateInfoMapsRow, error) { + var rows []sqlplugin.UpdateInfoMapsRow + if err := pdb.conn.SelectContext(ctx, + &rows, getUpdateInfoMapQry, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ); err != nil { + return nil, err + } + for i := 0; i < len(rows); i++ { + rows[i].ShardID = filter.ShardID + rows[i].NamespaceID = filter.NamespaceID + rows[i].WorkflowID = filter.WorkflowID + rows[i].RunID = filter.RunID + } + return rows, nil +} + +// DeleteFromUpdateInfoMaps deletes one or more rows from update_info_maps table +func (pdb *db) DeleteFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsFilter, +) (sql.Result, error) { + query, args, err := sqlx.In( + deleteKeyInUpdateInfoMapQry, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + filter.UpdateIDs, + ) + if err != nil { + return nil, err + } + return pdb.conn.ExecContext(ctx, + pdb.conn.Rebind(query), + args..., + ) +} + +// DeleteAllFromUpdateInfoMaps deletes all rows from update_info_maps table +func (pdb *db) DeleteAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) (sql.Result, error) { + return pdb.conn.ExecContext(ctx, + deleteUpdateInfoMapQry, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ) +} + var ( timerInfoColumns = []string{ "data", diff --git a/common/persistence/sql/sqlplugin/sqlite/execution_maps.go b/common/persistence/sql/sqlplugin/sqlite/execution_maps.go index ccb0500b92d..6d51421cfcc 100644 --- a/common/persistence/sql/sqlplugin/sqlite/execution_maps.go +++ b/common/persistence/sql/sqlplugin/sqlite/execution_maps.go @@ -289,6 +289,92 @@ func (mdb *db) DeleteAllFromTimerInfoMaps( ) } +var ( + updateInfoColumns = []string{ + "data", + "data_encoding", + } + updateInfoTableName = "update_info_maps" + updateInfoKey = "update_id" + + deleteUpdateInfoMapSQLQuery = makeDeleteMapQry(updateInfoTableName) + setKeyInUpdateInfoMapSQLQuery = makeSetKeyInMapQry(updateInfoTableName, updateInfoColumns, updateInfoKey) + deleteKeyInUpdateInfoMapSQLQuery = makeDeleteKeyInMapQry(updateInfoTableName, updateInfoKey) + getUpdateInfoMapSQLQuery = makeGetMapQryTemplate(updateInfoTableName, updateInfoColumns, updateInfoKey) +) + +// ReplaceIntoUpdateInfoMaps replaces one or more rows in update_info_maps table +func (mdb *db) ReplaceIntoUpdateInfoMaps( + ctx context.Context, + rows []sqlplugin.UpdateInfoMapsRow, +) (sql.Result, error) { + return mdb.conn.NamedExecContext(ctx, + setKeyInUpdateInfoMapSQLQuery, + rows, + ) +} + +// SelectAllFromUpdateInfoMaps reads all rows from update_info_maps table +func (mdb *db) SelectAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) ([]sqlplugin.UpdateInfoMapsRow, error) { + var rows []sqlplugin.UpdateInfoMapsRow + if err := mdb.conn.SelectContext(ctx, + &rows, + getUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ); err != nil { + return nil, err + } + for i := 0; i < len(rows); i++ { + rows[i].ShardID = filter.ShardID + rows[i].NamespaceID = filter.NamespaceID + rows[i].WorkflowID = filter.WorkflowID + rows[i].RunID = filter.RunID + } + return rows, nil +} + +// DeleteFromUpdateInfoMaps deletes one or more rows from update_info_maps table +func (mdb *db) DeleteFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsFilter, +) (sql.Result, error) { + query, args, err := sqlx.In( + deleteKeyInUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + filter.UpdateIDs, + ) + if err != nil { + return nil, err + } + return mdb.conn.ExecContext(ctx, + mdb.conn.Rebind(query), + args..., + ) +} + +// DeleteAllFromUpdateInfoMaps deletes all rows from update_info_maps table +func (mdb *db) DeleteAllFromUpdateInfoMaps( + ctx context.Context, + filter sqlplugin.UpdateInfoMapsAllFilter, +) (sql.Result, error) { + return mdb.conn.ExecContext(ctx, + deleteUpdateInfoMapSQLQuery, + filter.ShardID, + filter.NamespaceID, + filter.WorkflowID, + filter.RunID, + ) +} + var ( childExecutionInfoColumns = []string{ "data", diff --git a/common/persistence/tests/execution_mutable_state.go b/common/persistence/tests/execution_mutable_state.go index 74cf9652bef..57c883b21a0 100644 --- a/common/persistence/tests/execution_mutable_state.go +++ b/common/persistence/tests/execution_mutable_state.go @@ -1760,17 +1760,16 @@ func (s *ExecutionMutableStateSuite) Accumulate( mutations ...*p.WorkflowMutation, ) (*persistencespb.WorkflowMutableState, int64) { mutableState := &persistencespb.WorkflowMutableState{ - ExecutionInfo: snapshot.ExecutionInfo, - ExecutionState: snapshot.ExecutionState, - - NextEventId: snapshot.NextEventID, - + ExecutionInfo: snapshot.ExecutionInfo, + ExecutionState: snapshot.ExecutionState, + NextEventId: snapshot.NextEventID, ActivityInfos: snapshot.ActivityInfos, TimerInfos: snapshot.TimerInfos, ChildExecutionInfos: snapshot.ChildExecutionInfos, RequestCancelInfos: snapshot.RequestCancelInfos, SignalInfos: snapshot.SignalInfos, SignalRequestedIds: convert.StringSetToSlice(snapshot.SignalRequestedIDs), + UpdateInfos: snapshot.UpdateInfos, } dbRecordVersion := snapshot.DBRecordVersion @@ -1823,6 +1822,13 @@ func (s *ExecutionMutableStateSuite) Accumulate( delete(mutableState.SignalInfos, key) } + for key, rec := range mutation.UpsertUpdateInfos { + mutableState.UpdateInfos[key] = rec + } + for key := range mutation.DeleteUpdateInfos { + delete(mutableState.UpdateInfos, key) + } + // signal request IDs signalRequestIDs := convert.StringSliceToSet(mutableState.SignalRequestedIds) for key, info := range mutation.UpsertSignalRequestedIDs { @@ -1870,6 +1876,9 @@ func (s *ExecutionMutableStateSuite) Accumulate( if mutableState.BufferedEvents == nil { mutableState.BufferedEvents = make([]*historypb.HistoryEvent, 0) } + if mutableState.UpdateInfos == nil { + mutableState.UpdateInfos = make(map[string]*persistencespb.UpdateInfo) + } return mutableState, dbRecordVersion } diff --git a/common/persistence/tests/util.go b/common/persistence/tests/util.go index fc493f39350..f1e95fc76b1 100644 --- a/common/persistence/tests/util.go +++ b/common/persistence/tests/util.go @@ -76,6 +76,7 @@ func RandomSnapshot( RequestCancelInfos: RandomInt64RequestCancelInfoMap(), SignalInfos: RandomInt64SignalInfoMap(), SignalRequestedIDs: map[string]struct{}{uuid.New().String(): {}}, + UpdateInfos: RandomStringUpdateInfoMap(), Tasks: map[tasks.Category][]tasks.Task{ tasks.CategoryTransfer: {}, @@ -116,6 +117,8 @@ func RandomMutation( DeleteSignalInfos: map[int64]struct{}{rand.Int63(): {}}, UpsertSignalRequestedIDs: map[string]struct{}{uuid.New().String(): {}}, DeleteSignalRequestedIDs: map[string]struct{}{uuid.New().String(): {}}, + UpsertUpdateInfos: RandomStringUpdateInfoMap(), + DeleteUpdateInfos: map[string]struct{}{uuid.NewString(): {}}, // NewBufferedEvents: see below // ClearBufferedEvents: see below @@ -202,6 +205,12 @@ func RandomInt64SignalInfoMap() map[int64]*persistencespb.SignalInfo { } } +func RandomStringUpdateInfoMap() map[string]*persistencespb.UpdateInfo { + return map[string]*persistencespb.UpdateInfo{ + uuid.NewString(): RandomUpdateInfo(), + } +} + func RandomActivityInfo() *persistencespb.ActivityInfo { // cannot use gofakeit due to RetryLastFailure is of type Failure // and Failure can contain another Failure -> stack overflow @@ -263,6 +272,22 @@ func RandomResetPoints() *workflowpb.ResetPoints { }}} } +func RandomUpdateInfo() *persistencespb.UpdateInfo { + ptr := historyspb.HistoryEventPointer{EventId: rand.Int63()} + if rand.Intn(2) == 0 { + return &persistencespb.UpdateInfo{ + Value: &persistencespb.UpdateInfo_AcceptancePointer{ + AcceptancePointer: &ptr, + }, + } + } + return &persistencespb.UpdateInfo{ + Value: &persistencespb.UpdateInfo_CompletedPointer{ + CompletedPointer: &ptr, + }, + } +} + func RandomStringPayloadMap() map[string]*commonpb.Payload { return map[string]*commonpb.Payload{ uuid.New().String(): RandomPayload(), diff --git a/proto/internal/temporal/server/api/history/v1/message.proto b/proto/internal/temporal/server/api/history/v1/message.proto index 2fbc94a8955..a6c0553b036 100644 --- a/proto/internal/temporal/server/api/history/v1/message.proto +++ b/proto/internal/temporal/server/api/history/v1/message.proto @@ -65,3 +65,7 @@ message TaskRange { TaskKey inclusive_min_task_key = 1; TaskKey exclusive_max_task_key = 2; } + +message HistoryEventPointer { + int64 event_id = 1; +} diff --git a/proto/internal/temporal/server/api/persistence/v1/executions.proto b/proto/internal/temporal/server/api/persistence/v1/executions.proto index 5f1abb07817..8970c01cf45 100644 --- a/proto/internal/temporal/server/api/persistence/v1/executions.proto +++ b/proto/internal/temporal/server/api/persistence/v1/executions.proto @@ -358,3 +358,12 @@ message Checksum { temporal.server.api.enums.v1.ChecksumFlavor flavor = 2; bytes value = 3; } + +message UpdateInfo { + oneof value { + // update has been accepted and this is the pointer to the accepted event + temporal.server.api.history.v1.HistoryEventPointer acceptance_pointer = 1; + // update has been completed and this is the pointer to the completion event + temporal.server.api.history.v1.HistoryEventPointer completed_pointer = 2; + } +} diff --git a/proto/internal/temporal/server/api/persistence/v1/workflow_mutable_state.proto b/proto/internal/temporal/server/api/persistence/v1/workflow_mutable_state.proto index 1902b5279e0..04d4b71f2e2 100644 --- a/proto/internal/temporal/server/api/persistence/v1/workflow_mutable_state.proto +++ b/proto/internal/temporal/server/api/persistence/v1/workflow_mutable_state.proto @@ -38,4 +38,6 @@ message WorkflowMutableState{ int64 next_event_id = 9; repeated temporal.api.history.v1.HistoryEvent buffered_events = 10; Checksum checksum = 11; + // map key here is UpdateID + map update_infos = 12; } diff --git a/schema/cassandra/temporal/schema.cql b/schema/cassandra/temporal/schema.cql index 71925e64d21..923b07fcc89 100644 --- a/schema/cassandra/temporal/schema.cql +++ b/schema/cassandra/temporal/schema.cql @@ -41,6 +41,8 @@ CREATE TABLE executions ( request_cancel_map_encoding text, signal_map map, signal_map_encoding text, + update_info_map map, + update_info_map_encoding text, signal_requested set, buffered_events_list list>, workflow_last_write_version bigint, diff --git a/schema/cassandra/temporal/versioned/v1.8/executions.cql b/schema/cassandra/temporal/versioned/v1.8/executions.cql new file mode 100644 index 00000000000..e7cc28dc584 --- /dev/null +++ b/schema/cassandra/temporal/versioned/v1.8/executions.cql @@ -0,0 +1,2 @@ +ALTER TABLE executions ADD update_info_map map; +ALTER TABLE executions add update_info_map_encoding text; diff --git a/schema/cassandra/temporal/versioned/v1.8/manifest.json b/schema/cassandra/temporal/versioned/v1.8/manifest.json new file mode 100644 index 00000000000..9075fa691e0 --- /dev/null +++ b/schema/cassandra/temporal/versioned/v1.8/manifest.json @@ -0,0 +1,8 @@ +{ + "CurrVersion": "1.8", + "MinCompatibleVersion": "1.0", + "Description": "add storage for update records", + "SchemaUpdateCqlFiles": [ + "executions.cql" + ] +} diff --git a/schema/cassandra/version.go b/schema/cassandra/version.go index 554a24da6a6..934f4c0c6f0 100644 --- a/schema/cassandra/version.go +++ b/schema/cassandra/version.go @@ -27,7 +27,7 @@ package cassandra // NOTE: whenever there is a new database schema update, plz update the following versions // Version is the Cassandra database release version -const Version = "1.7" +const Version = "1.8" // VisibilityVersion is the Cassandra visibility database release version const VisibilityVersion = "1.0" diff --git a/schema/mysql/v57/temporal/schema.sql b/schema/mysql/v57/temporal/schema.sql index 297423311eb..5777f54efab 100644 --- a/schema/mysql/v57/temporal/schema.sql +++ b/schema/mysql/v57/temporal/schema.sql @@ -228,6 +228,19 @@ CREATE TABLE signals_requested_sets ( PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, signal_id) ); +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INT NOT NULL, + namespace_id BINARY(16) NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BINARY(16) NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data MEDIUMBLOB NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); + -- history eventsV2: history_node stores history event data CREATE TABLE history_node ( shard_id INT NOT NULL, diff --git a/schema/mysql/v57/temporal/versioned/v1.10/manifest.json b/schema/mysql/v57/temporal/versioned/v1.10/manifest.json new file mode 100644 index 00000000000..f9040ac8fd6 --- /dev/null +++ b/schema/mysql/v57/temporal/versioned/v1.10/manifest.json @@ -0,0 +1,8 @@ +{ + "CurrVersion": "1.10", + "MinCompatibleVersion": "1.0", + "Description": "add storage for update records", + "SchemaUpdateCqlFiles": [ + "update_info_maps_table.sql" + ] +} diff --git a/schema/mysql/v57/temporal/versioned/v1.10/update_info_maps_table.sql b/schema/mysql/v57/temporal/versioned/v1.10/update_info_maps_table.sql new file mode 100644 index 00000000000..5f6e59bf38f --- /dev/null +++ b/schema/mysql/v57/temporal/versioned/v1.10/update_info_maps_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INT NOT NULL, + namespace_id BINARY(16) NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BINARY(16) NOT NULL, + updat_id VARCHAR(255) NOT NULL, +-- + data MEDIUMBLOB NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); diff --git a/schema/mysql/v8/temporal/schema.sql b/schema/mysql/v8/temporal/schema.sql index 3e4b8dd4170..17d6f419fb5 100644 --- a/schema/mysql/v8/temporal/schema.sql +++ b/schema/mysql/v8/temporal/schema.sql @@ -228,6 +228,19 @@ CREATE TABLE signals_requested_sets ( PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, signal_id) ); +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INT NOT NULL, + namespace_id BINARY(16) NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BINARY(16) NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data MEDIUMBLOB NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); + -- history eventsV2: history_node stores history event data CREATE TABLE history_node ( shard_id INT NOT NULL, diff --git a/schema/mysql/v8/temporal/versioned/v1.10/manifest.json b/schema/mysql/v8/temporal/versioned/v1.10/manifest.json new file mode 100644 index 00000000000..f9040ac8fd6 --- /dev/null +++ b/schema/mysql/v8/temporal/versioned/v1.10/manifest.json @@ -0,0 +1,8 @@ +{ + "CurrVersion": "1.10", + "MinCompatibleVersion": "1.0", + "Description": "add storage for update records", + "SchemaUpdateCqlFiles": [ + "update_info_maps_table.sql" + ] +} diff --git a/schema/mysql/v8/temporal/versioned/v1.10/update_info_maps_table.sql b/schema/mysql/v8/temporal/versioned/v1.10/update_info_maps_table.sql new file mode 100644 index 00000000000..5f6e59bf38f --- /dev/null +++ b/schema/mysql/v8/temporal/versioned/v1.10/update_info_maps_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INT NOT NULL, + namespace_id BINARY(16) NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BINARY(16) NOT NULL, + updat_id VARCHAR(255) NOT NULL, +-- + data MEDIUMBLOB NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); diff --git a/schema/postgresql/v12/temporal/schema.sql b/schema/postgresql/v12/temporal/schema.sql index 765e9e32e21..c2a3f35cd44 100644 --- a/schema/postgresql/v12/temporal/schema.sql +++ b/schema/postgresql/v12/temporal/schema.sql @@ -228,6 +228,19 @@ CREATE TABLE signals_requested_sets ( PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, signal_id) ); +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INTEGER NOT NULL, + namespace_id BYTEA NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BYTEA NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data BYTEA NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); + -- history eventsV2: history_node stores history event data CREATE TABLE history_node ( shard_id INTEGER NOT NULL, @@ -295,4 +308,4 @@ CREATE UNIQUE INDEX cm_idx_rolehost ON cluster_membership (role, host_id); CREATE INDEX cm_idx_rolelasthb ON cluster_membership (role, last_heartbeat); CREATE INDEX cm_idx_rpchost ON cluster_membership (rpc_address, role); CREATE INDEX cm_idx_lasthb ON cluster_membership (last_heartbeat); -CREATE INDEX cm_idx_recordexpiry ON cluster_membership (record_expiry); \ No newline at end of file +CREATE INDEX cm_idx_recordexpiry ON cluster_membership (record_expiry); diff --git a/schema/postgresql/v12/temporal/versioned/v1.10/manifest.json b/schema/postgresql/v12/temporal/versioned/v1.10/manifest.json new file mode 100644 index 00000000000..f9040ac8fd6 --- /dev/null +++ b/schema/postgresql/v12/temporal/versioned/v1.10/manifest.json @@ -0,0 +1,8 @@ +{ + "CurrVersion": "1.10", + "MinCompatibleVersion": "1.0", + "Description": "add storage for update records", + "SchemaUpdateCqlFiles": [ + "update_info_maps_table.sql" + ] +} diff --git a/schema/postgresql/v12/temporal/versioned/v1.10/update_info_maps_table.sql b/schema/postgresql/v12/temporal/versioned/v1.10/update_info_maps_table.sql new file mode 100644 index 00000000000..9de45d8d447 --- /dev/null +++ b/schema/postgresql/v12/temporal/versioned/v1.10/update_info_maps_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INTEGER NOT NULL, + namespace_id BYTEA NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BYTEA NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data BYTEA NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); diff --git a/schema/postgresql/v12/version.go b/schema/postgresql/v12/version.go index 96aa84baae7..2fee48a67d3 100644 --- a/schema/postgresql/v12/version.go +++ b/schema/postgresql/v12/version.go @@ -28,7 +28,7 @@ package v12 // Version is the Postgres database release version // Temporal supports both MySQL and Postgres officially, so upgrade should be performed for both MySQL and Postgres -const Version = "1.9" +const Version = "1.10" // VisibilityVersion is the Postgres visibility database release version // Temporal supports both MySQL and Postgres officially, so upgrade should be performed for both MySQL and Postgres diff --git a/schema/postgresql/v96/temporal/schema.sql b/schema/postgresql/v96/temporal/schema.sql index 765e9e32e21..c2a3f35cd44 100644 --- a/schema/postgresql/v96/temporal/schema.sql +++ b/schema/postgresql/v96/temporal/schema.sql @@ -228,6 +228,19 @@ CREATE TABLE signals_requested_sets ( PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, signal_id) ); +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INTEGER NOT NULL, + namespace_id BYTEA NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BYTEA NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data BYTEA NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); + -- history eventsV2: history_node stores history event data CREATE TABLE history_node ( shard_id INTEGER NOT NULL, @@ -295,4 +308,4 @@ CREATE UNIQUE INDEX cm_idx_rolehost ON cluster_membership (role, host_id); CREATE INDEX cm_idx_rolelasthb ON cluster_membership (role, last_heartbeat); CREATE INDEX cm_idx_rpchost ON cluster_membership (rpc_address, role); CREATE INDEX cm_idx_lasthb ON cluster_membership (last_heartbeat); -CREATE INDEX cm_idx_recordexpiry ON cluster_membership (record_expiry); \ No newline at end of file +CREATE INDEX cm_idx_recordexpiry ON cluster_membership (record_expiry); diff --git a/schema/postgresql/v96/temporal/versioned/v1.10/manifest.json b/schema/postgresql/v96/temporal/versioned/v1.10/manifest.json new file mode 100644 index 00000000000..f9040ac8fd6 --- /dev/null +++ b/schema/postgresql/v96/temporal/versioned/v1.10/manifest.json @@ -0,0 +1,8 @@ +{ + "CurrVersion": "1.10", + "MinCompatibleVersion": "1.0", + "Description": "add storage for update records", + "SchemaUpdateCqlFiles": [ + "update_info_maps_table.sql" + ] +} diff --git a/schema/postgresql/v96/temporal/versioned/v1.10/update_info_maps_table.sql b/schema/postgresql/v96/temporal/versioned/v1.10/update_info_maps_table.sql new file mode 100644 index 00000000000..9de45d8d447 --- /dev/null +++ b/schema/postgresql/v96/temporal/versioned/v1.10/update_info_maps_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE update_info_maps ( +-- each row corresponds to one key of one map + shard_id INTEGER NOT NULL, + namespace_id BYTEA NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BYTEA NOT NULL, + update_id VARCHAR(255) NOT NULL, +-- + data BYTEA NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); diff --git a/schema/postgresql/v96/version.go b/schema/postgresql/v96/version.go index 9172a5a9e1e..84387c62df3 100644 --- a/schema/postgresql/v96/version.go +++ b/schema/postgresql/v96/version.go @@ -28,7 +28,7 @@ package v96 // Version is the Postgres database release version // Temporal supports both MySQL and Postgres officially, so upgrade should be performed for both MySQL and Postgres -const Version = "1.9" +const Version = "1.10" // VisibilityVersion is the Postgres visibility database release version // Temporal supports both MySQL and Postgres officially, so upgrade should be performed for both MySQL and Postgres diff --git a/schema/sqlite/v3/temporal/schema.sql b/schema/sqlite/v3/temporal/schema.sql index bd0344cdfab..940ae6fd6e9 100644 --- a/schema/sqlite/v3/temporal/schema.sql +++ b/schema/sqlite/v3/temporal/schema.sql @@ -193,6 +193,18 @@ CREATE TABLE child_execution_info_maps ( PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, initiated_id) ); +CREATE TABLE update_info_maps ( + shard_id INT NOT NULL, + namespace_id BINARY(16) NOT NULL, + workflow_id VARCHAR(255) NOT NULL, + run_id BINARY(16) NOT NULL, + update_id VARCHAR(255), +-- + data MEDIUMBLOB NOT NULL, + data_encoding VARCHAR(16), + PRIMARY KEY (shard_id, namespace_id, workflow_id, run_id, update_id) +); + CREATE TABLE request_cancel_info_maps ( shard_id INT NOT NULL, namespace_id BINARY(16) NOT NULL, diff --git a/service/history/workflow/mutable_state.go b/service/history/workflow/mutable_state.go index 7cdabfe459b..01ab44fc2ec 100644 --- a/service/history/workflow/mutable_state.go +++ b/service/history/workflow/mutable_state.go @@ -157,6 +157,7 @@ type ( DeleteWorkflowTask() DeleteSignalRequested(requestID string) FlushBufferedEvents() + GetAcceptedWorkflowExecutionUpdateIDs(context.Context) ([]string, error) GetWorkflowKey() definition.WorkflowKey GetActivityByActivityID(string) (*persistencespb.ActivityInfo, bool) GetActivityInfo(int64) (*persistencespb.ActivityInfo, bool) @@ -198,6 +199,7 @@ type ( GetWorkflowStateStatus() (enumsspb.WorkflowExecutionState, enumspb.WorkflowExecutionStatus) GetQueryRegistry() QueryRegistry GetBaseWorkflowInfo() *workflowspb.BaseExecutionInfo + GetUpdateOutcome(ctx context.Context, updateID string) (*updatepb.Outcome, error) IsTransientWorkflowTask() bool ClearTransientWorkflowTask() error HasBufferedEvents() bool @@ -257,6 +259,8 @@ type ( ReplicateWorkflowExecutionStartedEvent(*clockspb.VectorClock, commonpb.WorkflowExecution, string, *historypb.HistoryEvent) error ReplicateWorkflowExecutionTerminatedEvent(int64, *historypb.HistoryEvent) error ReplicateWorkflowExecutionTimedoutEvent(int64, *historypb.HistoryEvent) error + ReplicateWorkflowExecutionUpdateAcceptedEvent(*historypb.HistoryEvent) error + ReplicateWorkflowExecutionUpdateCompletedEvent(*historypb.HistoryEvent) error SetCurrentBranchToken(branchToken []byte) error SetHistoryBuilder(hBuilder *HistoryBuilder) SetHistoryTree(ctx context.Context, executionTimeout *time.Duration, runTimeout *time.Duration, treeID string) error diff --git a/service/history/workflow/mutable_state_impl.go b/service/history/workflow/mutable_state_impl.go index fdacc08fcc2..e1fc9b25ab2 100644 --- a/service/history/workflow/mutable_state_impl.go +++ b/service/history/workflow/mutable_state_impl.go @@ -133,6 +133,8 @@ type ( updateSignalRequestedIDs map[string]struct{} // Set of signaled requestIds since last update deleteSignalRequestedIDs map[string]struct{} // Deleted signaled requestId + updateInfos map[string]*persistencespb.UpdateInfo + executionInfo *persistencespb.WorkflowExecutionInfo // Workflow mutable state info. executionState *persistencespb.WorkflowExecutionState @@ -218,6 +220,8 @@ func NewMutableState( pendingSignalRequestedIDs: make(map[string]struct{}), deleteSignalRequestedIDs: make(map[string]struct{}), + updateInfos: make(map[string]*persistencespb.UpdateInfo), + currentVersion: namespaceEntry.FailoverVersion(), bufferEventsInDB: nil, stateInDB: enumsspb.WORKFLOW_EXECUTION_STATE_VOID, @@ -313,6 +317,10 @@ func newMutableStateFromDB( mutableState.pendingSignalInfoIDs = dbRecord.SignalInfos } + if dbRecord.UpdateInfos != nil { + mutableState.updateInfos = dbRecord.UpdateInfos + } + mutableState.pendingSignalRequestedIDs = convert.StringSliceToSet(dbRecord.SignalRequestedIds) mutableState.executionState = dbRecord.ExecutionState mutableState.executionInfo = dbRecord.ExecutionInfo @@ -393,6 +401,7 @@ func (ms *MutableStateImpl) CloneToProto() *persistencespb.WorkflowMutableState NextEventId: ms.hBuilder.NextEventID(), BufferedEvents: ms.bufferEventsInDB, Checksum: ms.checksum, + UpdateInfos: ms.updateInfos, } return common.CloneProto(msProto) @@ -649,6 +658,41 @@ func (ms *MutableStateImpl) GetQueryRegistry() QueryRegistry { return ms.QueryRegistry } +func (ms *MutableStateImpl) GetUpdateOutcome( + ctx context.Context, + updateID string, +) (*updatepb.Outcome, error) { + rec, ok := ms.updateInfos[updateID] + if !ok { + return nil, serviceerror.NewNotFound("update not found") + } + compPtr := rec.GetCompletedPointer() + if compPtr == nil { + // not an error because update was found, but update has not completed + return nil, nil + } + currentBranchToken, version, err := ms.getCurrentBranchTokenAndEventVersion(compPtr.EventId) + if err != nil { + return nil, err + } + eventKey := events.EventKey{ + NamespaceID: namespace.ID(ms.executionInfo.NamespaceId), + WorkflowID: ms.executionInfo.WorkflowId, + RunID: ms.executionState.RunId, + EventID: compPtr.EventId, + Version: version, + } + event, err := ms.eventsCache.GetEvent(ctx, eventKey, compPtr.EventId-1, currentBranchToken) + if err != nil { + return nil, err + } + attrs := event.GetWorkflowExecutionUpdateCompletedEventAttributes() + if attrs == nil { + return nil, serviceerror.NewInternal("event pointer does not reference an update completed event") + } + return attrs.GetOutcome(), nil +} + func (ms *MutableStateImpl) GetActivityScheduledEvent( ctx context.Context, scheduledEventID int64, @@ -1054,6 +1098,8 @@ func (ms *MutableStateImpl) writeEventToCache( // load it from database // For completion event: store it within events cache so we can communicate the result to parent execution // during the processing of DeleteTransferTask without loading this event from database + // For Update Accepted/Completed event: store it in here so that Update + // disposition lookups can be fast ms.eventsCache.PutEvent( events.EventKey{ NamespaceID: namespace.ID(ms.executionInfo.NamespaceId), @@ -3193,21 +3239,67 @@ func (ms *MutableStateImpl) AddWorkflowExecutionUpdateAcceptedEvent(protocolInst return nil, err } event := ms.hBuilder.AddWorkflowExecutionUpdateAcceptedEvent(protocolInstanceID, updAcceptance) - // TODO (alex-update): Async workflow update will require ReplicateWorkflowExecutionUpdateAcceptedEvent - // which restores update in the registry if it is not there. + if err := ms.ReplicateWorkflowExecutionUpdateAcceptedEvent(event); err != nil { + return nil, err + } return event, nil } +func (ms *MutableStateImpl) ReplicateWorkflowExecutionUpdateAcceptedEvent( + event *historypb.HistoryEvent, +) error { + attrs := event.GetWorkflowExecutionUpdateAcceptedEventAttributes() + if attrs == nil { + return serviceerror.NewInternal("wrong event type in call to ReplicateworkflowExecutionUpdateAcceptedEvent") + } + ms.updateInfos[attrs.GetAcceptedRequest().GetMeta().GetUpdateId()] = &persistencespb.UpdateInfo{ + Value: &persistencespb.UpdateInfo_AcceptancePointer{ + AcceptancePointer: &historyspb.HistoryEventPointer{EventId: event.GetEventId()}, + }, + } + ms.writeEventToCache(event) + return nil +} + func (ms *MutableStateImpl) AddWorkflowExecutionUpdateCompletedEvent(updResp *updatepb.Response) (*historypb.HistoryEvent, error) { if err := ms.checkMutability(tag.WorkflowActionUpdateCompleted); err != nil { return nil, err } event := ms.hBuilder.AddWorkflowExecutionUpdateCompletedEvent(updResp) - // TODO (alex-update): Async workflow update will require ReplicateWorkflowExecutionUpdateCompletedEvent - // which removes it from registry and notify update result pollers. + if err := ms.ReplicateWorkflowExecutionUpdateCompletedEvent(event); err != nil { + return nil, err + } return event, nil } +func (ms *MutableStateImpl) GetAcceptedWorkflowExecutionUpdateIDs( + ctx context.Context, +) ([]string, error) { + out := make([]string, 0) + for id, updateInfo := range ms.updateInfos { + if updateInfo.GetAcceptancePointer() != nil { + out = append(out, id) + } + } + return out, nil +} + +func (ms *MutableStateImpl) ReplicateWorkflowExecutionUpdateCompletedEvent( + event *historypb.HistoryEvent, +) error { + attrs := event.GetWorkflowExecutionUpdateCompletedEventAttributes() + if attrs == nil { + return serviceerror.NewInternal("wrong event type in call to ReplicateworkflowExecutionUpdateCompletedEvent") + } + ms.updateInfos[attrs.GetMeta().GetUpdateId()] = &persistencespb.UpdateInfo{ + Value: &persistencespb.UpdateInfo_CompletedPointer{ + CompletedPointer: &historyspb.HistoryEventPointer{EventId: event.GetEventId()}, + }, + } + ms.writeEventToCache(event) + return nil +} + func (ms *MutableStateImpl) RejectWorkflowExecutionUpdate(_ string, _ *updatepb.Rejection) error { // TODO (alex-update): This method is noop because we don't currently write rejections to the history. return nil @@ -4076,6 +4168,7 @@ func (ms *MutableStateImpl) CloseTransactionAsSnapshot( RequestCancelInfos: ms.pendingRequestCancelInfoIDs, SignalInfos: ms.pendingSignalInfoIDs, SignalRequestedIDs: ms.pendingSignalRequestedIDs, + UpdateInfos: ms.updateInfos, Tasks: ms.InsertTasks, diff --git a/service/history/workflow/mutable_state_impl_test.go b/service/history/workflow/mutable_state_impl_test.go index e2ef50e1e38..12c9d93c5ea 100644 --- a/service/history/workflow/mutable_state_impl_test.go +++ b/service/history/workflow/mutable_state_impl_test.go @@ -25,6 +25,9 @@ package workflow import ( + "context" + "fmt" + "math" "testing" "time" @@ -37,7 +40,9 @@ import ( commonpb "go.temporal.io/api/common/v1" enumspb "go.temporal.io/api/enums/v1" historypb "go.temporal.io/api/history/v1" + "go.temporal.io/api/serviceerror" taskqueuepb "go.temporal.io/api/taskqueue/v1" + updatepb "go.temporal.io/api/update/v1" "go.temporal.io/server/api/clock/v1" enumsspb "go.temporal.io/server/api/enums/v1" @@ -711,7 +716,7 @@ func (s *mutableStateSuite) buildWorkflowMutableState() *persistencespb.Workflow { BranchToken: []byte("token#1"), Items: []*historyspb.VersionHistoryItem{ - {EventId: 1, Version: 300}, + {EventId: math.MaxInt64, Version: 300}, }, }, }, @@ -799,6 +804,67 @@ func (s *mutableStateSuite) buildWorkflowMutableState() *persistencespb.Workflow } } +func (s *mutableStateSuite) TestUpdateInfos() { + cacheStore := map[events.EventKey]*historypb.HistoryEvent{} + dbstate := s.buildWorkflowMutableState() + var err error + s.mutableState, err = newMutableStateFromDB( + s.mockShard, + NewMapEventCache(s.T(), cacheStore), + s.logger, + tests.LocalNamespaceEntry, + dbstate, + 123, + ) + s.NoError(err) + err = s.mutableState.UpdateCurrentVersion( + dbstate.ExecutionInfo.VersionHistories.Histories[0].Items[0].Version, false) + s.Require().NoError(err) + + acceptedUpdateID := s.T().Name() + "-accepted-update-id" + acceptedMsgID := s.T().Name() + "-accepted-msg-id" + for i := 0; i < 2; i++ { + updateID := fmt.Sprintf("%s-%d", acceptedUpdateID, i) + _, err := s.mutableState.AddWorkflowExecutionUpdateAcceptedEvent( + updateID, + &updatepb.Acceptance{ + AcceptedRequestMessageId: fmt.Sprintf("%s-%d", acceptedMsgID, i), + AcceptedRequestSequencingEventId: 1, + AcceptedRequest: &updatepb.Request{ + Meta: &updatepb.Meta{UpdateId: updateID}, + }, + }, + ) + s.Require().NoError(err) + } + completedUpdateID := s.T().Name() + "-completed-update-id" + completedOutcome := &updatepb.Outcome{ + Value: &updatepb.Outcome_Success{Success: testPayloads}, + } + _, err = s.mutableState.AddWorkflowExecutionUpdateCompletedEvent( + &updatepb.Response{ + Meta: &updatepb.Meta{UpdateId: completedUpdateID}, + Outcome: completedOutcome, + }, + ) + s.Require().NoError(err) + + // should now have one completed update and two accepted in MS + s.Require().Len(cacheStore, 3) + + outcome, err := s.mutableState.GetUpdateOutcome(context.TODO(), completedUpdateID) + s.Require().NoError(err) + s.Require().Equal(completedOutcome, outcome) + + _, err = s.mutableState.GetUpdateOutcome(context.TODO(), "not_an_update_id") + s.Require().Error(err) + s.Require().IsType((*serviceerror.NotFound)(nil), err) + + incompletes, err := s.mutableState.GetAcceptedWorkflowExecutionUpdateIDs(context.TODO()) + s.Require().NoError(err) + s.Require().Len(incompletes, 2) +} + func (s *mutableStateSuite) TestReplicateActivityTaskStartedEvent() { state := s.buildWorkflowMutableState() diff --git a/service/history/workflow/mutable_state_mock.go b/service/history/workflow/mutable_state_mock.go index 65aa1cf6b6d..d2d6899fb3a 100644 --- a/service/history/workflow/mutable_state_mock.go +++ b/service/history/workflow/mutable_state_mock.go @@ -970,6 +970,21 @@ func (mr *MockMutableStateMockRecorder) GenerateMigrationTasks() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateMigrationTasks", reflect.TypeOf((*MockMutableState)(nil).GenerateMigrationTasks)) } +// GetAcceptedWorkflowExecutionUpdateIDs mocks base method. +func (m *MockMutableState) GetAcceptedWorkflowExecutionUpdateIDs(arg0 context.Context) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAcceptedWorkflowExecutionUpdateIDs", arg0) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAcceptedWorkflowExecutionUpdateIDs indicates an expected call of GetAcceptedWorkflowExecutionUpdateIDs. +func (mr *MockMutableStateMockRecorder) GetAcceptedWorkflowExecutionUpdateIDs(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAcceptedWorkflowExecutionUpdateIDs", reflect.TypeOf((*MockMutableState)(nil).GetAcceptedWorkflowExecutionUpdateIDs), arg0) +} + // GetActivityByActivityID mocks base method. func (m *MockMutableState) GetActivityByActivityID(arg0 string) (*v112.ActivityInfo, bool) { m.ctrl.T.Helper() @@ -1494,6 +1509,21 @@ func (mr *MockMutableStateMockRecorder) GetUpdateCondition() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUpdateCondition", reflect.TypeOf((*MockMutableState)(nil).GetUpdateCondition)) } +// GetUpdateOutcome mocks base method. +func (m *MockMutableState) GetUpdateOutcome(ctx context.Context, updateID string) (*v15.Outcome, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUpdateOutcome", ctx, updateID) + ret0, _ := ret[0].(*v15.Outcome) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUpdateOutcome indicates an expected call of GetUpdateOutcome. +func (mr *MockMutableStateMockRecorder) GetUpdateOutcome(ctx, updateID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUpdateOutcome", reflect.TypeOf((*MockMutableState)(nil).GetUpdateOutcome), ctx, updateID) +} + // GetUserTimerInfo mocks base method. func (m *MockMutableState) GetUserTimerInfo(arg0 string) (*v112.TimerInfo, bool) { m.ctrl.T.Helper() @@ -2328,6 +2358,34 @@ func (mr *MockMutableStateMockRecorder) ReplicateWorkflowExecutionTimedoutEvent( return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplicateWorkflowExecutionTimedoutEvent", reflect.TypeOf((*MockMutableState)(nil).ReplicateWorkflowExecutionTimedoutEvent), arg0, arg1) } +// ReplicateWorkflowExecutionUpdateAcceptedEvent mocks base method. +func (m *MockMutableState) ReplicateWorkflowExecutionUpdateAcceptedEvent(arg0 *v13.HistoryEvent) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplicateWorkflowExecutionUpdateAcceptedEvent", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReplicateWorkflowExecutionUpdateAcceptedEvent indicates an expected call of ReplicateWorkflowExecutionUpdateAcceptedEvent. +func (mr *MockMutableStateMockRecorder) ReplicateWorkflowExecutionUpdateAcceptedEvent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplicateWorkflowExecutionUpdateAcceptedEvent", reflect.TypeOf((*MockMutableState)(nil).ReplicateWorkflowExecutionUpdateAcceptedEvent), arg0) +} + +// ReplicateWorkflowExecutionUpdateCompletedEvent mocks base method. +func (m *MockMutableState) ReplicateWorkflowExecutionUpdateCompletedEvent(arg0 *v13.HistoryEvent) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplicateWorkflowExecutionUpdateCompletedEvent", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// ReplicateWorkflowExecutionUpdateCompletedEvent indicates an expected call of ReplicateWorkflowExecutionUpdateCompletedEvent. +func (mr *MockMutableStateMockRecorder) ReplicateWorkflowExecutionUpdateCompletedEvent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplicateWorkflowExecutionUpdateCompletedEvent", reflect.TypeOf((*MockMutableState)(nil).ReplicateWorkflowExecutionUpdateCompletedEvent), arg0) +} + // ReplicateWorkflowPropertiesModifiedEvent mocks base method. func (m *MockMutableState) ReplicateWorkflowPropertiesModifiedEvent(arg0 *v13.HistoryEvent) { m.ctrl.T.Helper() diff --git a/service/history/workflow/mutable_state_rebuilder.go b/service/history/workflow/mutable_state_rebuilder.go index 7581b8988eb..319410aef18 100644 --- a/service/history/workflow/mutable_state_rebuilder.go +++ b/service/history/workflow/mutable_state_rebuilder.go @@ -674,14 +674,15 @@ func (b *MutableStateRebuilderImpl) applyEvents( return nil, err } - case enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED, - enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED, - enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: - // TODO (alex-update): Async workflow update might require update to be restored in registry from Accepted event. - // Completed event will remove it from registry and notify update result pollers. - // For now, there is nothing to modify in mutable state and there are no tasks to generate for those events. - - return nil, nil + case enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED: + case enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED: + if err := b.mutableState.ReplicateWorkflowExecutionUpdateAcceptedEvent(event); err != nil { + return nil, err + } + case enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: + if err := b.mutableState.ReplicateWorkflowExecutionUpdateCompletedEvent(event); err != nil { + return nil, err + } case enumspb.EVENT_TYPE_ACTIVITY_PROPERTIES_MODIFIED_EXTERNALLY, enumspb.EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED_EXTERNALLY: diff --git a/service/history/workflow/mutable_state_rebuilder_test.go b/service/history/workflow/mutable_state_rebuilder_test.go index bb63553dcaf..bd345f0e8d7 100644 --- a/service/history/workflow/mutable_state_rebuilder_test.go +++ b/service/history/workflow/mutable_state_rebuilder_test.go @@ -1789,16 +1789,66 @@ func (s *stateBuilderSuite) TestApplyEvents_EventTypeExternalWorkflowExecutionSi s.Equal(event.TaskId, s.executionInfo.LastEventTaskId) } -func (s *stateBuilderSuite) TestApplyEventsNewEventsNotHandled() { - eventTypes := enumspb.EventType_value - s.Equal( - 47, - len(eventTypes), - "If you see this error, you are adding new event type. Before updating "+ - "the number to make this test pass, please make sure you update "+ - "`MutableStateRebuilderImpl.ApplyEvents` method to handle the new "+ - "command type. Otherwise cross dc will not work on the new event.", - ) +func (s *stateBuilderSuite) TestApplyEvents_EventTypeWorkflowExecutionUpdateAccepted() { + version := int64(1) + requestID := uuid.New() + + execution := commonpb.WorkflowExecution{ + WorkflowId: "some random workflow ID", + RunId: tests.RunID, + } + + now := time.Now().UTC() + evenType := enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED + event := &historypb.HistoryEvent{ + TaskId: rand.Int63(), + Version: version, + EventId: 130, + EventTime: &now, + EventType: evenType, + Attributes: &historypb.HistoryEvent_WorkflowExecutionUpdateAcceptedEventAttributes{ + WorkflowExecutionUpdateAcceptedEventAttributes: &historypb.WorkflowExecutionUpdateAcceptedEventAttributes{ + ProtocolInstanceId: s.T().Name(), + }, + }, + } + s.mockMutableState.EXPECT().ReplicateWorkflowExecutionUpdateAcceptedEvent(event).Return(nil) + s.mockUpdateVersion(event) + s.mockMutableState.EXPECT().ClearStickyness() + + _, err := s.stateRebuilder.ApplyEvents(context.Background(), tests.NamespaceID, requestID, execution, s.toHistory(event), nil) + s.NoError(err) + s.Equal(event.TaskId, s.executionInfo.LastEventTaskId) +} + +func (s *stateBuilderSuite) TestApplyEvents_EventTypeWorkflowExecutionUpdateCompleted() { + version := int64(1) + requestID := uuid.New() + + execution := commonpb.WorkflowExecution{ + WorkflowId: "some random workflow ID", + RunId: tests.RunID, + } + + now := time.Now().UTC() + evenType := enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED + event := &historypb.HistoryEvent{ + TaskId: rand.Int63(), + Version: version, + EventId: 130, + EventTime: &now, + EventType: evenType, + Attributes: &historypb.HistoryEvent_WorkflowExecutionUpdateCompletedEventAttributes{ + WorkflowExecutionUpdateCompletedEventAttributes: &historypb.WorkflowExecutionUpdateCompletedEventAttributes{}, + }, + } + s.mockMutableState.EXPECT().ReplicateWorkflowExecutionUpdateCompletedEvent(event).Return(nil) + s.mockUpdateVersion(event) + s.mockMutableState.EXPECT().ClearStickyness() + + _, err := s.stateRebuilder.ApplyEvents(context.Background(), tests.NamespaceID, requestID, execution, s.toHistory(event), nil) + s.NoError(err) + s.Equal(event.TaskId, s.executionInfo.LastEventTaskId) } func (p *testTaskGeneratorProvider) NewTaskGenerator( diff --git a/service/history/workflow/test_util.go b/service/history/workflow/test_util.go index 0ac878b198f..825e0120acb 100644 --- a/service/history/workflow/test_util.go +++ b/service/history/workflow/test_util.go @@ -26,8 +26,13 @@ package workflow import ( "context" + "fmt" + "testing" "time" + "github.com/golang/mock/gomock" + historypb "go.temporal.io/api/history/v1" + "go.temporal.io/api/serviceerror" persistencespb "go.temporal.io/server/api/persistence/v1" "go.temporal.io/server/common/log" "go.temporal.io/server/common/namespace" @@ -51,6 +56,38 @@ func TestLocalMutableState( return ms } +// NewMapEventCache is a functional event cache mock that wraps a simple Go map +func NewMapEventCache( + t *testing.T, + m map[events.EventKey]*historypb.HistoryEvent, +) events.Cache { + cache := events.NewMockCache(gomock.NewController(t)) + cache.EXPECT().DeleteEvent(gomock.Any()).AnyTimes().Do( + func(k events.EventKey) { delete(m, k) }, + ) + cache.EXPECT().PutEvent(gomock.Any(), gomock.Any()).AnyTimes().Do( + func(k events.EventKey, event *historypb.HistoryEvent) { + m[k] = event + }, + ) + cache.EXPECT().GetEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + AnyTimes(). + DoAndReturn( + func( + _ context.Context, + key events.EventKey, + _ int64, + _ []byte, + ) (*historypb.HistoryEvent, error) { + if event, ok := m[key]; ok { + return event, nil + } + return nil, serviceerror.NewNotFound(fmt.Sprintf("event %#v not found", key)) + }, + ) + return cache +} + func TestGlobalMutableState( shard shard.Context, eventsCache events.Cache,