From eebad762ce69a62ed68e6e1de4f8a4d3d46649ec Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Tue, 18 Jan 2022 11:54:12 -0800 Subject: [PATCH 1/7] Replace Cassandra visibility TTL with explicit DELETE --- .../visibility/manager/visibility_manager.go | 1 - .../visibility_persistence_suite_test.go | 73 +---------- .../standard/cassandra/visibility_store.go | 118 ++++++++++-------- .../visibility/store/visibility_store.go | 1 - .../visibility/visibility_manager_impl.go | 1 - .../history/visibilityQueueTaskExecutor.go | 49 +++----- 6 files changed, 89 insertions(+), 154 deletions(-) diff --git a/common/persistence/visibility/manager/visibility_manager.go b/common/persistence/visibility/manager/visibility_manager.go index 8cf713a0132..70f9b5f91e0 100644 --- a/common/persistence/visibility/manager/visibility_manager.go +++ b/common/persistence/visibility/manager/visibility_manager.go @@ -89,7 +89,6 @@ type ( *VisibilityRequestBase CloseTime time.Time HistoryLength int64 - Retention *time.Duration // not persisted, used for cassandra ttl } // UpsertWorkflowExecutionRequest is used to upsert workflow execution diff --git a/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go b/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go index 8d4e915c148..1a08072fdf3 100644 --- a/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go +++ b/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go @@ -33,13 +33,13 @@ import ( commonpb "go.temporal.io/api/common/v1" enumspb "go.temporal.io/api/enums/v1" workflowpb "go.temporal.io/api/workflow/v1" + "go.temporal.io/server/common/dynamicconfig" "go.temporal.io/server/common/log/tag" "go.temporal.io/server/common/metrics" "go.temporal.io/server/common/namespace" "go.temporal.io/server/common/payload" "go.temporal.io/server/common/persistence" - "go.temporal.io/server/common/persistence/cassandra" persistencetests "go.temporal.io/server/common/persistence/persistence-tests" "go.temporal.io/server/common/persistence/visibility" "go.temporal.io/server/common/persistence/visibility/manager" @@ -196,72 +196,6 @@ func (s *VisibilityPersistenceSuite) TestBasicVisibilityShortWorkflow() { s.assertClosedExecutionEquals(closedRecord, resp.Executions[0]) } -func (s *VisibilityPersistenceSuite) TestVisibilityRetention() { - if _, ok := s.DefaultTestCluster.(*cassandra.TestCluster); !ok { - return - } - - testNamespaceUUID := namespace.ID(uuid.New()) - - workflowExecution := commonpb.WorkflowExecution{ - WorkflowId: "visibility-workflow-test-visibility-retention", - RunId: "3c095198-0c33-4136-939a-c29fbbb6a802", - } - - startTime := time.Now().UTC().Add(-1 * time.Hour) - err0 := s.VisibilityMgr.RecordWorkflowExecutionStarted(&manager.RecordWorkflowExecutionStartedRequest{ - VisibilityRequestBase: &manager.VisibilityRequestBase{ - NamespaceID: testNamespaceUUID, - Execution: workflowExecution, - WorkflowTypeName: "visibility-workflow", - StartTime: startTime, - }, - }) - s.NoError(err0) - - retention := 1 * time.Second - err2 := s.VisibilityMgr.RecordWorkflowExecutionClosed(&manager.RecordWorkflowExecutionClosedRequest{ - VisibilityRequestBase: &manager.VisibilityRequestBase{ - NamespaceID: testNamespaceUUID, - Execution: workflowExecution, - WorkflowTypeName: "visibility-workflow", - StartTime: startTime, - }, - CloseTime: startTime.Add(1 * time.Minute), - Retention: &retention, - }) - s.NoError(err2) - - resp, err3 := s.VisibilityMgr.ListOpenWorkflowExecutions(&manager.ListWorkflowExecutionsRequest{ - NamespaceID: testNamespaceUUID, - PageSize: 1, - EarliestStartTime: startTime, - LatestStartTime: startTime, - }) - s.NoError(err3) - s.Equal(0, len(resp.Executions)) - - resp, err4 := s.VisibilityMgr.ListClosedWorkflowExecutions(&manager.ListWorkflowExecutionsRequest{ - NamespaceID: testNamespaceUUID, - PageSize: 1, - EarliestStartTime: startTime.Add(1 * time.Minute), // This is actually close_time - LatestStartTime: startTime.Add(1 * time.Minute), - }) - s.NoError(err4) - s.Equal(1, len(resp.Executions)) - - // Sleep for retention to fire. - time.Sleep(retention) - resp2, err5 := s.VisibilityMgr.ListClosedWorkflowExecutions(&manager.ListWorkflowExecutionsRequest{ - NamespaceID: testNamespaceUUID, - PageSize: 1, - EarliestStartTime: startTime.Add(1 * time.Minute), // This is actually close_time - LatestStartTime: startTime.Add(1 * time.Minute), - }) - s.NoError(err5) - s.Equal(0, len(resp2.Executions)) -} - // TestVisibilityPagination test func (s *VisibilityPersistenceSuite) TestVisibilityPagination() { testNamespaceUUID := namespace.ID(uuid.New()) @@ -572,10 +506,6 @@ func (s *VisibilityPersistenceSuite) TestFilteringByStatus() { // TestDelete test func (s *VisibilityPersistenceSuite) TestDelete() { - if s.VisibilityMgr.GetName() == "cassandra" { - // This test is not applicable for cassandra. - return - } nRows := 5 testNamespaceUUID := namespace.ID(uuid.New()) startTime := time.Now().UTC().Add(time.Second * -5) @@ -621,6 +551,7 @@ func (s *VisibilityPersistenceSuite) TestDelete() { for _, row := range resp.Executions { err4 := s.VisibilityMgr.DeleteWorkflowExecution(&manager.VisibilityDeleteWorkflowExecutionRequest{ NamespaceID: testNamespaceUUID, + WorkflowID: row.GetExecution().GetWorkflowId(), RunID: row.GetExecution().GetRunId(), }) s.Nil(err4) diff --git a/common/persistence/visibility/store/standard/cassandra/visibility_store.go b/common/persistence/visibility/store/standard/cassandra/visibility_store.go index c3e0827559b..1ef4cc9c676 100644 --- a/common/persistence/visibility/store/standard/cassandra/visibility_store.go +++ b/common/persistence/visibility/store/standard/cassandra/visibility_store.go @@ -28,6 +28,7 @@ import ( "time" enumspb "go.temporal.io/api/enums/v1" + "go.temporal.io/server/common/config" "go.temporal.io/server/common/log" "go.temporal.io/server/common/log/tag" @@ -42,9 +43,11 @@ import ( const ( namespacePartition = 0 cassandraPersistenceName = "cassandra" +) - // ref: https://docs.datastax.com/en/dse-trblshoot/doc/troubleshooting/recoveringTtlYear2038Problem.html - maxCassandraTTL = int64(315360000) // Cassandra max support time is 2038-01-19T03:14:06+00:00. Updated this to 10 years to support until year 2028 +var ( + minTime = time.Unix(0, 0).UTC() + maxTime = time.Date(2100, 1, 1, 1, 0, 0, 0, time.UTC) ) const ( @@ -58,14 +61,16 @@ const ( `AND start_time = ? ` + `AND run_id = ?` - templateCreateWorkflowExecutionClosedWithTTL = `INSERT INTO closed_executions (` + - `namespace_id, namespace_partition, workflow_id, run_id, start_time, execution_time, close_time, workflow_type_name, status, history_length, memo, encoding, task_queue) ` + - `VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) using TTL ?` - templateCreateWorkflowExecutionClosed = `INSERT INTO closed_executions (` + `namespace_id, namespace_partition, workflow_id, run_id, start_time, execution_time, close_time, workflow_type_name, status, history_length, memo, encoding, task_queue) ` + `VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` + templateDeleteWorkflowExecutionClosed = `DELETE FROM closed_executions ` + + `WHERE namespace_id = ? ` + + `AND namespace_partition = ? ` + + `AND close_time = ? ` + + `AND run_id = ?` + templateGetOpenWorkflowExecutions = `SELECT workflow_id, run_id, start_time, execution_time, workflow_type_name, memo, encoding, task_queue ` + `FROM open_executions ` + `WHERE namespace_id = ? ` + @@ -190,49 +195,21 @@ func (v *visibilityStore) RecordWorkflowExecutionClosed(request *store.InternalR ) // Next, add a row in the closed table. - - // Find how long to keep the row - var retentionSeconds int64 - if request.Retention != nil { - retentionSeconds = int64(request.Retention.Seconds()) - } else { - retentionSeconds = maxCassandraTTL + 1 - } - - if retentionSeconds > maxCassandraTTL { - batch.Query(templateCreateWorkflowExecutionClosed, - request.NamespaceID, - namespacePartition, - request.WorkflowID, - request.RunID, - persistence.UnixMilliseconds(request.StartTime), - persistence.UnixMilliseconds(request.ExecutionTime), - persistence.UnixMilliseconds(request.CloseTime), - request.WorkflowTypeName, - request.Status, - request.HistoryLength, - request.Memo.Data, - request.Memo.EncodingType.String(), - request.TaskQueue, - ) - } else { - batch.Query(templateCreateWorkflowExecutionClosedWithTTL, - request.NamespaceID, - namespacePartition, - request.WorkflowID, - request.RunID, - persistence.UnixMilliseconds(request.StartTime), - persistence.UnixMilliseconds(request.ExecutionTime), - persistence.UnixMilliseconds(request.CloseTime), - request.WorkflowTypeName, - request.Status, - request.HistoryLength, - request.Memo.Data, - request.Memo.EncodingType.String(), - request.TaskQueue, - retentionSeconds, - ) - } + batch.Query(templateCreateWorkflowExecutionClosed, + request.NamespaceID, + namespacePartition, + request.WorkflowID, + request.RunID, + persistence.UnixMilliseconds(request.StartTime), + persistence.UnixMilliseconds(request.ExecutionTime), + persistence.UnixMilliseconds(request.CloseTime), + request.WorkflowTypeName, + request.Status, + request.HistoryLength, + request.Memo.Data, + request.Memo.EncodingType.String(), + request.TaskQueue, + ) // RecordWorkflowExecutionStarted is using StartTime as the timestamp for every query in `open_executions` table. // Due to the fact that cross DC using mutable state creation time as workflow start time and visibility using event time @@ -460,8 +437,47 @@ func (v *visibilityStore) ListClosedWorkflowExecutionsByStatus( return response, nil } -// DeleteWorkflowExecution is a no-op since deletes are auto-handled by cassandra TTLs -func (v *visibilityStore) DeleteWorkflowExecution(_ *manager.VisibilityDeleteWorkflowExecutionRequest) error { +func (v *visibilityStore) DeleteWorkflowExecution(request *manager.VisibilityDeleteWorkflowExecutionRequest) error { + // Primary key in closed_execution table has close_time which is not in the request. + // Query closed_execution table first (using secondary index by workflow_id) to get close_time. + // This is not very efficient if workflow has multiple executions. + query := v.session. + Query(templateGetClosedWorkflowExecutionsByID, + request.NamespaceID.String(), + namespacePartition, + persistence.UnixMilliseconds(minTime), + persistence.UnixMilliseconds(maxTime), + request.WorkflowID). + Consistency(v.lowConslevel) + iter := query.Iter() + + wfExecution, has := readClosedWorkflowExecutionRecord(iter) + var wfExecutionToDelete *store.InternalWorkflowExecutionInfo + for has { + if wfExecution.RunID == request.RunID { + wfExecutionToDelete = wfExecution + break + } + wfExecution, has = readClosedWorkflowExecutionRecord(iter) + } + + if err := iter.Close(); err != nil { + return gocql.ConvertError("DeleteWorkflowExecution", err) + } + + if wfExecutionToDelete == nil { + return nil + } + + query = v.session.Query(templateDeleteWorkflowExecutionClosed, + request.NamespaceID.String(), + namespacePartition, + wfExecution.CloseTime, + request.RunID). + Consistency(v.lowConslevel) + if err := query.Exec(); err != nil { + return gocql.ConvertError("DeleteWorkflowExecution", err) + } return nil } diff --git a/common/persistence/visibility/store/visibility_store.go b/common/persistence/visibility/store/visibility_store.go index 0f0050f6f80..d7d71c51f28 100644 --- a/common/persistence/visibility/store/visibility_store.go +++ b/common/persistence/visibility/store/visibility_store.go @@ -113,7 +113,6 @@ type ( *InternalVisibilityRequestBase CloseTime time.Time HistoryLength int64 - Retention *time.Duration } // InternalUpsertWorkflowExecutionRequest is request to UpsertWorkflowExecution diff --git a/common/persistence/visibility/visibility_manager_impl.go b/common/persistence/visibility/visibility_manager_impl.go index 5487d05c426..869fa16389a 100644 --- a/common/persistence/visibility/visibility_manager_impl.go +++ b/common/persistence/visibility/visibility_manager_impl.go @@ -95,7 +95,6 @@ func (p *visibilityManagerImpl) RecordWorkflowExecutionClosed(request *manager.R InternalVisibilityRequestBase: requestBase, CloseTime: request.CloseTime, HistoryLength: request.HistoryLength, - Retention: request.Retention, } return p.store.RecordWorkflowExecutionClosed(req) } diff --git a/service/history/visibilityQueueTaskExecutor.go b/service/history/visibilityQueueTaskExecutor.go index 4b09d3e6721..d4082dd619a 100644 --- a/service/history/visibilityQueueTaskExecutor.go +++ b/service/history/visibilityQueueTaskExecutor.go @@ -443,36 +443,27 @@ func (t *visibilityQueueTaskExecutor) recordCloseExecution( return err } - recordWorkflowClose := true - - retention := namespaceEntry.Retention() - - if recordWorkflowClose { - return t.visibilityMgr.RecordWorkflowExecutionClosed(&manager.RecordWorkflowExecutionClosedRequest{ - VisibilityRequestBase: &manager.VisibilityRequestBase{ - NamespaceID: namespaceID, - Namespace: namespaceEntry.Name(), - Execution: commonpb.WorkflowExecution{ - WorkflowId: workflowID, - RunId: runID, - }, - WorkflowTypeName: workflowTypeName, - StartTime: startTime, - ExecutionTime: executionTime, - StateTransitionCount: stateTransitionCount, Status: status, - TaskID: taskID, - ShardID: t.shard.GetShardID(), - Memo: visibilityMemo, - TaskQueue: taskQueue, - SearchAttributes: searchAttributes, + return t.visibilityMgr.RecordWorkflowExecutionClosed(&manager.RecordWorkflowExecutionClosedRequest{ + VisibilityRequestBase: &manager.VisibilityRequestBase{ + NamespaceID: namespaceID, + Namespace: namespaceEntry.Name(), + Execution: commonpb.WorkflowExecution{ + WorkflowId: workflowID, + RunId: runID, }, - CloseTime: endTime, - HistoryLength: historyLength, - Retention: &retention, - }) - } - - return nil + WorkflowTypeName: workflowTypeName, + StartTime: startTime, + ExecutionTime: executionTime, + StateTransitionCount: stateTransitionCount, Status: status, + TaskID: taskID, + ShardID: t.shard.GetShardID(), + Memo: visibilityMemo, + TaskQueue: taskQueue, + SearchAttributes: searchAttributes, + }, + CloseTime: endTime, + HistoryLength: historyLength, + }) } func (t *visibilityQueueTaskExecutor) processDeleteExecution( From a5438c09ca1f33099d8c72077bcb5c5e2524e577 Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Tue, 18 Jan 2022 15:15:04 -0800 Subject: [PATCH 2/7] Set page size to 0 --- .../visibility/store/standard/cassandra/visibility_store.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/persistence/visibility/store/standard/cassandra/visibility_store.go b/common/persistence/visibility/store/standard/cassandra/visibility_store.go index 1ef4cc9c676..dd9e3ddaadd 100644 --- a/common/persistence/visibility/store/standard/cassandra/visibility_store.go +++ b/common/persistence/visibility/store/standard/cassandra/visibility_store.go @@ -448,6 +448,7 @@ func (v *visibilityStore) DeleteWorkflowExecution(request *manager.VisibilityDel persistence.UnixMilliseconds(minTime), persistence.UnixMilliseconds(maxTime), request.WorkflowID). + PageSize(0). Consistency(v.lowConslevel) iter := query.Iter() From d485a853fcf072b691c72fb7592ed12c33dd6e67 Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Tue, 18 Jan 2022 16:49:05 -0800 Subject: [PATCH 3/7] Delete workflow execution using CloseTime --- api/persistence/v1/executions.pb.go | 600 ++++++++++-------- .../serialization/task_serializer.go | 2 + .../visibility/manager/visibility_manager.go | 1 + .../standard/cassandra/visibility_store.go | 41 +- .../api/persistence/v1/executions.proto | 1 + service/history/shard/context.go | 2 +- service/history/shard/context_impl.go | 2 + service/history/shard/context_mock.go | 8 +- .../history/tasks/delete_visibility_task.go | 1 + .../history/visibilityQueueTaskExecutor.go | 1 + 10 files changed, 349 insertions(+), 310 deletions(-) diff --git a/api/persistence/v1/executions.pb.go b/api/persistence/v1/executions.pb.go index 26b1e876cc8..a95a6244e33 100644 --- a/api/persistence/v1/executions.pb.go +++ b/api/persistence/v1/executions.pb.go @@ -1062,6 +1062,7 @@ type VisibilityTaskInfo struct { Version int64 `protobuf:"varint,5,opt,name=version,proto3" json:"version,omitempty"` TaskId int64 `protobuf:"varint,6,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` VisibilityTime *time.Time `protobuf:"bytes,7,opt,name=visibility_time,json=visibilityTime,proto3,stdtime" json:"visibility_time,omitempty"` + CloseTime *time.Time `protobuf:"bytes,8,opt,name=close_time,json=closeTime,proto3,stdtime" json:"close_time,omitempty"` } func (m *VisibilityTaskInfo) Reset() { *m = VisibilityTaskInfo{} } @@ -1145,6 +1146,13 @@ func (m *VisibilityTaskInfo) GetVisibilityTime() *time.Time { return nil } +func (m *VisibilityTaskInfo) GetCloseTime() *time.Time { + if m != nil { + return m.CloseTime + } + return nil +} + // tiered_storage_task_data column type TieredStorageTaskInfo struct { NamespaceId string `protobuf:"bytes,1,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"` @@ -2061,207 +2069,208 @@ func init() { } var fileDescriptor_67a714d0e7ba9f37 = []byte{ - // 3185 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x1a, 0x4d, 0x73, 0xdb, 0xc6, - 0xd5, 0xb4, 0x20, 0x11, 0x7c, 0x94, 0x28, 0x08, 0xfa, 0x82, 0x64, 0x99, 0x92, 0x19, 0x3b, 0x91, - 0x13, 0x87, 0xb2, 0x64, 0xa7, 0xf9, 0xec, 0x74, 0x6c, 0xd9, 0x4e, 0xc8, 0x49, 0x1c, 0x07, 0x52, - 0xe2, 0x4c, 0x3a, 0x19, 0x0e, 0x04, 0x2c, 0x25, 0x54, 0x20, 0x40, 0x03, 0x20, 0x65, 0x66, 0x7a, - 0xc8, 0xa1, 0xd3, 0x1e, 0xda, 0x43, 0xa6, 0x97, 0xf6, 0xda, 0x5b, 0xcf, 0x9d, 0xc9, 0xa1, 0xe7, - 0x5e, 0x7a, 0xcc, 0x31, 0x97, 0x4e, 0x1b, 0xe5, 0xd2, 0x5b, 0xf3, 0x13, 0x3a, 0xfb, 0x76, 0x01, - 0x2c, 0x40, 0x48, 0xa6, 0xdc, 0xf8, 0xe0, 0x99, 0xde, 0x88, 0x7d, 0x1f, 0xfb, 0xde, 0xdb, 0xb7, - 0xef, 0x6b, 0x09, 0x37, 0x42, 0xd2, 0xe9, 0x7a, 0xbe, 0xe1, 0x6c, 0x04, 0xc4, 0xef, 0x13, 0x7f, - 0xc3, 0xe8, 0xda, 0x1b, 0x5d, 0xe2, 0x07, 0x76, 0x10, 0x12, 0xd7, 0x24, 0x1b, 0xfd, 0xcd, 0x0d, - 0xf2, 0x98, 0x98, 0xbd, 0xd0, 0xf6, 0xdc, 0xa0, 0xde, 0xf5, 0xbd, 0xd0, 0x53, 0x6b, 0x11, 0x51, - 0x9d, 0x11, 0xd5, 0x8d, 0xae, 0x5d, 0x17, 0x88, 0xea, 0xfd, 0xcd, 0xe5, 0xea, 0xbe, 0xe7, 0xed, - 0x3b, 0x64, 0x03, 0x29, 0xf6, 0x7a, 0xed, 0x0d, 0xab, 0xe7, 0x1b, 0x94, 0x09, 0xe3, 0xb1, 0xbc, - 0x9a, 0x85, 0x87, 0x76, 0x87, 0x04, 0xa1, 0xd1, 0xe9, 0x72, 0x84, 0x4b, 0x16, 0xe9, 0x12, 0xd7, - 0x22, 0xae, 0x69, 0x93, 0x60, 0x63, 0xdf, 0xdb, 0xf7, 0x70, 0x1d, 0x7f, 0x71, 0x94, 0xcb, 0xb1, - 0xf0, 0x54, 0x6a, 0xd3, 0xeb, 0x74, 0x3c, 0x97, 0x0a, 0xdc, 0x21, 0x41, 0x60, 0xec, 0x93, 0x5c, - 0x2c, 0xe2, 0xf6, 0x3a, 0x01, 0x45, 0x3a, 0xf2, 0xfc, 0xc3, 0xb6, 0xe3, 0x1d, 0x71, 0xac, 0x2b, - 0x29, 0xac, 0xb6, 0x61, 0x3b, 0x3d, 0x9f, 0x0c, 0x33, 0x4b, 0xa3, 0x1d, 0xd8, 0x41, 0xe8, 0xf9, - 0x83, 0x61, 0xb4, 0x17, 0x53, 0x68, 0xd1, 0x56, 0xc3, 0x78, 0x57, 0xf3, 0xcc, 0x1f, 0x8b, 0xc8, - 0x34, 0xe2, 0xa8, 0xaf, 0x9c, 0x8a, 0x9a, 0xd1, 0xe6, 0xa5, 0x53, 0x91, 0x43, 0x23, 0x38, 0xe4, - 0x88, 0xd7, 0xf2, 0x10, 0x4f, 0x52, 0xab, 0xf6, 0x87, 0x32, 0x94, 0x76, 0x0e, 0x0c, 0xdf, 0x6a, - 0xb8, 0x6d, 0x4f, 0x5d, 0x02, 0x39, 0xa0, 0x1f, 0x2d, 0xdb, 0xd2, 0x0a, 0x6b, 0x85, 0xf5, 0x71, - 0xbd, 0x88, 0xdf, 0x0d, 0x8b, 0x82, 0x7c, 0xc3, 0xdd, 0x27, 0x14, 0x74, 0x7e, 0xad, 0xb0, 0x3e, - 0xa6, 0x17, 0xf1, 0xbb, 0x61, 0xa9, 0x73, 0x30, 0xee, 0x1d, 0xb9, 0xc4, 0xd7, 0xc6, 0xd6, 0x0a, - 0xeb, 0x25, 0x9d, 0x7d, 0xa8, 0x5b, 0x30, 0xef, 0x93, 0xae, 0x63, 0x9b, 0xe8, 0x23, 0x2d, 0xc3, - 0x3c, 0x6c, 0x39, 0xa4, 0x4f, 0x1c, 0x4d, 0x42, 0xea, 0x59, 0x01, 0x78, 0xcb, 0x3c, 0x7c, 0x9f, - 0x82, 0xd4, 0x6b, 0xa0, 0x86, 0xbe, 0xe1, 0x06, 0x6d, 0xe2, 0x0b, 0x04, 0xe3, 0x48, 0xa0, 0x44, - 0x10, 0x11, 0x3b, 0x08, 0x3d, 0x87, 0xb8, 0xad, 0xc0, 0x76, 0x4d, 0xd2, 0xf2, 0x89, 0x4b, 0x8e, - 0xb4, 0x09, 0x94, 0x5b, 0x61, 0x90, 0x1d, 0x0a, 0xd0, 0xe9, 0xba, 0x7a, 0x0b, 0xca, 0xbd, 0xae, - 0x65, 0x84, 0xa4, 0x45, 0xfd, 0x52, 0x2b, 0xae, 0x15, 0xd6, 0xcb, 0x5b, 0xcb, 0x75, 0xe6, 0xb4, - 0xf5, 0xc8, 0x69, 0xeb, 0xbb, 0x91, 0xd3, 0xde, 0x96, 0xbe, 0xfa, 0xe7, 0x6a, 0x41, 0x07, 0x46, - 0x44, 0x97, 0xd5, 0x8f, 0x60, 0x8e, 0xd2, 0x0a, 0xb2, 0x31, 0x5e, 0xf2, 0x88, 0xbc, 0x66, 0x90, - 0x3a, 0x92, 0x1f, 0x59, 0xde, 0x81, 0xaa, 0x6b, 0x74, 0x48, 0xd0, 0x35, 0x4c, 0xd2, 0x72, 0xbd, - 0xd0, 0x6e, 0x47, 0x06, 0xeb, 0xd3, 0xdb, 0xe7, 0xb9, 0x5a, 0x09, 0xb5, 0x5f, 0x89, 0xb1, 0xee, - 0x0b, 0x48, 0x9f, 0x30, 0x1c, 0xf5, 0x37, 0x05, 0x58, 0x36, 0x9d, 0x5e, 0x10, 0x12, 0xbf, 0x95, - 0x63, 0x40, 0x58, 0x1b, 0x5b, 0x2f, 0x6f, 0x35, 0xeb, 0x4f, 0xbe, 0xe4, 0xf5, 0xd8, 0x17, 0xea, - 0xdb, 0x8c, 0xdf, 0x6e, 0xc6, 0xea, 0x77, 0xdd, 0xd0, 0x1f, 0xe8, 0x8b, 0x66, 0x3e, 0x54, 0xfd, - 0x55, 0x01, 0x16, 0x63, 0x49, 0xd2, 0xb6, 0xd2, 0xca, 0x28, 0xc6, 0xbb, 0x4f, 0x27, 0x86, 0x68, - 0x39, 0x94, 0x81, 0xdb, 0x74, 0xce, 0xcc, 0x41, 0x50, 0x7f, 0x5d, 0x80, 0xa5, 0x48, 0x0c, 0xd1, - 0x0b, 0x99, 0x20, 0x93, 0xff, 0x83, 0x3d, 0xf4, 0x84, 0x5b, 0x8e, 0x3d, 0xb2, 0x50, 0x6a, 0x8f, - 0x25, 0x51, 0x00, 0xcb, 0x79, 0x24, 0x58, 0x64, 0x0a, 0x05, 0x69, 0x9c, 0x4d, 0x10, 0x61, 0x8f, - 0x3b, 0xce, 0xa3, 0xf4, 0xb9, 0x2c, 0xf8, 0xb9, 0x40, 0xf5, 0x3a, 0xcc, 0xf5, 0xed, 0xc0, 0xde, - 0xb3, 0x1d, 0x3b, 0x1c, 0x08, 0x02, 0x54, 0xd0, 0xb9, 0xd4, 0x04, 0x16, 0x53, 0xbc, 0x0e, 0x5a, - 0x68, 0x13, 0x9f, 0x58, 0x2d, 0x1a, 0x39, 0x8c, 0x7d, 0x22, 0x50, 0x4d, 0x23, 0xd5, 0x3c, 0x83, - 0xef, 0x30, 0x70, 0x44, 0xb8, 0xdc, 0x84, 0x95, 0xd3, 0x5c, 0x47, 0x55, 0x60, 0xec, 0x90, 0x0c, - 0x30, 0xbc, 0x94, 0x74, 0xfa, 0x93, 0xc6, 0x8f, 0xbe, 0xe1, 0xf4, 0x08, 0x8f, 0x2b, 0xec, 0xe3, - 0xad, 0xf3, 0x6f, 0x14, 0x96, 0x4d, 0x58, 0x3a, 0xf1, 0xfc, 0x73, 0x18, 0x5d, 0x17, 0x19, 0x9d, - 0x7a, 0x21, 0xc5, 0x4d, 0x12, 0x81, 0x73, 0xcf, 0xf6, 0x4c, 0x02, 0x37, 0xe0, 0xc2, 0x29, 0xc7, - 0x73, 0x16, 0x56, 0xb5, 0xdf, 0xaf, 0xc0, 0xfc, 0x43, 0x9e, 0x03, 0xee, 0x46, 0xf9, 0x1a, 0xa3, - 0xf4, 0x25, 0x98, 0x4c, 0x62, 0x06, 0x8f, 0xd4, 0x25, 0xbd, 0x1c, 0xaf, 0x35, 0x2c, 0x75, 0x15, - 0xca, 0x51, 0xfe, 0x88, 0x02, 0x76, 0x49, 0x87, 0x68, 0xa9, 0x61, 0xa9, 0x75, 0x98, 0xed, 0x1a, - 0x3e, 0x71, 0xc3, 0x56, 0x8a, 0x15, 0x8b, 0xe0, 0x33, 0x0c, 0x74, 0x5f, 0x60, 0x78, 0x0d, 0x54, - 0x8e, 0x2f, 0xf2, 0x95, 0x10, 0x5d, 0x61, 0x90, 0x87, 0x09, 0xf7, 0x1a, 0x4c, 0x71, 0x6c, 0xbf, - 0xe7, 0x52, 0xc4, 0x71, 0x26, 0x22, 0x5b, 0xd4, 0x7b, 0x6e, 0xc3, 0xa2, 0x5a, 0xd8, 0xae, 0x1d, - 0xda, 0x46, 0x48, 0x30, 0xdf, 0x4c, 0xa0, 0x01, 0xca, 0xf1, 0x5a, 0xc3, 0x52, 0xdf, 0x84, 0x25, - 0xd3, 0xeb, 0x74, 0x1d, 0x82, 0x57, 0x87, 0xf4, 0x29, 0xc3, 0x3d, 0x23, 0x34, 0x0f, 0x28, 0x7e, - 0x11, 0xf1, 0x17, 0x12, 0x84, 0xbb, 0x14, 0x7e, 0x9b, 0x82, 0x1b, 0x96, 0x7a, 0x11, 0x80, 0xe6, - 0xc4, 0xd6, 0xa3, 0x1e, 0xe9, 0x11, 0x8c, 0xa1, 0x25, 0xbd, 0x44, 0x57, 0x3e, 0xa2, 0x0b, 0x54, - 0x9d, 0x58, 0x8f, 0x70, 0xd0, 0x25, 0x68, 0x05, 0x0d, 0x98, 0x3a, 0x11, 0x64, 0x77, 0xd0, 0x25, - 0xd4, 0x06, 0xea, 0xe7, 0xb0, 0x1c, 0x63, 0xc7, 0xa5, 0x13, 0x86, 0x37, 0xaf, 0x17, 0x6a, 0x65, - 0x74, 0xb6, 0xa5, 0x21, 0x67, 0xbb, 0xc3, 0xcb, 0xa3, 0xdb, 0xd2, 0x1f, 0x69, 0xa0, 0xd2, 0x8e, - 0xb2, 0x87, 0xb9, 0xcb, 0x18, 0xd0, 0xb4, 0x12, 0xb3, 0xa7, 0xf6, 0x8a, 0x18, 0x4f, 0x8e, 0xc6, - 0x38, 0xd6, 0x44, 0xef, 0xc5, 0x2c, 0xf7, 0xe0, 0xa2, 0x45, 0xda, 0x46, 0xcf, 0x11, 0xce, 0x0b, - 0xed, 0x11, 0xf1, 0x9e, 0x1a, 0x8d, 0xf7, 0x32, 0xe7, 0x12, 0x9d, 0xed, 0xae, 0x11, 0x1c, 0x46, - 0x7b, 0xbc, 0x02, 0xaa, 0x63, 0x04, 0x21, 0x3f, 0x17, 0xe4, 0x6e, 0x5b, 0xda, 0x0c, 0x1e, 0xcb, - 0x34, 0x85, 0xe0, 0x81, 0x50, 0x8a, 0x86, 0xa5, 0xbe, 0x0a, 0xb3, 0x88, 0xdc, 0xb6, 0xfd, 0x98, - 0xc4, 0xb6, 0x34, 0x95, 0xa5, 0x76, 0x0a, 0xba, 0x47, 0x21, 0x48, 0xd2, 0xb0, 0xd4, 0x77, 0xe0, - 0x02, 0xa2, 0xa7, 0x85, 0x0f, 0x42, 0xc3, 0x47, 0xb2, 0x59, 0x24, 0x5b, 0xa4, 0x28, 0xa2, 0x64, - 0x3b, 0x14, 0xde, 0xb0, 0xd4, 0x9f, 0x01, 0x30, 0x54, 0xcc, 0xce, 0x73, 0x23, 0x66, 0xe7, 0x12, - 0xd2, 0x60, 0x56, 0x6e, 0x02, 0x8a, 0xd4, 0x12, 0x0b, 0x86, 0xf9, 0x11, 0xd9, 0x54, 0x28, 0xe5, - 0xc7, 0x49, 0xd1, 0xb0, 0x05, 0xf3, 0x69, 0x2d, 0xa2, 0xc4, 0xbe, 0xc0, 0xea, 0xa0, 0x23, 0x41, - 0x81, 0x28, 0x9f, 0xbf, 0x09, 0x4b, 0x19, 0xcd, 0xcd, 0x03, 0x62, 0xf5, 0x1c, 0xbc, 0xa3, 0x8b, - 0xcc, 0xf1, 0x45, 0xba, 0x1d, 0x0e, 0x6e, 0x58, 0x34, 0x6e, 0xe7, 0x18, 0x8d, 0x5d, 0x31, 0x8d, - 0xc5, 0xed, 0xa3, 0xac, 0xc9, 0xf0, 0xb2, 0xed, 0x64, 0xe5, 0x8c, 0x5c, 0x65, 0x69, 0x34, 0x57, - 0x49, 0x29, 0x12, 0xf9, 0xc8, 0x90, 0xf2, 0x46, 0x48, 0x73, 0x5d, 0xa8, 0x2d, 0x63, 0x95, 0x96, - 0xa2, 0xb9, 0xc5, 0x40, 0xa9, 0xdb, 0x96, 0xd2, 0x00, 0x8f, 0xe1, 0xc2, 0x88, 0xc7, 0xb0, 0x98, - 0xa3, 0x25, 0x9e, 0x87, 0x01, 0x2b, 0xf9, 0xb6, 0xe5, 0x1b, 0xac, 0x8c, 0xb8, 0xc1, 0x52, 0xde, - 0x01, 0xb0, 0x2d, 0xae, 0x82, 0x62, 0x1a, 0xae, 0x49, 0x9c, 0x96, 0x4f, 0x1e, 0xf5, 0x48, 0x10, - 0x12, 0x4b, 0xbb, 0xb8, 0x56, 0x58, 0x97, 0xf5, 0x69, 0xb6, 0xae, 0x47, 0xcb, 0xaa, 0x0f, 0x57, - 0xd2, 0xd2, 0x78, 0xbe, 0xbd, 0x6f, 0xbb, 0x86, 0x93, 0x15, 0xab, 0x3a, 0xa2, 0x58, 0x97, 0x44, - 0xb1, 0x3e, 0xe4, 0xcc, 0xd2, 0xe2, 0x0d, 0xb9, 0x08, 0x97, 0x92, 0xba, 0xc8, 0x2a, 0x86, 0xc0, - 0x94, 0x8b, 0x70, 0x61, 0x1b, 0x96, 0xfa, 0x32, 0xcc, 0xa4, 0xf5, 0xa2, 0x14, 0x6b, 0x48, 0x91, - 0x56, 0x8c, 0xe1, 0x06, 0xa1, 0x6d, 0x1e, 0x0e, 0x5a, 0x42, 0x1c, 0xbe, 0xc4, 0x70, 0x19, 0x60, - 0x37, 0x8e, 0xc6, 0xfb, 0xb0, 0xc6, 0x71, 0x63, 0x3f, 0x0f, 0xbd, 0x56, 0x72, 0x85, 0xa9, 0x17, - 0xd6, 0x46, 0xf3, 0xc2, 0x15, 0xc6, 0x28, 0x52, 0x78, 0xd7, 0xdb, 0x89, 0x2e, 0x35, 0x75, 0x47, - 0x0d, 0x8a, 0x91, 0x03, 0xbe, 0xc0, 0xda, 0x1b, 0xfe, 0xa9, 0x7e, 0x0c, 0x0b, 0x3e, 0x09, 0xfd, - 0x41, 0x8b, 0xe5, 0x1f, 0xa7, 0x65, 0xbb, 0x21, 0xf1, 0xfb, 0x86, 0xa3, 0x5d, 0x1e, 0x6d, 0xe3, - 0x39, 0x24, 0x6f, 0x30, 0xea, 0x06, 0x27, 0x4e, 0xd8, 0x76, 0x8c, 0xc7, 0x76, 0xa7, 0xd7, 0x49, - 0xd8, 0x5e, 0x39, 0x0b, 0xdb, 0x0f, 0x18, 0x75, 0xcc, 0xf6, 0x66, 0x96, 0x2d, 0x57, 0x23, 0xd0, - 0x5e, 0x44, 0xb5, 0x52, 0x54, 0xfc, 0x5e, 0x05, 0xea, 0x5b, 0xb4, 0x14, 0xa5, 0x54, 0x7b, 0x86, - 0x79, 0xe8, 0xb5, 0xdb, 0x2d, 0xd3, 0x23, 0xed, 0xb6, 0x6d, 0xda, 0xc4, 0x0d, 0xb5, 0x97, 0xd6, - 0x0a, 0xeb, 0x05, 0x7d, 0x11, 0x11, 0x6e, 0x33, 0xf8, 0x76, 0x02, 0x56, 0x3b, 0x50, 0xcb, 0x49, - 0x81, 0xe4, 0x71, 0xd7, 0x66, 0xe2, 0x32, 0x27, 0x5d, 0x1f, 0xd1, 0x49, 0x57, 0x87, 0x72, 0xe1, - 0xdd, 0x98, 0x13, 0x6f, 0x8b, 0x56, 0x99, 0xa8, 0xae, 0xe7, 0xb6, 0xf0, 0x97, 0xb1, 0xe7, 0x90, - 0x16, 0xf1, 0x7d, 0xcf, 0xc7, 0x84, 0x1d, 0x68, 0x57, 0xd7, 0xc6, 0xd6, 0x4b, 0xfa, 0x05, 0x04, - 0xde, 0xf7, 0x5c, 0x3d, 0x42, 0xba, 0x4b, 0x71, 0x68, 0xea, 0x0e, 0xd4, 0x75, 0x50, 0x0e, 0x8c, - 0x80, 0xd1, 0xb7, 0xba, 0x9e, 0x63, 0x9b, 0x03, 0xed, 0x65, 0xbc, 0x87, 0x95, 0x03, 0x23, 0x40, - 0x8a, 0x07, 0xb8, 0xaa, 0xbe, 0x00, 0x53, 0xa6, 0xef, 0xb9, 0xb1, 0xff, 0x69, 0xaf, 0xa0, 0xa7, - 0x4e, 0xd2, 0xc5, 0xc8, 0x97, 0x68, 0xc5, 0x12, 0xd8, 0xfb, 0xf4, 0x6e, 0x9a, 0x5e, 0xcf, 0x0d, - 0xb5, 0x3a, 0xab, 0x58, 0xd8, 0xda, 0x36, 0x5d, 0x52, 0x3f, 0x82, 0x19, 0xa3, 0x17, 0x7a, 0x2d, - 0x9f, 0x04, 0x24, 0x6c, 0x75, 0x3d, 0xdb, 0x0d, 0x03, 0xed, 0x06, 0x5a, 0xe5, 0x4a, 0x52, 0xe5, - 0xd3, 0xf2, 0x3e, 0x6e, 0xef, 0xfb, 0x9b, 0x75, 0x9d, 0x62, 0x3f, 0x40, 0x64, 0x7d, 0x9a, 0xd2, - 0x0b, 0x0b, 0xea, 0x2f, 0x61, 0x26, 0x20, 0x86, 0x6f, 0x1e, 0xd0, 0x43, 0xf6, 0xed, 0xbd, 0x5e, - 0x48, 0x02, 0xed, 0x26, 0x36, 0x0e, 0x1f, 0x8e, 0xd2, 0x38, 0xe4, 0xd6, 0x90, 0xf5, 0x1d, 0x64, - 0x79, 0x2b, 0xe6, 0xc8, 0xda, 0x07, 0x25, 0xc8, 0x2c, 0xab, 0x0f, 0x41, 0xea, 0x90, 0x8e, 0xa7, - 0xbd, 0x86, 0x1b, 0x6e, 0x3f, 0xfd, 0x86, 0x1f, 0x90, 0x8e, 0xc7, 0x36, 0x41, 0x86, 0xea, 0xe7, - 0x30, 0xc3, 0x13, 0x61, 0x8b, 0x0d, 0x27, 0x6c, 0x12, 0x68, 0x3f, 0x41, 0x4b, 0x5d, 0xcf, 0xdd, - 0x85, 0x8f, 0x30, 0xe8, 0x0e, 0x3c, 0x4d, 0xbe, 0x17, 0xd1, 0xe9, 0x4a, 0x3f, 0xb3, 0xa2, 0xde, - 0x80, 0x05, 0x5e, 0x6a, 0xc4, 0xce, 0xca, 0x4b, 0xd1, 0xd7, 0xf1, 0x64, 0x67, 0x11, 0x1a, 0x8b, - 0xc8, 0x4a, 0xd2, 0x9f, 0xc3, 0x74, 0x82, 0x1e, 0x84, 0x46, 0x18, 0x68, 0x6f, 0xa0, 0x44, 0x5b, - 0xa3, 0xe8, 0x1d, 0x33, 0xdb, 0xa1, 0x94, 0x7a, 0x85, 0xa4, 0xbe, 0x53, 0x79, 0x87, 0x8a, 0x92, - 0xbd, 0x3b, 0x6f, 0x9e, 0x35, 0xef, 0xe8, 0xbd, 0xec, 0xad, 0xb9, 0x09, 0x8b, 0x43, 0x45, 0x56, - 0xf8, 0x18, 0xb5, 0x7e, 0x8b, 0x15, 0x1b, 0xe9, 0x42, 0x6b, 0xf7, 0x31, 0xd5, 0xfa, 0x26, 0x2c, - 0x50, 0x5d, 0x09, 0x9b, 0x1c, 0xd8, 0x28, 0x11, 0x73, 0xf0, 0xb7, 0x91, 0x68, 0x0e, 0xa1, 0xbb, - 0x31, 0x90, 0x79, 0xfa, 0xbb, 0x50, 0x49, 0x97, 0xc2, 0xda, 0x3b, 0x23, 0x2a, 0x30, 0x45, 0xc4, - 0x02, 0x58, 0xdd, 0x80, 0x39, 0x97, 0x1c, 0x0d, 0x9f, 0xd3, 0x4f, 0x59, 0x2b, 0xe2, 0x92, 0xa3, - 0xf4, 0x29, 0x2d, 0x5b, 0x30, 0x9f, 0xeb, 0xbd, 0x39, 0xdd, 0xd5, 0x6b, 0xe9, 0x86, 0x70, 0x35, - 0x7d, 0x05, 0xf9, 0x30, 0xae, 0xbf, 0x59, 0x7f, 0x60, 0x0c, 0x1c, 0xcf, 0xb0, 0xc4, 0x4e, 0xee, - 0x53, 0x28, 0xc5, 0x2e, 0xfb, 0xa3, 0x72, 0x6e, 0x4a, 0xb2, 0xac, 0x94, 0x9a, 0x92, 0x5c, 0x51, - 0xa6, 0x9b, 0x92, 0x3c, 0xad, 0x28, 0x4d, 0x49, 0x56, 0x94, 0x99, 0xa6, 0x24, 0x5f, 0x53, 0x5e, - 0x6d, 0x4a, 0xf2, 0xab, 0x4a, 0xbd, 0x29, 0xc9, 0x1b, 0xca, 0xf5, 0xa6, 0x24, 0x5f, 0x57, 0x36, - 0x9b, 0x92, 0xbc, 0xa9, 0x6c, 0x35, 0x25, 0x79, 0x4b, 0xb9, 0x51, 0xbb, 0x01, 0x95, 0xb4, 0x9b, - 0xd1, 0xa0, 0xc4, 0x6f, 0x46, 0x2b, 0xb0, 0xbf, 0x20, 0x28, 0xe3, 0x98, 0x5e, 0xe6, 0x6b, 0x3b, - 0xf6, 0x17, 0xa4, 0xf6, 0x9f, 0x02, 0x2c, 0x0c, 0x5d, 0x4a, 0x4a, 0x4d, 0x30, 0xa3, 0xfb, 0x84, - 0x1e, 0xbe, 0x90, 0xd1, 0x0b, 0x3c, 0xa3, 0x23, 0x20, 0xc9, 0xe8, 0xf3, 0x30, 0xc1, 0x8f, 0x86, - 0xb5, 0x93, 0xe3, 0x3e, 0x5e, 0x9a, 0x26, 0x8c, 0xa3, 0x83, 0x60, 0xef, 0x58, 0xd9, 0xba, 0x99, - 0x7b, 0x55, 0x70, 0x50, 0x99, 0x1b, 0x1c, 0x50, 0x0e, 0x9d, 0xb1, 0x50, 0xef, 0xc1, 0x04, 0xfd, - 0xd1, 0x0b, 0xb0, 0xb3, 0xac, 0x6c, 0xd5, 0xd3, 0x66, 0x3d, 0x9d, 0x4b, 0x2f, 0xd0, 0x39, 0x75, - 0xed, 0x6b, 0x09, 0x94, 0x68, 0xfa, 0x80, 0x0d, 0xc8, 0x8f, 0xd5, 0x36, 0x27, 0x36, 0x18, 0x13, - 0x6d, 0xb0, 0x0d, 0x25, 0x56, 0x32, 0x0f, 0xba, 0x84, 0x8b, 0xfe, 0xe2, 0xe9, 0x76, 0xc0, 0x22, - 0x79, 0xd0, 0x25, 0xba, 0x1c, 0xf2, 0x5f, 0xb4, 0x25, 0x0f, 0x0d, 0x7f, 0x9f, 0x64, 0x5a, 0x72, - 0xd6, 0x3a, 0xcf, 0x30, 0x50, 0xa6, 0x25, 0xe7, 0xf8, 0xa2, 0xcc, 0x13, 0xac, 0x87, 0x65, 0x90, - 0x74, 0x4b, 0xce, 0xb1, 0xb9, 0x02, 0x45, 0xa6, 0x3e, 0x5b, 0x64, 0xf1, 0x2f, 0xdd, 0x34, 0xcb, - 0xd9, 0xa6, 0xf9, 0x6d, 0x58, 0xe6, 0x2c, 0xcc, 0x03, 0xdb, 0xb1, 0x92, 0x6d, 0x3d, 0xd7, 0x19, - 0x60, 0x8f, 0x2d, 0xeb, 0x8b, 0x0c, 0x63, 0x9b, 0x22, 0x44, 0xbb, 0x7f, 0xe8, 0x3a, 0x03, 0x6a, - 0x5a, 0xb1, 0x89, 0x01, 0x74, 0x53, 0x08, 0x92, 0xc6, 0x45, 0x83, 0x62, 0xd4, 0x19, 0x95, 0xd9, - 0x7c, 0x99, 0x7f, 0xaa, 0x8b, 0x50, 0x8c, 0xba, 0xcb, 0x49, 0x84, 0x4c, 0x84, 0xac, 0xa9, 0x6c, - 0xc0, 0xb4, 0x30, 0xd5, 0xc2, 0x20, 0x34, 0x35, 0x6a, 0x97, 0x96, 0x10, 0x52, 0x10, 0xbb, 0x8e, - 0xb5, 0xdf, 0x49, 0x30, 0x2b, 0xcc, 0x6f, 0x9e, 0x1b, 0xd7, 0x11, 0x6c, 0x37, 0x9e, 0xb6, 0xdd, - 0x65, 0xa8, 0x64, 0x5a, 0x6e, 0x36, 0x67, 0x99, 0x6c, 0x8b, 0xed, 0x76, 0x0d, 0xa6, 0x5c, 0xf2, - 0x58, 0x40, 0x62, 0xc3, 0x95, 0x32, 0x5d, 0x8c, 0x70, 0x68, 0xf5, 0x13, 0xb7, 0x24, 0xb6, 0x85, - 0xee, 0x41, 0xab, 0x9f, 0x68, 0x8d, 0xa1, 0xec, 0xf9, 0x86, 0x6b, 0x1e, 0xb4, 0x42, 0xef, 0x90, - 0xb0, 0x73, 0x9c, 0xd4, 0xcb, 0x6c, 0x6d, 0x97, 0x2e, 0x45, 0xd1, 0x9e, 0x5a, 0x22, 0x85, 0x3a, - 0x85, 0xa8, 0x34, 0xda, 0xeb, 0x3d, 0xf7, 0xb6, 0x40, 0x20, 0x1c, 0xfe, 0xf4, 0x93, 0x0e, 0x5f, - 0x79, 0xea, 0xc3, 0x2f, 0x29, 0xd0, 0x94, 0x64, 0x50, 0xca, 0x4d, 0x49, 0x9e, 0x54, 0xa6, 0xb8, - 0x3b, 0xfc, 0xe5, 0x3c, 0xa8, 0x9f, 0x24, 0xa8, 0xcf, 0xbf, 0x37, 0x08, 0xc6, 0x9c, 0x78, 0x92, - 0x31, 0x8b, 0x4f, 0x67, 0xcc, 0xda, 0xd7, 0xe7, 0x61, 0x7e, 0x57, 0x9c, 0x0c, 0xff, 0xdf, 0x6e, - 0x23, 0xd9, 0xed, 0x4f, 0x12, 0x4c, 0xe1, 0x94, 0xfb, 0xb9, 0xb1, 0xd7, 0x5d, 0x98, 0xe4, 0xdd, - 0x39, 0xe3, 0x33, 0x8e, 0x7c, 0x6a, 0x27, 0xe4, 0x6c, 0xde, 0x83, 0x23, 0x8f, 0x72, 0x98, 0x7c, - 0xa8, 0x44, 0x98, 0x11, 0x45, 0x9d, 0x29, 0xf2, 0x9b, 0x40, 0x7e, 0x9b, 0xa3, 0x15, 0x14, 0xbc, - 0x67, 0x45, 0xf6, 0xf1, 0x58, 0x49, 0x58, 0x14, 0x4f, 0xb7, 0x98, 0x3e, 0xdd, 0xab, 0xa0, 0xc4, - 0xa9, 0x29, 0x1a, 0x0f, 0xc8, 0xd8, 0x47, 0x4f, 0x47, 0xeb, 0xd1, 0x6c, 0x6a, 0x09, 0xe4, 0x38, - 0x46, 0xb2, 0x87, 0xb9, 0x22, 0xe1, 0xf1, 0x51, 0xf0, 0x11, 0x78, 0x92, 0x8f, 0x94, 0x9f, 0xd2, - 0x47, 0x7e, 0x5b, 0x81, 0xc9, 0x5b, 0x66, 0x68, 0xf7, 0xed, 0x70, 0x80, 0x2e, 0x22, 0x28, 0x55, - 0x48, 0x2b, 0xf5, 0x3a, 0x68, 0x49, 0xb8, 0xce, 0x8c, 0xce, 0xd9, 0x5b, 0xc3, 0x7c, 0x0c, 0x4f, - 0x4d, 0xce, 0xdf, 0x85, 0x4a, 0x66, 0xf4, 0x24, 0x8d, 0x5a, 0xd8, 0x07, 0xa9, 0x31, 0xd3, 0x45, - 0x3e, 0x85, 0x65, 0xe9, 0x82, 0xdd, 0xa8, 0x52, 0x10, 0xcf, 0x1b, 0xb7, 0x61, 0x32, 0x35, 0xd8, - 0x1b, 0xf5, 0xde, 0x94, 0x03, 0x61, 0x98, 0xb7, 0x0a, 0x65, 0x83, 0xdb, 0x23, 0xca, 0x49, 0x25, - 0x1d, 0xa2, 0x25, 0x56, 0xd2, 0x08, 0x95, 0x2d, 0x7f, 0x07, 0xf0, 0xe3, 0x9a, 0xf6, 0x33, 0x58, - 0x3a, 0x79, 0xe4, 0x04, 0xa3, 0x8d, 0x68, 0x16, 0x82, 0xfc, 0x61, 0x53, 0x86, 0xb7, 0xe9, 0x78, - 0x01, 0x39, 0xeb, 0xa3, 0x81, 0xc0, 0x7b, 0x9b, 0xd2, 0x47, 0xbc, 0x77, 0xb1, 0x67, 0xa3, 0xb2, - 0x66, 0x19, 0x8f, 0xf8, 0x68, 0x30, 0xcb, 0x86, 0xdd, 0x69, 0xae, 0xef, 0xc3, 0xcc, 0x01, 0x31, - 0xfc, 0x70, 0x8f, 0x18, 0xe1, 0x59, 0x5f, 0x0a, 0x94, 0x98, 0x32, 0xe2, 0x96, 0x37, 0x05, 0xad, - 0xe4, 0x4f, 0x41, 0x73, 0x07, 0x8b, 0x2c, 0xdd, 0xe7, 0x0d, 0x16, 0xd9, 0xc3, 0x72, 0x34, 0x1b, - 0xa6, 0xed, 0x82, 0xc2, 0xae, 0x6b, 0x18, 0xc5, 0x4f, 0xd6, 0x0f, 0x88, 0xf3, 0xbe, 0x99, 0xf4, - 0xbc, 0x2f, 0x5d, 0xea, 0xaa, 0xd9, 0x52, 0x97, 0x86, 0x84, 0xd8, 0x77, 0x89, 0x1b, 0xda, 0xe1, - 0x00, 0x1f, 0x1d, 0x70, 0x78, 0xc9, 0x3d, 0x98, 0x2d, 0xe7, 0x0e, 0x99, 0xe6, 0x72, 0x87, 0x4c, - 0x27, 0xcf, 0x18, 0xe7, 0x9f, 0xcd, 0x8c, 0x71, 0xe1, 0xd9, 0xcc, 0x18, 0x17, 0x4f, 0x99, 0x31, - 0xee, 0xc2, 0x3c, 0xa3, 0xca, 0x8e, 0x37, 0xb4, 0x11, 0xaf, 0xf7, 0x2c, 0x92, 0x67, 0x06, 0x1b, - 0xa7, 0x4e, 0x2e, 0x97, 0x4e, 0x9f, 0x5c, 0x8e, 0x30, 0x4a, 0x5c, 0x7e, 0xf2, 0x28, 0xf1, 0x3e, - 0xa8, 0x8c, 0x0b, 0x1b, 0xb0, 0xb0, 0x3f, 0x13, 0xf1, 0xc7, 0x88, 0xb5, 0x74, 0xc6, 0xe3, 0x40, - 0x9a, 0x9c, 0xee, 0xb1, 0x9f, 0xba, 0x82, 0xb4, 0xef, 0x1b, 0x41, 0xc8, 0x57, 0x68, 0x2f, 0x25, - 0xf0, 0xa3, 0xf9, 0x8a, 0xf8, 0x89, 0xab, 0xad, 0xa0, 0xab, 0x2d, 0xc6, 0x54, 0x0f, 0x11, 0x1e, - 0xbb, 0x5c, 0xb6, 0x30, 0xb8, 0x98, 0x5b, 0x18, 0x88, 0xed, 0x56, 0x75, 0xa8, 0xdd, 0xfa, 0x04, - 0x16, 0x70, 0xeb, 0xe4, 0xc2, 0x5b, 0x24, 0x34, 0x6c, 0x27, 0xc0, 0x27, 0x80, 0x21, 0xa5, 0x86, - 0x26, 0x1a, 0x81, 0x3e, 0x47, 0xe9, 0xdf, 0x8b, 0xc8, 0xef, 0x30, 0x6a, 0xf5, 0x73, 0x58, 0xce, - 0xf0, 0x15, 0x1f, 0xd1, 0xd6, 0x46, 0x7d, 0xbd, 0x49, 0xf1, 0x4e, 0x5e, 0xd3, 0x9a, 0x92, 0x3c, - 0xa6, 0x48, 0x4d, 0x49, 0x9e, 0x50, 0x8a, 0xb5, 0xbf, 0x15, 0xa0, 0x84, 0x15, 0xd3, 0x13, 0x52, - 0x61, 0x3a, 0x11, 0x9d, 0xcf, 0x26, 0xa2, 0x5b, 0x50, 0x46, 0x67, 0xe5, 0xb9, 0x79, 0x6c, 0xd4, - 0x3f, 0x06, 0x31, 0xa2, 0x28, 0x0d, 0x89, 0xd1, 0x88, 0xfd, 0xc3, 0x09, 0x03, 0x0c, 0x0f, 0x44, - 0x4b, 0x20, 0xb3, 0xa0, 0x15, 0x37, 0xf4, 0x45, 0xfc, 0x6e, 0x58, 0xb5, 0x7f, 0x8c, 0x81, 0x8a, - 0xed, 0x72, 0xfa, 0x91, 0xff, 0xd4, 0xcc, 0x9e, 0x3c, 0x9c, 0xe7, 0x67, 0xf6, 0x18, 0x9e, 0x7d, - 0x13, 0x17, 0xec, 0x30, 0x96, 0xb5, 0x43, 0x1d, 0x66, 0x23, 0xb0, 0x58, 0x53, 0xf2, 0xf9, 0x03, - 0x07, 0x09, 0x13, 0x85, 0xcb, 0x50, 0x89, 0xf0, 0x79, 0x89, 0xc9, 0x66, 0x0f, 0x51, 0x5a, 0x67, - 0x33, 0x85, 0xdc, 0x09, 0x93, 0x9c, 0x3f, 0x61, 0x5a, 0x81, 0x52, 0xec, 0xc3, 0x51, 0xae, 0x8e, - 0x17, 0xce, 0xf8, 0x66, 0xff, 0x69, 0xfc, 0x07, 0x07, 0x96, 0x1f, 0x79, 0x64, 0x2e, 0x63, 0x4d, - 0xb9, 0x7e, 0x42, 0x8d, 0xfa, 0x00, 0x29, 0x30, 0x27, 0xb2, 0x98, 0x1d, 0xfd, 0x15, 0x42, 0x58, - 0x1a, 0xfa, 0xe3, 0xc2, 0xe4, 0xd0, 0x1f, 0x17, 0x9a, 0x92, 0x2c, 0x29, 0xe3, 0x4d, 0x49, 0x2e, - 0x2a, 0x72, 0xed, 0xeb, 0x02, 0xcc, 0x70, 0x15, 0xb7, 0x31, 0x95, 0x3d, 0xab, 0xe3, 0xcd, 0x4d, - 0xa2, 0x63, 0xf9, 0xaf, 0x73, 0x59, 0x1d, 0xa4, 0x21, 0x1d, 0x6a, 0x7f, 0x2d, 0x00, 0xec, 0xe0, - 0xd3, 0xc6, 0x33, 0xf4, 0xc7, 0x21, 0x49, 0x85, 0xda, 0x2c, 0x2b, 0x63, 0xf1, 0x64, 0x3b, 0x8f, - 0x2b, 0x13, 0x2c, 0x26, 0xb0, 0xe1, 0x6a, 0xed, 0xcb, 0x02, 0xc8, 0xdb, 0x07, 0xc4, 0x3c, 0x0c, - 0x7a, 0x9d, 0xac, 0xe4, 0xe3, 0x89, 0xe4, 0x77, 0x60, 0xa2, 0xed, 0x18, 0x7d, 0xcf, 0x47, 0x39, - 0x2b, 0x5b, 0xd7, 0x4e, 0x6f, 0x35, 0x22, 0x8e, 0xf7, 0x90, 0x46, 0xe7, 0xb4, 0xc9, 0x5f, 0x78, - 0xc6, 0x70, 0x86, 0xc1, 0x3e, 0x6e, 0xff, 0xe2, 0x9b, 0xef, 0xaa, 0xe7, 0xbe, 0xfd, 0xae, 0x7a, - 0xee, 0x87, 0xef, 0xaa, 0x85, 0x2f, 0x8f, 0xab, 0x85, 0x3f, 0x1f, 0x57, 0x0b, 0x7f, 0x3f, 0xae, - 0x16, 0xbe, 0x39, 0xae, 0x16, 0xfe, 0x75, 0x5c, 0x2d, 0xfc, 0xfb, 0xb8, 0x7a, 0xee, 0x87, 0xe3, - 0x6a, 0xe1, 0xab, 0xef, 0xab, 0xe7, 0xbe, 0xf9, 0xbe, 0x7a, 0xee, 0xdb, 0xef, 0xab, 0xe7, 0x3e, - 0xbb, 0xb9, 0xef, 0x25, 0x32, 0xd8, 0xde, 0xc9, 0x7f, 0xe1, 0x7d, 0x5b, 0xf8, 0xdc, 0x9b, 0xc0, - 0x20, 0x75, 0xe3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x69, 0xf4, 0xce, 0xfb, 0x2b, 0x00, - 0x00, + // 3202 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3a, 0xcd, 0x73, 0xdb, 0xc6, + 0xf5, 0xa6, 0x05, 0x89, 0xe0, 0xa3, 0x44, 0x41, 0xd0, 0x17, 0x24, 0xcb, 0x94, 0xcc, 0xd8, 0x89, + 0x9c, 0x38, 0x94, 0x25, 0x3b, 0xbf, 0x7c, 0xfe, 0x26, 0x63, 0xcb, 0x76, 0x42, 0x4e, 0xe2, 0x38, + 0x90, 0x12, 0x67, 0xd2, 0xc9, 0x70, 0x20, 0x60, 0x29, 0xa1, 0x02, 0x01, 0x1a, 0x00, 0x29, 0x33, + 0xd3, 0x43, 0x0e, 0x9d, 0xf6, 0xd0, 0x1e, 0x32, 0xbd, 0xb4, 0xd7, 0xde, 0xfa, 0x0f, 0xe4, 0xd0, + 0x73, 0x2f, 0x3d, 0xe6, 0x98, 0x4b, 0xa7, 0x8d, 0x72, 0xe9, 0xad, 0x99, 0xe9, 0x3f, 0xd0, 0xd9, + 0xb7, 0x0b, 0x60, 0x01, 0x42, 0x32, 0xe5, 0xc6, 0x07, 0xcf, 0xf4, 0x46, 0xec, 0xfb, 0xd8, 0xf7, + 0xde, 0xbe, 0x7d, 0x5f, 0x4b, 0xb8, 0x11, 0x92, 0x4e, 0xd7, 0xf3, 0x0d, 0x67, 0x23, 0x20, 0x7e, + 0x9f, 0xf8, 0x1b, 0x46, 0xd7, 0xde, 0xe8, 0x12, 0x3f, 0xb0, 0x83, 0x90, 0xb8, 0x26, 0xd9, 0xe8, + 0x6f, 0x6e, 0x90, 0xc7, 0xc4, 0xec, 0x85, 0xb6, 0xe7, 0x06, 0xf5, 0xae, 0xef, 0x85, 0x9e, 0x5a, + 0x8b, 0x88, 0xea, 0x8c, 0xa8, 0x6e, 0x74, 0xed, 0xba, 0x40, 0x54, 0xef, 0x6f, 0x2e, 0x57, 0xf7, + 0x3d, 0x6f, 0xdf, 0x21, 0x1b, 0x48, 0xb1, 0xd7, 0x6b, 0x6f, 0x58, 0x3d, 0xdf, 0xa0, 0x4c, 0x18, + 0x8f, 0xe5, 0xd5, 0x2c, 0x3c, 0xb4, 0x3b, 0x24, 0x08, 0x8d, 0x4e, 0x97, 0x23, 0x5c, 0xb2, 0x48, + 0x97, 0xb8, 0x16, 0x71, 0x4d, 0x9b, 0x04, 0x1b, 0xfb, 0xde, 0xbe, 0x87, 0xeb, 0xf8, 0x8b, 0xa3, + 0x5c, 0x8e, 0x85, 0xa7, 0x52, 0x9b, 0x5e, 0xa7, 0xe3, 0xb9, 0x54, 0xe0, 0x0e, 0x09, 0x02, 0x63, + 0x9f, 0xe4, 0x62, 0x11, 0xb7, 0xd7, 0x09, 0x28, 0xd2, 0x91, 0xe7, 0x1f, 0xb6, 0x1d, 0xef, 0x88, + 0x63, 0x5d, 0x49, 0x61, 0xb5, 0x0d, 0xdb, 0xe9, 0xf9, 0x64, 0x98, 0x59, 0x1a, 0xed, 0xc0, 0x0e, + 0x42, 0xcf, 0x1f, 0x0c, 0xa3, 0xbd, 0x98, 0x42, 0x8b, 0xb6, 0x1a, 0xc6, 0xbb, 0x9a, 0x67, 0xfe, + 0x58, 0x44, 0xa6, 0x11, 0x47, 0x7d, 0xe5, 0x54, 0xd4, 0x8c, 0x36, 0x2f, 0x9d, 0x8a, 0x1c, 0x1a, + 0xc1, 0x21, 0x47, 0xbc, 0x96, 0x87, 0x78, 0x92, 0x5a, 0xb5, 0xdf, 0x97, 0xa1, 0xb4, 0x73, 0x60, + 0xf8, 0x56, 0xc3, 0x6d, 0x7b, 0xea, 0x12, 0xc8, 0x01, 0xfd, 0x68, 0xd9, 0x96, 0x56, 0x58, 0x2b, + 0xac, 0x8f, 0xeb, 0x45, 0xfc, 0x6e, 0x58, 0x14, 0xe4, 0x1b, 0xee, 0x3e, 0xa1, 0xa0, 0xf3, 0x6b, + 0x85, 0xf5, 0x31, 0xbd, 0x88, 0xdf, 0x0d, 0x4b, 0x9d, 0x83, 0x71, 0xef, 0xc8, 0x25, 0xbe, 0x36, + 0xb6, 0x56, 0x58, 0x2f, 0xe9, 0xec, 0x43, 0xdd, 0x82, 0x79, 0x9f, 0x74, 0x1d, 0xdb, 0x44, 0x1f, + 0x69, 0x19, 0xe6, 0x61, 0xcb, 0x21, 0x7d, 0xe2, 0x68, 0x12, 0x52, 0xcf, 0x0a, 0xc0, 0x5b, 0xe6, + 0xe1, 0x07, 0x14, 0xa4, 0x5e, 0x03, 0x35, 0xf4, 0x0d, 0x37, 0x68, 0x13, 0x5f, 0x20, 0x18, 0x47, + 0x02, 0x25, 0x82, 0x88, 0xd8, 0x41, 0xe8, 0x39, 0xc4, 0x6d, 0x05, 0xb6, 0x6b, 0x92, 0x96, 0x4f, + 0x5c, 0x72, 0xa4, 0x4d, 0xa0, 0xdc, 0x0a, 0x83, 0xec, 0x50, 0x80, 0x4e, 0xd7, 0xd5, 0x5b, 0x50, + 0xee, 0x75, 0x2d, 0x23, 0x24, 0x2d, 0xea, 0x97, 0x5a, 0x71, 0xad, 0xb0, 0x5e, 0xde, 0x5a, 0xae, + 0x33, 0xa7, 0xad, 0x47, 0x4e, 0x5b, 0xdf, 0x8d, 0x9c, 0xf6, 0xb6, 0xf4, 0xf5, 0xdf, 0x57, 0x0b, + 0x3a, 0x30, 0x22, 0xba, 0xac, 0x7e, 0x0c, 0x73, 0x94, 0x56, 0x90, 0x8d, 0xf1, 0x92, 0x47, 0xe4, + 0x35, 0x83, 0xd4, 0x91, 0xfc, 0xc8, 0xf2, 0x0e, 0x54, 0x5d, 0xa3, 0x43, 0x82, 0xae, 0x61, 0x92, + 0x96, 0xeb, 0x85, 0x76, 0x3b, 0x32, 0x58, 0x9f, 0xde, 0x3e, 0xcf, 0xd5, 0x4a, 0xa8, 0xfd, 0x4a, + 0x8c, 0x75, 0x5f, 0x40, 0xfa, 0x94, 0xe1, 0xa8, 0xbf, 0x2e, 0xc0, 0xb2, 0xe9, 0xf4, 0x82, 0x90, + 0xf8, 0xad, 0x1c, 0x03, 0xc2, 0xda, 0xd8, 0x7a, 0x79, 0xab, 0x59, 0x7f, 0xf2, 0x25, 0xaf, 0xc7, + 0xbe, 0x50, 0xdf, 0x66, 0xfc, 0x76, 0x33, 0x56, 0xbf, 0xeb, 0x86, 0xfe, 0x40, 0x5f, 0x34, 0xf3, + 0xa1, 0xea, 0x2f, 0x0b, 0xb0, 0x18, 0x4b, 0x92, 0xb6, 0x95, 0x56, 0x46, 0x31, 0xde, 0x7b, 0x3a, + 0x31, 0x44, 0xcb, 0xa1, 0x0c, 0xdc, 0xa6, 0x73, 0x66, 0x0e, 0x82, 0xfa, 0xab, 0x02, 0x2c, 0x45, + 0x62, 0x88, 0x5e, 0xc8, 0x04, 0x99, 0xfc, 0x2f, 0xec, 0xa1, 0x27, 0xdc, 0x72, 0xec, 0x91, 0x85, + 0x52, 0x7b, 0x2c, 0x89, 0x02, 0x58, 0xce, 0x23, 0xc1, 0x22, 0x53, 0x28, 0x48, 0xe3, 0x6c, 0x82, + 0x08, 0x7b, 0xdc, 0x71, 0x1e, 0xa5, 0xcf, 0x65, 0xc1, 0xcf, 0x05, 0xaa, 0xd7, 0x61, 0xae, 0x6f, + 0x07, 0xf6, 0x9e, 0xed, 0xd8, 0xe1, 0x40, 0x10, 0xa0, 0x82, 0xce, 0xa5, 0x26, 0xb0, 0x98, 0xe2, + 0x75, 0xd0, 0x42, 0x9b, 0xf8, 0xc4, 0x6a, 0xd1, 0xc8, 0x61, 0xec, 0x13, 0x81, 0x6a, 0x1a, 0xa9, + 0xe6, 0x19, 0x7c, 0x87, 0x81, 0x23, 0xc2, 0xe5, 0x26, 0xac, 0x9c, 0xe6, 0x3a, 0xaa, 0x02, 0x63, + 0x87, 0x64, 0x80, 0xe1, 0xa5, 0xa4, 0xd3, 0x9f, 0x34, 0x7e, 0xf4, 0x0d, 0xa7, 0x47, 0x78, 0x5c, + 0x61, 0x1f, 0x6f, 0x9d, 0x7f, 0xa3, 0xb0, 0x6c, 0xc2, 0xd2, 0x89, 0xe7, 0x9f, 0xc3, 0xe8, 0xba, + 0xc8, 0xe8, 0xd4, 0x0b, 0x29, 0x6e, 0x92, 0x08, 0x9c, 0x7b, 0xb6, 0x67, 0x12, 0xb8, 0x01, 0x17, + 0x4e, 0x39, 0x9e, 0xb3, 0xb0, 0xaa, 0xfd, 0x6e, 0x05, 0xe6, 0x1f, 0xf2, 0x1c, 0x70, 0x37, 0xca, + 0xd7, 0x18, 0xa5, 0x2f, 0xc1, 0x64, 0x12, 0x33, 0x78, 0xa4, 0x2e, 0xe9, 0xe5, 0x78, 0xad, 0x61, + 0xa9, 0xab, 0x50, 0x8e, 0xf2, 0x47, 0x14, 0xb0, 0x4b, 0x3a, 0x44, 0x4b, 0x0d, 0x4b, 0xad, 0xc3, + 0x6c, 0xd7, 0xf0, 0x89, 0x1b, 0xb6, 0x52, 0xac, 0x58, 0x04, 0x9f, 0x61, 0xa0, 0xfb, 0x02, 0xc3, + 0x6b, 0xa0, 0x72, 0x7c, 0x91, 0xaf, 0x84, 0xe8, 0x0a, 0x83, 0x3c, 0x4c, 0xb8, 0xd7, 0x60, 0x8a, + 0x63, 0xfb, 0x3d, 0x97, 0x22, 0x8e, 0x33, 0x11, 0xd9, 0xa2, 0xde, 0x73, 0x1b, 0x16, 0xd5, 0xc2, + 0x76, 0xed, 0xd0, 0x36, 0x42, 0x82, 0xf9, 0x66, 0x02, 0x0d, 0x50, 0x8e, 0xd7, 0x1a, 0x96, 0xfa, + 0x26, 0x2c, 0x99, 0x5e, 0xa7, 0xeb, 0x10, 0xbc, 0x3a, 0xa4, 0x4f, 0x19, 0xee, 0x19, 0xa1, 0x79, + 0x40, 0xf1, 0x8b, 0x88, 0xbf, 0x90, 0x20, 0xdc, 0xa5, 0xf0, 0xdb, 0x14, 0xdc, 0xb0, 0xd4, 0x8b, + 0x00, 0x34, 0x27, 0xb6, 0x1e, 0xf5, 0x48, 0x8f, 0x60, 0x0c, 0x2d, 0xe9, 0x25, 0xba, 0xf2, 0x31, + 0x5d, 0xa0, 0xea, 0xc4, 0x7a, 0x84, 0x83, 0x2e, 0x41, 0x2b, 0x68, 0xc0, 0xd4, 0x89, 0x20, 0xbb, + 0x83, 0x2e, 0xa1, 0x36, 0x50, 0xbf, 0x80, 0xe5, 0x18, 0x3b, 0x2e, 0x9d, 0x30, 0xbc, 0x79, 0xbd, + 0x50, 0x2b, 0xa3, 0xb3, 0x2d, 0x0d, 0x39, 0xdb, 0x1d, 0x5e, 0x1e, 0xdd, 0x96, 0xfe, 0x40, 0x03, + 0x95, 0x76, 0x94, 0x3d, 0xcc, 0x5d, 0xc6, 0x80, 0xa6, 0x95, 0x98, 0x3d, 0xb5, 0x57, 0xc4, 0x78, + 0x72, 0x34, 0xc6, 0xb1, 0x26, 0x7a, 0x2f, 0x66, 0xb9, 0x07, 0x17, 0x2d, 0xd2, 0x36, 0x7a, 0x8e, + 0x70, 0x5e, 0x68, 0x8f, 0x88, 0xf7, 0xd4, 0x68, 0xbc, 0x97, 0x39, 0x97, 0xe8, 0x6c, 0x77, 0x8d, + 0xe0, 0x30, 0xda, 0xe3, 0x15, 0x50, 0x1d, 0x23, 0x08, 0xf9, 0xb9, 0x20, 0x77, 0xdb, 0xd2, 0x66, + 0xf0, 0x58, 0xa6, 0x29, 0x04, 0x0f, 0x84, 0x52, 0x34, 0x2c, 0xf5, 0x55, 0x98, 0x45, 0xe4, 0xb6, + 0xed, 0xc7, 0x24, 0xb6, 0xa5, 0xa9, 0x2c, 0xb5, 0x53, 0xd0, 0x3d, 0x0a, 0x41, 0x92, 0x86, 0xa5, + 0xbe, 0x03, 0x17, 0x10, 0x3d, 0x2d, 0x7c, 0x10, 0x1a, 0x3e, 0x92, 0xcd, 0x22, 0xd9, 0x22, 0x45, + 0x11, 0x25, 0xdb, 0xa1, 0xf0, 0x86, 0xa5, 0xbe, 0x0b, 0xc0, 0x50, 0x31, 0x3b, 0xcf, 0x8d, 0x98, + 0x9d, 0x4b, 0x48, 0x83, 0x59, 0xb9, 0x09, 0x28, 0x52, 0x4b, 0x2c, 0x18, 0xe6, 0x47, 0x64, 0x53, + 0xa1, 0x94, 0x9f, 0x24, 0x45, 0xc3, 0x16, 0xcc, 0xa7, 0xb5, 0x88, 0x12, 0xfb, 0x02, 0xab, 0x83, + 0x8e, 0x04, 0x05, 0xa2, 0x7c, 0xfe, 0x26, 0x2c, 0x65, 0x34, 0x37, 0x0f, 0x88, 0xd5, 0x73, 0xf0, + 0x8e, 0x2e, 0x32, 0xc7, 0x17, 0xe9, 0x76, 0x38, 0xb8, 0x61, 0xd1, 0xb8, 0x9d, 0x63, 0x34, 0x76, + 0xc5, 0x34, 0x16, 0xb7, 0x8f, 0xb2, 0x26, 0xc3, 0xcb, 0xb6, 0x93, 0x95, 0x33, 0x72, 0x95, 0xa5, + 0xd1, 0x5c, 0x25, 0xa5, 0x48, 0xe4, 0x23, 0x43, 0xca, 0x1b, 0x21, 0xcd, 0x75, 0xa1, 0xb6, 0x8c, + 0x55, 0x5a, 0x8a, 0xe6, 0x16, 0x03, 0xa5, 0x6e, 0x5b, 0x4a, 0x03, 0x3c, 0x86, 0x0b, 0x23, 0x1e, + 0xc3, 0x62, 0x8e, 0x96, 0x78, 0x1e, 0x06, 0xac, 0xe4, 0xdb, 0x96, 0x6f, 0xb0, 0x32, 0xe2, 0x06, + 0x4b, 0x79, 0x07, 0xc0, 0xb6, 0xb8, 0x0a, 0x8a, 0x69, 0xb8, 0x26, 0x71, 0x5a, 0x3e, 0x79, 0xd4, + 0x23, 0x41, 0x48, 0x2c, 0xed, 0xe2, 0x5a, 0x61, 0x5d, 0xd6, 0xa7, 0xd9, 0xba, 0x1e, 0x2d, 0xab, + 0x3e, 0x5c, 0x49, 0x4b, 0xe3, 0xf9, 0xf6, 0xbe, 0xed, 0x1a, 0x4e, 0x56, 0xac, 0xea, 0x88, 0x62, + 0x5d, 0x12, 0xc5, 0xfa, 0x88, 0x33, 0x4b, 0x8b, 0x37, 0xe4, 0x22, 0x5c, 0x4a, 0xea, 0x22, 0xab, + 0x18, 0x02, 0x53, 0x2e, 0xc2, 0x85, 0x6d, 0x58, 0xea, 0xcb, 0x30, 0x93, 0xd6, 0x8b, 0x52, 0xac, + 0x21, 0x45, 0x5a, 0x31, 0x86, 0x1b, 0x84, 0xb6, 0x79, 0x38, 0x68, 0x09, 0x71, 0xf8, 0x12, 0xc3, + 0x65, 0x80, 0xdd, 0x38, 0x1a, 0xef, 0xc3, 0x1a, 0xc7, 0x8d, 0xfd, 0x3c, 0xf4, 0x5a, 0xc9, 0x15, + 0xa6, 0x5e, 0x58, 0x1b, 0xcd, 0x0b, 0x57, 0x18, 0xa3, 0x48, 0xe1, 0x5d, 0x6f, 0x27, 0xba, 0xd4, + 0xd4, 0x1d, 0x35, 0x28, 0x46, 0x0e, 0xf8, 0x02, 0x6b, 0x6f, 0xf8, 0xa7, 0xfa, 0x09, 0x2c, 0xf8, + 0x24, 0xf4, 0x07, 0x2d, 0x96, 0x7f, 0x9c, 0x96, 0xed, 0x86, 0xc4, 0xef, 0x1b, 0x8e, 0x76, 0x79, + 0xb4, 0x8d, 0xe7, 0x90, 0xbc, 0xc1, 0xa8, 0x1b, 0x9c, 0x38, 0x61, 0xdb, 0x31, 0x1e, 0xdb, 0x9d, + 0x5e, 0x27, 0x61, 0x7b, 0xe5, 0x2c, 0x6c, 0x3f, 0x64, 0xd4, 0x31, 0xdb, 0x9b, 0x59, 0xb6, 0x5c, + 0x8d, 0x40, 0x7b, 0x11, 0xd5, 0x4a, 0x51, 0xf1, 0x7b, 0x15, 0xa8, 0x6f, 0xd1, 0x52, 0x94, 0x52, + 0xed, 0x19, 0xe6, 0xa1, 0xd7, 0x6e, 0xb7, 0x4c, 0x8f, 0xb4, 0xdb, 0xb6, 0x69, 0x13, 0x37, 0xd4, + 0x5e, 0x5a, 0x2b, 0xac, 0x17, 0xf4, 0x45, 0x44, 0xb8, 0xcd, 0xe0, 0xdb, 0x09, 0x58, 0xed, 0x40, + 0x2d, 0x27, 0x05, 0x92, 0xc7, 0x5d, 0x9b, 0x89, 0xcb, 0x9c, 0x74, 0x7d, 0x44, 0x27, 0x5d, 0x1d, + 0xca, 0x85, 0x77, 0x63, 0x4e, 0xbc, 0x2d, 0x5a, 0x65, 0xa2, 0xba, 0x9e, 0xdb, 0xc2, 0x5f, 0xc6, + 0x9e, 0x43, 0x5a, 0xc4, 0xf7, 0x3d, 0x1f, 0x13, 0x76, 0xa0, 0x5d, 0x5d, 0x1b, 0x5b, 0x2f, 0xe9, + 0x17, 0x10, 0x78, 0xdf, 0x73, 0xf5, 0x08, 0xe9, 0x2e, 0xc5, 0xa1, 0xa9, 0x3b, 0x50, 0xd7, 0x41, + 0x39, 0x30, 0x02, 0x46, 0xdf, 0xea, 0x7a, 0x8e, 0x6d, 0x0e, 0xb4, 0x97, 0xf1, 0x1e, 0x56, 0x0e, + 0x8c, 0x00, 0x29, 0x1e, 0xe0, 0xaa, 0xfa, 0x02, 0x4c, 0x99, 0xbe, 0xe7, 0xc6, 0xfe, 0xa7, 0xbd, + 0x82, 0x9e, 0x3a, 0x49, 0x17, 0x23, 0x5f, 0xa2, 0x15, 0x4b, 0x60, 0xef, 0xd3, 0xbb, 0x69, 0x7a, + 0x3d, 0x37, 0xd4, 0xea, 0xac, 0x62, 0x61, 0x6b, 0xdb, 0x74, 0x49, 0xfd, 0x18, 0x66, 0x8c, 0x5e, + 0xe8, 0xb5, 0x7c, 0x12, 0x90, 0xb0, 0xd5, 0xf5, 0x6c, 0x37, 0x0c, 0xb4, 0x1b, 0x68, 0x95, 0x2b, + 0x49, 0x95, 0x4f, 0xcb, 0xfb, 0xb8, 0xbd, 0xef, 0x6f, 0xd6, 0x75, 0x8a, 0xfd, 0x00, 0x91, 0xf5, + 0x69, 0x4a, 0x2f, 0x2c, 0xa8, 0xbf, 0x80, 0x99, 0x80, 0x18, 0xbe, 0x79, 0x40, 0x0f, 0xd9, 0xb7, + 0xf7, 0x7a, 0x21, 0x09, 0xb4, 0x9b, 0xd8, 0x38, 0x7c, 0x34, 0x4a, 0xe3, 0x90, 0x5b, 0x43, 0xd6, + 0x77, 0x90, 0xe5, 0xad, 0x98, 0x23, 0x6b, 0x1f, 0x94, 0x20, 0xb3, 0xac, 0x3e, 0x04, 0xa9, 0x43, + 0x3a, 0x9e, 0xf6, 0x1a, 0x6e, 0xb8, 0xfd, 0xf4, 0x1b, 0x7e, 0x48, 0x3a, 0x1e, 0xdb, 0x04, 0x19, + 0xaa, 0x5f, 0xc0, 0x0c, 0x4f, 0x84, 0x2d, 0x36, 0x9c, 0xb0, 0x49, 0xa0, 0xfd, 0x1f, 0x5a, 0xea, + 0x7a, 0xee, 0x2e, 0x7c, 0x84, 0x41, 0x77, 0xe0, 0x69, 0xf2, 0xfd, 0x88, 0x4e, 0x57, 0xfa, 0x99, + 0x15, 0xf5, 0x06, 0x2c, 0xf0, 0x52, 0x23, 0x76, 0x56, 0x5e, 0x8a, 0xbe, 0x8e, 0x27, 0x3b, 0x8b, + 0xd0, 0x58, 0x44, 0x56, 0x92, 0xfe, 0x0c, 0xa6, 0x13, 0xf4, 0x20, 0x34, 0xc2, 0x40, 0x7b, 0x03, + 0x25, 0xda, 0x1a, 0x45, 0xef, 0x98, 0xd9, 0x0e, 0xa5, 0xd4, 0x2b, 0x24, 0xf5, 0x9d, 0xca, 0x3b, + 0x54, 0x94, 0xec, 0xdd, 0x79, 0xf3, 0xac, 0x79, 0x47, 0xef, 0x65, 0x6f, 0xcd, 0x4d, 0x58, 0x1c, + 0x2a, 0xb2, 0xc2, 0xc7, 0xa8, 0xf5, 0x5b, 0xac, 0xd8, 0x48, 0x17, 0x5a, 0xbb, 0x8f, 0xa9, 0xd6, + 0x37, 0x61, 0x81, 0xea, 0x4a, 0xd8, 0xe4, 0xc0, 0x46, 0x89, 0x98, 0x83, 0xbf, 0x8d, 0x44, 0x73, + 0x08, 0xdd, 0x8d, 0x81, 0xcc, 0xd3, 0xdf, 0x83, 0x4a, 0xba, 0x14, 0xd6, 0xde, 0x19, 0x51, 0x81, + 0x29, 0x22, 0x16, 0xc0, 0xea, 0x06, 0xcc, 0xb9, 0xe4, 0x68, 0xf8, 0x9c, 0xfe, 0x9f, 0xb5, 0x22, + 0x2e, 0x39, 0x4a, 0x9f, 0xd2, 0xb2, 0x05, 0xf3, 0xb9, 0xde, 0x9b, 0xd3, 0x5d, 0xbd, 0x96, 0x6e, + 0x08, 0x57, 0xd3, 0x57, 0x90, 0x0f, 0xe3, 0xfa, 0x9b, 0xf5, 0x07, 0xc6, 0xc0, 0xf1, 0x0c, 0x4b, + 0xec, 0xe4, 0x3e, 0x83, 0x52, 0xec, 0xb2, 0x3f, 0x29, 0xe7, 0xa6, 0x24, 0xcb, 0x4a, 0xa9, 0x29, + 0xc9, 0x15, 0x65, 0xba, 0x29, 0xc9, 0xd3, 0x8a, 0xd2, 0x94, 0x64, 0x45, 0x99, 0x69, 0x4a, 0xf2, + 0x35, 0xe5, 0xd5, 0xa6, 0x24, 0xbf, 0xaa, 0xd4, 0x9b, 0x92, 0xbc, 0xa1, 0x5c, 0x6f, 0x4a, 0xf2, + 0x75, 0x65, 0xb3, 0x29, 0xc9, 0x9b, 0xca, 0x56, 0x53, 0x92, 0xb7, 0x94, 0x1b, 0xb5, 0x1b, 0x50, + 0x49, 0xbb, 0x19, 0x0d, 0x4a, 0xfc, 0x66, 0xb4, 0x02, 0xfb, 0x4b, 0x82, 0x32, 0x8e, 0xe9, 0x65, + 0xbe, 0xb6, 0x63, 0x7f, 0x49, 0x6a, 0xff, 0x2a, 0xc0, 0xc2, 0xd0, 0xa5, 0xa4, 0xd4, 0x04, 0x33, + 0xba, 0x4f, 0xe8, 0xe1, 0x0b, 0x19, 0xbd, 0xc0, 0x33, 0x3a, 0x02, 0x92, 0x8c, 0x3e, 0x0f, 0x13, + 0xfc, 0x68, 0x58, 0x3b, 0x39, 0xee, 0xe3, 0xa5, 0x69, 0xc2, 0x38, 0x3a, 0x08, 0xf6, 0x8e, 0x95, + 0xad, 0x9b, 0xb9, 0x57, 0x05, 0x07, 0x95, 0xb9, 0xc1, 0x01, 0xe5, 0xd0, 0x19, 0x0b, 0xf5, 0x1e, + 0x4c, 0xd0, 0x1f, 0xbd, 0x00, 0x3b, 0xcb, 0xca, 0x56, 0x3d, 0x6d, 0xd6, 0xd3, 0xb9, 0xf4, 0x02, + 0x9d, 0x53, 0xd7, 0xbe, 0x91, 0x40, 0x89, 0xa6, 0x0f, 0xd8, 0x80, 0xfc, 0x54, 0x6d, 0x73, 0x62, + 0x83, 0x31, 0xd1, 0x06, 0xdb, 0x50, 0x62, 0x25, 0xf3, 0xa0, 0x4b, 0xb8, 0xe8, 0x2f, 0x9e, 0x6e, + 0x07, 0x2c, 0x92, 0x07, 0x5d, 0xa2, 0xcb, 0x21, 0xff, 0x45, 0x5b, 0xf2, 0xd0, 0xf0, 0xf7, 0x49, + 0xa6, 0x25, 0x67, 0xad, 0xf3, 0x0c, 0x03, 0x65, 0x5a, 0x72, 0x8e, 0x2f, 0xca, 0x3c, 0xc1, 0x7a, + 0x58, 0x06, 0x49, 0xb7, 0xe4, 0x1c, 0x9b, 0x2b, 0x50, 0x64, 0xea, 0xb3, 0x45, 0x16, 0xff, 0xd2, + 0x4d, 0xb3, 0x9c, 0x6d, 0x9a, 0xdf, 0x86, 0x65, 0xce, 0xc2, 0x3c, 0xb0, 0x1d, 0x2b, 0xd9, 0xd6, + 0x73, 0x9d, 0x01, 0xf6, 0xd8, 0xb2, 0xbe, 0xc8, 0x30, 0xb6, 0x29, 0x42, 0xb4, 0xfb, 0x47, 0xae, + 0x33, 0xa0, 0xa6, 0x15, 0x9b, 0x18, 0x40, 0x37, 0x85, 0x20, 0x69, 0x5c, 0x34, 0x28, 0x46, 0x9d, + 0x51, 0x99, 0xcd, 0x97, 0xf9, 0xa7, 0xba, 0x08, 0xc5, 0xa8, 0xbb, 0x9c, 0x44, 0xc8, 0x44, 0xc8, + 0x9a, 0xca, 0x06, 0x4c, 0x0b, 0x53, 0x2d, 0x0c, 0x42, 0x53, 0xa3, 0x76, 0x69, 0x09, 0x21, 0x05, + 0xb1, 0xeb, 0x58, 0xfb, 0xad, 0x04, 0xb3, 0xc2, 0xfc, 0xe6, 0xb9, 0x71, 0x1d, 0xc1, 0x76, 0xe3, + 0x69, 0xdb, 0x5d, 0x86, 0x4a, 0xa6, 0xe5, 0x66, 0x73, 0x96, 0xc9, 0xb6, 0xd8, 0x6e, 0xd7, 0x60, + 0xca, 0x25, 0x8f, 0x05, 0x24, 0x36, 0x5c, 0x29, 0xd3, 0xc5, 0x08, 0x87, 0x56, 0x3f, 0x71, 0x4b, + 0x62, 0x5b, 0xe8, 0x1e, 0xb4, 0xfa, 0x89, 0xd6, 0x18, 0xca, 0x9e, 0x6f, 0xb8, 0xe6, 0x41, 0x2b, + 0xf4, 0x0e, 0x09, 0x3b, 0xc7, 0x49, 0xbd, 0xcc, 0xd6, 0x76, 0xe9, 0x52, 0x14, 0xed, 0xa9, 0x25, + 0x52, 0xa8, 0x53, 0x88, 0x4a, 0xa3, 0xbd, 0xde, 0x73, 0x6f, 0x0b, 0x04, 0xc2, 0xe1, 0x4f, 0x3f, + 0xe9, 0xf0, 0x95, 0xa7, 0x3e, 0xfc, 0x92, 0x02, 0x4d, 0x49, 0x06, 0xa5, 0xdc, 0x94, 0xe4, 0x49, + 0x65, 0x8a, 0xbb, 0xc3, 0xbf, 0xcf, 0x83, 0xfa, 0x69, 0x82, 0xfa, 0xfc, 0x7b, 0x83, 0x60, 0xcc, + 0x89, 0x27, 0x19, 0xb3, 0xf8, 0x74, 0xc6, 0x54, 0xdf, 0x05, 0x30, 0x1d, 0x2f, 0x20, 0x67, 0x7b, + 0x1a, 0x29, 0x21, 0x0d, 0x5d, 0xad, 0x7d, 0x73, 0x1e, 0xe6, 0x77, 0xc5, 0xd1, 0xf2, 0xff, 0x0c, + 0x3f, 0x8a, 0xe1, 0x6b, 0x7f, 0x94, 0x60, 0x0a, 0xc7, 0xe4, 0xcf, 0x8d, 0xbd, 0xee, 0xc2, 0x24, + 0x6f, 0xef, 0x19, 0x9f, 0x71, 0xe4, 0x53, 0x3b, 0x21, 0xe9, 0xf3, 0x26, 0x1e, 0x79, 0x94, 0xc3, + 0xe4, 0x43, 0x25, 0xc2, 0x90, 0x29, 0x6a, 0x6d, 0x91, 0xdf, 0x04, 0xf2, 0xdb, 0x1c, 0xad, 0x22, + 0xe1, 0x4d, 0x2f, 0xb2, 0x8f, 0xe7, 0x52, 0xc2, 0xa2, 0x78, 0xba, 0xc5, 0xf4, 0xe9, 0x5e, 0x05, + 0x25, 0xce, 0x6d, 0xd1, 0x7c, 0x41, 0xc6, 0x46, 0x7c, 0x3a, 0x5a, 0x8f, 0x86, 0x5b, 0x4b, 0x20, + 0xc7, 0x41, 0x96, 0xbd, 0xec, 0x15, 0x09, 0x0f, 0xb0, 0x82, 0x8f, 0xc0, 0x93, 0x7c, 0xa4, 0xfc, + 0x94, 0x3e, 0xf2, 0x9b, 0x0a, 0x4c, 0xde, 0x32, 0x43, 0xbb, 0x6f, 0x87, 0x03, 0x74, 0x11, 0x41, + 0xa9, 0x42, 0x5a, 0xa9, 0xd7, 0x41, 0x4b, 0xe2, 0x7d, 0x66, 0xf6, 0xce, 0x1e, 0x2b, 0xe6, 0x63, + 0x78, 0x6a, 0xf4, 0xfe, 0x1e, 0x54, 0x32, 0xb3, 0x2b, 0x69, 0xd4, 0xce, 0x20, 0x48, 0xcd, 0xa9, + 0x2e, 0xf2, 0x31, 0x2e, 0xcb, 0x37, 0xec, 0x46, 0x95, 0x82, 0x78, 0x60, 0xb9, 0x0d, 0x93, 0xa9, + 0xc9, 0xe0, 0xa8, 0xf7, 0xa6, 0x1c, 0x08, 0xd3, 0xc0, 0x55, 0x28, 0x1b, 0xdc, 0x1e, 0x51, 0x52, + 0x2b, 0xe9, 0x10, 0x2d, 0xb1, 0x9a, 0x48, 0x28, 0x8d, 0xf9, 0x43, 0x82, 0x1f, 0x17, 0xc5, 0x9f, + 0xc3, 0xd2, 0xc9, 0x33, 0x2b, 0x18, 0x6d, 0xc6, 0xb3, 0x10, 0xe4, 0x4f, 0xab, 0x32, 0xbc, 0x93, + 0xa8, 0x7a, 0x86, 0x57, 0x07, 0x81, 0xf7, 0x76, 0x14, 0x61, 0x29, 0xef, 0x5d, 0x6c, 0xfa, 0xa8, + 0xac, 0x59, 0xc6, 0x23, 0xbe, 0x3a, 0xcc, 0xb2, 0x69, 0x79, 0x9a, 0xeb, 0x07, 0x30, 0x73, 0x40, + 0x0c, 0x3f, 0xdc, 0x23, 0x46, 0x78, 0xd6, 0xa7, 0x06, 0x25, 0xa6, 0x8c, 0xb8, 0xe5, 0x8d, 0x51, + 0x2b, 0xf9, 0x63, 0xd4, 0xdc, 0xc9, 0x24, 0xab, 0x17, 0xf2, 0x26, 0x93, 0xec, 0x65, 0x3a, 0x1a, + 0x2e, 0xd3, 0x7e, 0x43, 0x61, 0xd7, 0x35, 0x8c, 0xe2, 0x27, 0x6b, 0x28, 0xc4, 0x81, 0xe1, 0x4c, + 0x7a, 0x60, 0x98, 0xae, 0x95, 0xd5, 0x6c, 0xad, 0x4c, 0x43, 0x42, 0xec, 0xbb, 0xc4, 0x0d, 0xed, + 0x70, 0x80, 0xaf, 0x16, 0x38, 0xfd, 0xe4, 0x1e, 0xcc, 0x96, 0x73, 0xa7, 0x54, 0x73, 0xb9, 0x53, + 0xaa, 0x93, 0x87, 0x94, 0xf3, 0xcf, 0x66, 0x48, 0xb9, 0xf0, 0x6c, 0x86, 0x94, 0x8b, 0xa7, 0x0c, + 0x29, 0x77, 0x61, 0x9e, 0x51, 0x65, 0xe7, 0x23, 0xda, 0x88, 0xd7, 0x7b, 0x16, 0xc9, 0x33, 0x93, + 0x91, 0x53, 0x47, 0x9f, 0x4b, 0xa7, 0x8f, 0x3e, 0x47, 0x98, 0x45, 0x2e, 0x3f, 0x79, 0x16, 0x79, + 0x1f, 0x54, 0xc6, 0x85, 0x4d, 0x68, 0xd8, 0xbf, 0x91, 0xf8, 0x6b, 0xc6, 0x5a, 0x3a, 0xe3, 0x71, + 0x20, 0x4d, 0x4e, 0xf7, 0xd8, 0x4f, 0x5d, 0x41, 0xda, 0x0f, 0x8c, 0x20, 0xe4, 0x2b, 0xb4, 0x19, + 0x13, 0xf8, 0xd1, 0x7c, 0x45, 0xfc, 0xc4, 0xd5, 0x56, 0xd0, 0xd5, 0x16, 0x63, 0xaa, 0x87, 0x08, + 0x8f, 0x5d, 0x2e, 0x5b, 0x18, 0x5c, 0xcc, 0x2d, 0x0c, 0xc4, 0x7e, 0xad, 0x3a, 0xd4, 0xaf, 0x7d, + 0x0a, 0x0b, 0xb8, 0x75, 0x72, 0xe1, 0x2d, 0x12, 0x1a, 0xb6, 0x13, 0xe0, 0x1b, 0xc2, 0x90, 0x52, + 0x43, 0x23, 0x91, 0x40, 0x9f, 0xa3, 0xf4, 0xef, 0x47, 0xe4, 0x77, 0x18, 0xb5, 0xfa, 0x05, 0x2c, + 0x67, 0xf8, 0x8a, 0xaf, 0x70, 0x6b, 0xa3, 0x3e, 0xff, 0xa4, 0x78, 0x27, 0xcf, 0x71, 0x4d, 0x49, + 0x1e, 0x53, 0xa4, 0xa6, 0x24, 0x4f, 0x28, 0xc5, 0xda, 0x5f, 0x0a, 0x50, 0xc2, 0x8a, 0xe9, 0x09, + 0xa9, 0x30, 0x9d, 0x88, 0xce, 0x67, 0x13, 0xd1, 0x2d, 0x28, 0xa3, 0xb3, 0xf2, 0xdc, 0x3c, 0x36, + 0xea, 0x3f, 0x8b, 0x18, 0x51, 0x94, 0x86, 0xc4, 0x68, 0xc4, 0xfe, 0x22, 0x85, 0x01, 0x86, 0x07, + 0xa2, 0x25, 0x90, 0x59, 0xd0, 0x8a, 0x27, 0x02, 0x45, 0xfc, 0x6e, 0x58, 0xb5, 0xbf, 0x8d, 0x81, + 0x8a, 0xfd, 0x76, 0xfa, 0x5f, 0x02, 0xa7, 0x66, 0xf6, 0xe4, 0xe5, 0x3d, 0x3f, 0xb3, 0xc7, 0xf0, + 0xec, 0xa3, 0xba, 0x60, 0x87, 0xb1, 0xac, 0x1d, 0xea, 0x30, 0x1b, 0x81, 0xc5, 0x9a, 0x92, 0x0f, + 0x30, 0x38, 0x48, 0x18, 0x49, 0x5c, 0x86, 0x4a, 0x84, 0xcf, 0x4b, 0x4c, 0x36, 0xbc, 0x88, 0xd2, + 0x3a, 0x1b, 0x4a, 0xe4, 0x8e, 0xa8, 0xe4, 0xfc, 0x11, 0xd5, 0x0a, 0x94, 0x62, 0x1f, 0x8e, 0x72, + 0x75, 0xbc, 0x70, 0xc6, 0x47, 0xff, 0xcf, 0xe2, 0x7f, 0x48, 0xb0, 0xfc, 0xc8, 0x23, 0x73, 0x19, + 0x6b, 0xca, 0xf5, 0x13, 0x6a, 0xd4, 0x07, 0x48, 0x81, 0x39, 0x91, 0xc5, 0xec, 0xe8, 0xbf, 0x14, + 0xc2, 0xd2, 0xd0, 0x3f, 0x1f, 0x26, 0x87, 0xfe, 0xf9, 0xd0, 0x94, 0x64, 0x49, 0x19, 0x6f, 0x4a, + 0x72, 0x51, 0x91, 0x6b, 0xdf, 0x14, 0x60, 0x86, 0xab, 0xb8, 0x8d, 0xa9, 0xec, 0x59, 0x1d, 0x6f, + 0x6e, 0x12, 0x1d, 0xcb, 0x7f, 0xde, 0xcb, 0xea, 0x20, 0x0d, 0xe9, 0x50, 0xfb, 0x73, 0x01, 0x60, + 0x07, 0xdf, 0x46, 0x9e, 0xa1, 0x3f, 0x0e, 0x49, 0x2a, 0xd4, 0x66, 0x59, 0x19, 0x8b, 0x27, 0xdb, + 0x79, 0x5c, 0x99, 0x60, 0x31, 0x81, 0x4d, 0x67, 0x6b, 0x5f, 0x15, 0x40, 0xde, 0x3e, 0x20, 0xe6, + 0x61, 0xd0, 0xeb, 0x64, 0x25, 0x1f, 0x4f, 0x24, 0xbf, 0x03, 0x13, 0x6d, 0xc7, 0xe8, 0x7b, 0x3e, + 0xca, 0x59, 0xd9, 0xba, 0x76, 0x7a, 0xab, 0x11, 0x71, 0xbc, 0x87, 0x34, 0x3a, 0xa7, 0x4d, 0xfe, + 0x03, 0x34, 0x86, 0x43, 0x10, 0xf6, 0x71, 0xfb, 0xe7, 0xdf, 0x7e, 0x5f, 0x3d, 0xf7, 0xdd, 0xf7, + 0xd5, 0x73, 0x3f, 0x7e, 0x5f, 0x2d, 0x7c, 0x75, 0x5c, 0x2d, 0xfc, 0xe9, 0xb8, 0x5a, 0xf8, 0xeb, + 0x71, 0xb5, 0xf0, 0xed, 0x71, 0xb5, 0xf0, 0x8f, 0xe3, 0x6a, 0xe1, 0x9f, 0xc7, 0xd5, 0x73, 0x3f, + 0x1e, 0x57, 0x0b, 0x5f, 0xff, 0x50, 0x3d, 0xf7, 0xed, 0x0f, 0xd5, 0x73, 0xdf, 0xfd, 0x50, 0x3d, + 0xf7, 0xf9, 0xcd, 0x7d, 0x2f, 0x91, 0xc1, 0xf6, 0x4e, 0xfe, 0x0f, 0xf0, 0xdb, 0xc2, 0xe7, 0xde, + 0x04, 0x06, 0xa9, 0x1b, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x04, 0xad, 0x4b, 0xef, 0x3c, 0x2c, + 0x00, 0x00, } func (this *ShardInfo) Equal(that interface{}) bool { @@ -2847,6 +2856,13 @@ func (this *VisibilityTaskInfo) Equal(that interface{}) bool { } else if !this.VisibilityTime.Equal(*that1.VisibilityTime) { return false } + if that1.CloseTime == nil { + if this.CloseTime != nil { + return false + } + } else if !this.CloseTime.Equal(*that1.CloseTime) { + return false + } return true } func (this *TieredStorageTaskInfo) Equal(that interface{}) bool { @@ -3540,7 +3556,7 @@ func (this *VisibilityTaskInfo) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 11) + s := make([]string, 0, 12) s = append(s, "&persistence.VisibilityTaskInfo{") s = append(s, "NamespaceId: "+fmt.Sprintf("%#v", this.NamespaceId)+",\n") s = append(s, "WorkflowId: "+fmt.Sprintf("%#v", this.WorkflowId)+",\n") @@ -3549,6 +3565,7 @@ func (this *VisibilityTaskInfo) GoString() string { s = append(s, "Version: "+fmt.Sprintf("%#v", this.Version)+",\n") s = append(s, "TaskId: "+fmt.Sprintf("%#v", this.TaskId)+",\n") s = append(s, "VisibilityTime: "+fmt.Sprintf("%#v", this.VisibilityTime)+",\n") + s = append(s, "CloseTime: "+fmt.Sprintf("%#v", this.CloseTime)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -4717,14 +4734,24 @@ func (m *VisibilityTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.VisibilityTime != nil { - n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) + if m.CloseTime != nil { + n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.CloseTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.CloseTime):]) if err26 != nil { return 0, err26 } i -= n26 i = encodeVarintExecutions(dAtA, i, uint64(n26)) i-- + dAtA[i] = 0x42 + } + if m.VisibilityTime != nil { + n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) + if err27 != nil { + return 0, err27 + } + i -= n27 + i = encodeVarintExecutions(dAtA, i, uint64(n27)) + i-- dAtA[i] = 0x3a } if m.TaskId != 0 { @@ -4787,12 +4814,12 @@ func (m *TieredStorageTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.VisibilityTime != nil { - n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) - if err27 != nil { - return 0, err27 + n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) + if err28 != nil { + return 0, err28 } - i -= n27 - i = encodeVarintExecutions(dAtA, i, uint64(n27)) + i -= n28 + i = encodeVarintExecutions(dAtA, i, uint64(n28)) i-- dAtA[i] = 0x3a } @@ -4856,12 +4883,12 @@ func (m *TimerTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.VisibilityTime != nil { - n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) - if err28 != nil { - return 0, err28 + n29, err29 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.VisibilityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime):]) + if err29 != nil { + return 0, err29 } - i -= n28 - i = encodeVarintExecutions(dAtA, i, uint64(n28)) + i -= n29 + i = encodeVarintExecutions(dAtA, i, uint64(n29)) i-- dAtA[i] = 0x5a } @@ -4945,12 +4972,12 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.LastHeartbeatUpdateTime != nil { - n29, err29 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastHeartbeatUpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastHeartbeatUpdateTime):]) - if err29 != nil { - return 0, err29 + n30, err30 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastHeartbeatUpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastHeartbeatUpdateTime):]) + if err30 != nil { + return 0, err30 } - i -= n29 - i = encodeVarintExecutions(dAtA, i, uint64(n29)) + i -= n30 + i = encodeVarintExecutions(dAtA, i, uint64(n30)) i-- dAtA[i] = 0x2 i-- @@ -5029,12 +5056,12 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc9 } if m.RetryExpirationTime != nil { - n32, err32 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.RetryExpirationTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.RetryExpirationTime):]) - if err32 != nil { - return 0, err32 + n33, err33 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.RetryExpirationTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.RetryExpirationTime):]) + if err33 != nil { + return 0, err33 } - i -= n32 - i = encodeVarintExecutions(dAtA, i, uint64(n32)) + i -= n33 + i = encodeVarintExecutions(dAtA, i, uint64(n33)) i-- dAtA[i] = 0x1 i-- @@ -5048,24 +5075,24 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xb8 } if m.RetryMaximumInterval != nil { - n33, err33 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.RetryMaximumInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.RetryMaximumInterval):]) - if err33 != nil { - return 0, err33 + n34, err34 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.RetryMaximumInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.RetryMaximumInterval):]) + if err34 != nil { + return 0, err34 } - i -= n33 - i = encodeVarintExecutions(dAtA, i, uint64(n33)) + i -= n34 + i = encodeVarintExecutions(dAtA, i, uint64(n34)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xb2 } if m.RetryInitialInterval != nil { - n34, err34 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.RetryInitialInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.RetryInitialInterval):]) - if err34 != nil { - return 0, err34 + n35, err35 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.RetryInitialInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.RetryInitialInterval):]) + if err35 != nil { + return 0, err35 } - i -= n34 - i = encodeVarintExecutions(dAtA, i, uint64(n34)) + i -= n35 + i = encodeVarintExecutions(dAtA, i, uint64(n35)) i-- dAtA[i] = 0x1 i-- @@ -5131,43 +5158,43 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x70 } if m.HeartbeatTimeout != nil { - n35, err35 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.HeartbeatTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.HeartbeatTimeout):]) - if err35 != nil { - return 0, err35 - } - i -= n35 - i = encodeVarintExecutions(dAtA, i, uint64(n35)) - i-- - dAtA[i] = 0x6a - } - if m.StartToCloseTimeout != nil { - n36, err36 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.StartToCloseTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.StartToCloseTimeout):]) + n36, err36 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.HeartbeatTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.HeartbeatTimeout):]) if err36 != nil { return 0, err36 } i -= n36 i = encodeVarintExecutions(dAtA, i, uint64(n36)) i-- - dAtA[i] = 0x62 + dAtA[i] = 0x6a } - if m.ScheduleToCloseTimeout != nil { - n37, err37 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.ScheduleToCloseTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.ScheduleToCloseTimeout):]) + if m.StartToCloseTimeout != nil { + n37, err37 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.StartToCloseTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.StartToCloseTimeout):]) if err37 != nil { return 0, err37 } i -= n37 i = encodeVarintExecutions(dAtA, i, uint64(n37)) i-- - dAtA[i] = 0x5a + dAtA[i] = 0x62 } - if m.ScheduleToStartTimeout != nil { - n38, err38 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.ScheduleToStartTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.ScheduleToStartTimeout):]) + if m.ScheduleToCloseTimeout != nil { + n38, err38 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.ScheduleToCloseTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.ScheduleToCloseTimeout):]) if err38 != nil { return 0, err38 } i -= n38 i = encodeVarintExecutions(dAtA, i, uint64(n38)) i-- + dAtA[i] = 0x5a + } + if m.ScheduleToStartTimeout != nil { + n39, err39 := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.ScheduleToStartTimeout, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(*m.ScheduleToStartTimeout):]) + if err39 != nil { + return 0, err39 + } + i -= n39 + i = encodeVarintExecutions(dAtA, i, uint64(n39)) + i-- dAtA[i] = 0x52 } if len(m.RequestId) > 0 { @@ -5185,12 +5212,12 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x42 } if m.StartedTime != nil { - n39, err39 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.StartedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.StartedTime):]) - if err39 != nil { - return 0, err39 + n40, err40 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.StartedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.StartedTime):]) + if err40 != nil { + return 0, err40 } - i -= n39 - i = encodeVarintExecutions(dAtA, i, uint64(n39)) + i -= n40 + i = encodeVarintExecutions(dAtA, i, uint64(n40)) i-- dAtA[i] = 0x3a } @@ -5200,12 +5227,12 @@ func (m *ActivityInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x28 } if m.ScheduledTime != nil { - n40, err40 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ScheduledTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ScheduledTime):]) - if err40 != nil { - return 0, err40 + n41, err41 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ScheduledTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ScheduledTime):]) + if err41 != nil { + return 0, err41 } - i -= n40 - i = encodeVarintExecutions(dAtA, i, uint64(n40)) + i -= n41 + i = encodeVarintExecutions(dAtA, i, uint64(n41)) i-- dAtA[i] = 0x22 } @@ -5255,12 +5282,12 @@ func (m *TimerInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x20 } if m.ExpiryTime != nil { - n41, err41 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ExpiryTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ExpiryTime):]) - if err41 != nil { - return 0, err41 + n42, err42 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ExpiryTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ExpiryTime):]) + if err42 != nil { + return 0, err42 } - i -= n41 - i = encodeVarintExecutions(dAtA, i, uint64(n41)) + i -= n42 + i = encodeVarintExecutions(dAtA, i, uint64(n42)) i-- dAtA[i] = 0x1a } @@ -5972,6 +5999,10 @@ func (m *VisibilityTaskInfo) Size() (n int) { l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.VisibilityTime) n += 1 + l + sovExecutions(uint64(l)) } + if m.CloseTime != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.CloseTime) + n += 1 + l + sovExecutions(uint64(l)) + } return n } @@ -6536,6 +6567,7 @@ func (this *VisibilityTaskInfo) String() string { `Version:` + fmt.Sprintf("%v", this.Version) + `,`, `TaskId:` + fmt.Sprintf("%v", this.TaskId) + `,`, `VisibilityTime:` + strings.Replace(fmt.Sprintf("%v", this.VisibilityTime), "Timestamp", "types.Timestamp", 1) + `,`, + `CloseTime:` + strings.Replace(fmt.Sprintf("%v", this.CloseTime), "Timestamp", "types.Timestamp", 1) + `,`, `}`, }, "") return s @@ -10415,6 +10447,42 @@ func (m *VisibilityTaskInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CloseTime", 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 + } + if m.CloseTime == nil { + m.CloseTime = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.CloseTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipExecutions(dAtA[iNdEx:]) diff --git a/common/persistence/serialization/task_serializer.go b/common/persistence/serialization/task_serializer.go index 76716aab0f4..bc2cc777bc1 100644 --- a/common/persistence/serialization/task_serializer.go +++ b/common/persistence/serialization/task_serializer.go @@ -962,6 +962,7 @@ func (s *TaskSerializer) VisibilityDeleteTaskToProto( Version: deleteVisibilityTask.Version, TaskId: deleteVisibilityTask.TaskID, VisibilityTime: &deleteVisibilityTask.VisibilityTimestamp, + CloseTime: &deleteVisibilityTask.CloseTime, } } @@ -977,6 +978,7 @@ func (s *TaskSerializer) visibilityDeleteTaskFromProto( VisibilityTimestamp: *deleteVisibilityTask.VisibilityTime, TaskID: deleteVisibilityTask.TaskId, Version: deleteVisibilityTask.Version, + CloseTime: *deleteVisibilityTask.CloseTime, } } diff --git a/common/persistence/visibility/manager/visibility_manager.go b/common/persistence/visibility/manager/visibility_manager.go index 70f9b5f91e0..a616eb296d2 100644 --- a/common/persistence/visibility/manager/visibility_manager.go +++ b/common/persistence/visibility/manager/visibility_manager.go @@ -167,6 +167,7 @@ type ( RunID string WorkflowID string TaskID int64 + CloseTime time.Time } ) diff --git a/common/persistence/visibility/store/standard/cassandra/visibility_store.go b/common/persistence/visibility/store/standard/cassandra/visibility_store.go index dd9e3ddaadd..277be705209 100644 --- a/common/persistence/visibility/store/standard/cassandra/visibility_store.go +++ b/common/persistence/visibility/store/standard/cassandra/visibility_store.go @@ -45,11 +45,6 @@ const ( cassandraPersistenceName = "cassandra" ) -var ( - minTime = time.Unix(0, 0).UTC() - maxTime = time.Date(2100, 1, 1, 1, 0, 0, 0, time.UTC) -) - const ( templateCreateWorkflowExecutionStarted = `INSERT INTO open_executions (` + `namespace_id, namespace_partition, workflow_id, run_id, start_time, execution_time, workflow_type_name, memo, encoding, task_queue) ` + @@ -438,42 +433,10 @@ func (v *visibilityStore) ListClosedWorkflowExecutionsByStatus( } func (v *visibilityStore) DeleteWorkflowExecution(request *manager.VisibilityDeleteWorkflowExecutionRequest) error { - // Primary key in closed_execution table has close_time which is not in the request. - // Query closed_execution table first (using secondary index by workflow_id) to get close_time. - // This is not very efficient if workflow has multiple executions. - query := v.session. - Query(templateGetClosedWorkflowExecutionsByID, - request.NamespaceID.String(), - namespacePartition, - persistence.UnixMilliseconds(minTime), - persistence.UnixMilliseconds(maxTime), - request.WorkflowID). - PageSize(0). - Consistency(v.lowConslevel) - iter := query.Iter() - - wfExecution, has := readClosedWorkflowExecutionRecord(iter) - var wfExecutionToDelete *store.InternalWorkflowExecutionInfo - for has { - if wfExecution.RunID == request.RunID { - wfExecutionToDelete = wfExecution - break - } - wfExecution, has = readClosedWorkflowExecutionRecord(iter) - } - - if err := iter.Close(); err != nil { - return gocql.ConvertError("DeleteWorkflowExecution", err) - } - - if wfExecutionToDelete == nil { - return nil - } - - query = v.session.Query(templateDeleteWorkflowExecutionClosed, + query := v.session.Query(templateDeleteWorkflowExecutionClosed, request.NamespaceID.String(), namespacePartition, - wfExecution.CloseTime, + persistence.UnixMilliseconds(request.CloseTime), request.RunID). Consistency(v.lowConslevel) if err := query.Exec(); err != nil { diff --git a/proto/internal/temporal/server/api/persistence/v1/executions.proto b/proto/internal/temporal/server/api/persistence/v1/executions.proto index 9c6b27f3f39..02b3c45d1b9 100644 --- a/proto/internal/temporal/server/api/persistence/v1/executions.proto +++ b/proto/internal/temporal/server/api/persistence/v1/executions.proto @@ -188,6 +188,7 @@ message VisibilityTaskInfo { int64 version = 5; int64 task_id = 6; google.protobuf.Timestamp visibility_time = 7 [(gogoproto.stdtime) = true]; + google.protobuf.Timestamp close_time = 8 [(gogoproto.stdtime) = true]; } // tiered_storage_task_data column diff --git a/service/history/shard/context.go b/service/history/shard/context.go index a45d2dacd49..a4ff1f2f1f6 100644 --- a/service/history/shard/context.go +++ b/service/history/shard/context.go @@ -119,7 +119,7 @@ type ( ConflictResolveWorkflowExecution(request *persistence.ConflictResolveWorkflowExecutionRequest) (*persistence.ConflictResolveWorkflowExecutionResponse, error) // Delete workflow execution, current workflow execution, and add task to delete visibility. // If branchToken != nil, then delete history also, otherwise leave history. - DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64) error + DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime time.Time) error AddTasks(request *persistence.AddTasksRequest) error AppendHistoryEvents(request *persistence.AppendHistoryNodesRequest, namespaceID namespace.ID, execution commonpb.WorkflowExecution) (int, error) diff --git a/service/history/shard/context_impl.go b/service/history/shard/context_impl.go index cebbaa376e3..719335fc627 100644 --- a/service/history/shard/context_impl.go +++ b/service/history/shard/context_impl.go @@ -785,6 +785,7 @@ func (s *ContextImpl) DeleteWorkflowExecution( key definition.WorkflowKey, branchToken []byte, newTaskVersion int64, + closeTime time.Time, ) error { if err := s.errorByState(); err != nil { return err @@ -856,6 +857,7 @@ func (s *ContextImpl) DeleteWorkflowExecution( WorkflowKey: key, VisibilityTimestamp: s.timeSource.Now(), Version: newTaskVersion, + CloseTime: closeTime, }}, } err = s.addTasksLocked(addTasksRequest, namespaceEntry) diff --git a/service/history/shard/context_mock.go b/service/history/shard/context_mock.go index 9da0949f1aa..f319480b3f3 100644 --- a/service/history/shard/context_mock.go +++ b/service/history/shard/context_mock.go @@ -161,17 +161,17 @@ func (mr *MockContextMockRecorder) DeleteTransferFailoverLevel(failoverID interf } // DeleteWorkflowExecution mocks base method. -func (m *MockContext) DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64) error { +func (m *MockContext) DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime time.Time) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteWorkflowExecution", workflowKey, branchToken, version) + ret := m.ctrl.Call(m, "DeleteWorkflowExecution", workflowKey, branchToken, version, closeTime) ret0, _ := ret[0].(error) return ret0 } // DeleteWorkflowExecution indicates an expected call of DeleteWorkflowExecution. -func (mr *MockContextMockRecorder) DeleteWorkflowExecution(workflowKey, branchToken, version interface{}) *gomock.Call { +func (mr *MockContextMockRecorder) DeleteWorkflowExecution(workflowKey, branchToken, version, closeTime interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkflowExecution", reflect.TypeOf((*MockContext)(nil).DeleteWorkflowExecution), workflowKey, branchToken, version) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkflowExecution", reflect.TypeOf((*MockContext)(nil).DeleteWorkflowExecution), workflowKey, branchToken, version, closeTime) } // GenerateTransferTaskID mocks base method. diff --git a/service/history/tasks/delete_visibility_task.go b/service/history/tasks/delete_visibility_task.go index 058a188d238..c5770aac123 100644 --- a/service/history/tasks/delete_visibility_task.go +++ b/service/history/tasks/delete_visibility_task.go @@ -36,6 +36,7 @@ type ( VisibilityTimestamp time.Time TaskID int64 Version int64 + CloseTime time.Time } ) diff --git a/service/history/visibilityQueueTaskExecutor.go b/service/history/visibilityQueueTaskExecutor.go index d4082dd619a..23531fbf770 100644 --- a/service/history/visibilityQueueTaskExecutor.go +++ b/service/history/visibilityQueueTaskExecutor.go @@ -474,6 +474,7 @@ func (t *visibilityQueueTaskExecutor) processDeleteExecution( WorkflowID: task.WorkflowID, RunID: task.RunID, TaskID: task.TaskID, + CloseTime: task.CloseTime, } return t.visibilityMgr.DeleteWorkflowExecution(request) } From 42459a09640bd185e094f06a6aa97e2d73e501ff Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Fri, 21 Jan 2022 23:09:49 -0800 Subject: [PATCH 4/7] Use close time instead of query --- service/history/workflow/delete_manager.go | 7 +++++ .../history/workflow/delete_manager_test.go | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/service/history/workflow/delete_manager.go b/service/history/workflow/delete_manager.go index 58533da4912..f68d0e4e8f0 100644 --- a/service/history/workflow/delete_manager.go +++ b/service/history/workflow/delete_manager.go @@ -157,6 +157,12 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( // currentBranchToken == nil means don't delete history. currentBranchToken = nil } + + completionEvent, err := ms.GetCompletionEvent() + if err != nil { + return err + } + if err := m.shard.DeleteWorkflowExecution( definition.WorkflowKey{ NamespaceID: namespaceID.String(), @@ -165,6 +171,7 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( }, currentBranchToken, newTaskVersion, + *completionEvent.GetEventTime(), ); err != nil { return err } diff --git a/service/history/workflow/delete_manager_test.go b/service/history/workflow/delete_manager_test.go index c035a1b7144..748921e59b5 100644 --- a/service/history/workflow/delete_manager_test.go +++ b/service/history/workflow/delete_manager_test.go @@ -27,12 +27,15 @@ package workflow import ( "errors" "testing" + "time" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" commonpb "go.temporal.io/api/common/v1" "go.temporal.io/api/enums/v1" + enumspb "go.temporal.io/api/enums/v1" + historypb "go.temporal.io/api/history/v1" "go.temporal.io/api/serviceerror" persistencespb "go.temporal.io/server/api/persistence/v1" @@ -107,6 +110,13 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution() { mockMutableState := NewMockMutableState(s.controller) mockMutableState.EXPECT().IsWorkflowExecutionRunning().Return(false) mockMutableState.EXPECT().GetCurrentBranchToken().Return([]byte{22, 8, 78}, nil) + closeTime := time.Date(1978, 8, 22, 1, 2, 3, 4, time.UTC) + completionEvent := &historypb.HistoryEvent{ + EventId: int64(1), + EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED, + EventTime: &closeTime, + } + mockMutableState.EXPECT().GetCompletionEvent().Return(completionEvent, nil) s.mockShardContext.EXPECT().DeleteWorkflowExecution( definition.WorkflowKey{ @@ -116,6 +126,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution() { }, []byte{22, 8, 78}, int64(1), + closeTime, ).Return(nil) mockWeCtx.EXPECT().Clear() @@ -139,6 +150,13 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution_Error() mockMutableState := NewMockMutableState(s.controller) mockMutableState.EXPECT().IsWorkflowExecutionRunning().Return(false) mockMutableState.EXPECT().GetCurrentBranchToken().Return([]byte{22, 8, 78}, nil) + closeTime := time.Date(1978, 8, 22, 1, 2, 3, 4, time.UTC) + completionEvent := &historypb.HistoryEvent{ + EventId: int64(1), + EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED, + EventTime: &closeTime, + } + mockMutableState.EXPECT().GetCompletionEvent().Return(completionEvent, nil) s.mockShardContext.EXPECT().DeleteWorkflowExecution( definition.WorkflowKey{ @@ -148,6 +166,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution_Error() }, []byte{22, 8, 78}, int64(1), + closeTime, ).Return(serviceerror.NewInternal("test error")) err := s.deleteManager.DeleteWorkflowExecution( @@ -171,6 +190,13 @@ func (s *deleteManagerWorkflowSuite) TestDeleteWorkflowExecutionRetention_Archiv mockMutableState.EXPECT().IsWorkflowExecutionRunning().Return(false) mockMutableState.EXPECT().GetCurrentBranchToken().Return([]byte{22, 8, 78}, nil) + closeTime := time.Date(1978, 8, 22, 1, 2, 3, 4, time.UTC) + completionEvent := &historypb.HistoryEvent{ + EventId: int64(1), + EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED, + EventTime: &closeTime, + } + mockMutableState.EXPECT().GetCompletionEvent().Return(completionEvent, nil) // ====================== Archival mocks ======================================= mockNamespaceRegistry := namespace.NewMockRegistry(s.controller) @@ -212,6 +238,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteWorkflowExecutionRetention_Archiv }, nil, int64(1), + closeTime, ).Return(nil) mockWeCtx.EXPECT().Clear() From 26aeb85986e0385981ffb886a1067af9fa3603c0 Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Mon, 24 Jan 2022 13:45:34 -0800 Subject: [PATCH 5/7] Fix nDC integration tests --- host/ndc/ndc_integration_test.go | 61 ++++++++++++++++++++++ service/history/workflow/delete_manager.go | 7 ++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/host/ndc/ndc_integration_test.go b/host/ndc/ndc_integration_test.go index d2ec7a064c4..b4ff59f3132 100644 --- a/host/ndc/ndc_integration_test.go +++ b/host/ndc/ndc_integration_test.go @@ -390,6 +390,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 1, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_STARTED, Attributes: &historypb.HistoryEvent_WorkflowExecutionStartedEventAttributes{WorkflowExecutionStartedEventAttributes: &historypb.WorkflowExecutionStartedEventAttributes{ @@ -404,6 +405,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 2, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -416,6 +418,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 3, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -428,6 +431,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 4, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -438,6 +442,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 5, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_MARKER_RECORDED, Attributes: &historypb.HistoryEvent_MarkerRecordedEventAttributes{MarkerRecordedEventAttributes: &historypb.MarkerRecordedEventAttributes{ @@ -450,6 +455,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 6, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_ActivityTaskScheduledEventAttributes{ActivityTaskScheduledEventAttributes: &historypb.ActivityTaskScheduledEventAttributes{ @@ -468,6 +474,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 7, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_STARTED, Attributes: &historypb.HistoryEvent_ActivityTaskStartedEventAttributes{ActivityTaskStartedEventAttributes: &historypb.ActivityTaskStartedEventAttributes{ @@ -481,6 +488,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 8, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -491,6 +499,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 9, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -503,6 +512,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 10, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -515,6 +525,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 11, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -525,6 +536,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 12, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -535,6 +547,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 13, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -545,6 +558,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 14, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -560,6 +574,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 32, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT, Attributes: &historypb.HistoryEvent_WorkflowExecutionTimedOutEventAttributes{WorkflowExecutionTimedOutEventAttributes: &historypb.WorkflowExecutionTimedOutEventAttributes{ @@ -573,6 +588,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT, Attributes: &historypb.HistoryEvent_WorkflowTaskTimedOutEventAttributes{WorkflowTaskTimedOutEventAttributes: &historypb.WorkflowTaskTimedOutEventAttributes{ @@ -583,6 +599,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 16, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT, Attributes: &historypb.HistoryEvent_ActivityTaskTimedOutEventAttributes{ActivityTaskTimedOutEventAttributes: &historypb.ActivityTaskTimedOutEventAttributes{ @@ -597,6 +614,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 17, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -609,6 +627,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 18, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -621,6 +640,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { {Events: []*historypb.HistoryEvent{ { EventId: 19, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -631,6 +651,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranches() { }, { EventId: 20, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED, Attributes: &historypb.HistoryEvent_WorkflowExecutionFailedEventAttributes{WorkflowExecutionFailedEventAttributes: &historypb.WorkflowExecutionFailedEventAttributes{ @@ -701,6 +722,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 1, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_STARTED, Attributes: &historypb.HistoryEvent_WorkflowExecutionStartedEventAttributes{WorkflowExecutionStartedEventAttributes: &historypb.WorkflowExecutionStartedEventAttributes{ @@ -715,6 +737,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 2, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -727,6 +750,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 3, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -739,6 +763,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 4, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -749,6 +774,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 5, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_MARKER_RECORDED, Attributes: &historypb.HistoryEvent_MarkerRecordedEventAttributes{MarkerRecordedEventAttributes: &historypb.MarkerRecordedEventAttributes{ @@ -761,6 +787,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 6, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_ActivityTaskScheduledEventAttributes{ActivityTaskScheduledEventAttributes: &historypb.ActivityTaskScheduledEventAttributes{ @@ -779,6 +806,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 7, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_STARTED, Attributes: &historypb.HistoryEvent_ActivityTaskStartedEventAttributes{ActivityTaskStartedEventAttributes: &historypb.ActivityTaskStartedEventAttributes{ @@ -792,6 +820,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 8, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -802,6 +831,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 9, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -814,6 +844,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 10, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -826,6 +857,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 11, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -836,6 +868,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 12, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -846,6 +879,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 13, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -856,6 +890,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 14, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -871,6 +906,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 33, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -887,6 +923,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -897,6 +934,7 @@ func (s *nDCIntegrationTestSuite) TestHandcraftedMultipleBranchesWithZombieConti }, { EventId: 16, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW, Attributes: &historypb.HistoryEvent_WorkflowExecutionContinuedAsNewEventAttributes{WorkflowExecutionContinuedAsNewEventAttributes: &historypb.WorkflowExecutionContinuedAsNewEventAttributes{ @@ -1186,6 +1224,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 1, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_STARTED, Attributes: &historypb.HistoryEvent_WorkflowExecutionStartedEventAttributes{WorkflowExecutionStartedEventAttributes: &historypb.WorkflowExecutionStartedEventAttributes{ @@ -1200,6 +1239,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 2, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -1212,6 +1252,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 3, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -1224,6 +1265,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 4, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -1234,6 +1276,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 5, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_MARKER_RECORDED, Attributes: &historypb.HistoryEvent_MarkerRecordedEventAttributes{MarkerRecordedEventAttributes: &historypb.MarkerRecordedEventAttributes{ @@ -1246,6 +1289,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 6, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_ActivityTaskScheduledEventAttributes{ActivityTaskScheduledEventAttributes: &historypb.ActivityTaskScheduledEventAttributes{ @@ -1264,6 +1308,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 7, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_STARTED, Attributes: &historypb.HistoryEvent_ActivityTaskStartedEventAttributes{ActivityTaskStartedEventAttributes: &historypb.ActivityTaskStartedEventAttributes{ @@ -1277,6 +1322,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 8, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -1287,6 +1333,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 9, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -1299,6 +1346,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 10, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -1311,6 +1359,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 11, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -1321,6 +1370,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 12, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED, Attributes: &historypb.HistoryEvent_WorkflowExecutionSignaledEventAttributes{WorkflowExecutionSignaledEventAttributes: &historypb.WorkflowExecutionSignaledEventAttributes{ @@ -1331,6 +1381,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 13, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -1341,6 +1392,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 14, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 22, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -1356,6 +1408,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 32, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -1366,6 +1419,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 16, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 32, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_ActivityTaskScheduledEventAttributes{ActivityTaskScheduledEventAttributes: &historypb.ActivityTaskScheduledEventAttributes{ @@ -1387,6 +1441,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 15, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT, Attributes: &historypb.HistoryEvent_WorkflowTaskTimedOutEventAttributes{WorkflowTaskTimedOutEventAttributes: &historypb.WorkflowTaskTimedOutEventAttributes{ @@ -1397,6 +1452,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 16, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT, Attributes: &historypb.HistoryEvent_ActivityTaskTimedOutEventAttributes{ActivityTaskTimedOutEventAttributes: &historypb.ActivityTaskTimedOutEventAttributes{ @@ -1411,6 +1467,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 17, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED, Attributes: &historypb.HistoryEvent_WorkflowTaskScheduledEventAttributes{WorkflowTaskScheduledEventAttributes: &historypb.WorkflowTaskScheduledEventAttributes{ @@ -1423,6 +1480,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 18, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED, Attributes: &historypb.HistoryEvent_WorkflowTaskStartedEventAttributes{WorkflowTaskStartedEventAttributes: &historypb.WorkflowTaskStartedEventAttributes{ @@ -1435,6 +1493,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 19, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED, Attributes: &historypb.HistoryEvent_WorkflowTaskCompletedEventAttributes{WorkflowTaskCompletedEventAttributes: &historypb.WorkflowTaskCompletedEventAttributes{ @@ -1445,6 +1504,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { }, { EventId: 20, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 31, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED, Attributes: &historypb.HistoryEvent_WorkflowExecutionFailedEventAttributes{WorkflowExecutionFailedEventAttributes: &historypb.WorkflowExecutionFailedEventAttributes{ @@ -1459,6 +1519,7 @@ func (s *nDCIntegrationTestSuite) TestAdminGetWorkflowExecutionRawHistoryV2() { {Events: []*historypb.HistoryEvent{ { EventId: 17, + EventTime: timestamp.TimePtr(time.Now().UTC()), Version: 33, EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT, Attributes: &historypb.HistoryEvent_WorkflowExecutionTimedOutEventAttributes{WorkflowExecutionTimedOutEventAttributes: &historypb.WorkflowExecutionTimedOutEventAttributes{ diff --git a/service/history/workflow/delete_manager.go b/service/history/workflow/delete_manager.go index f68d0e4e8f0..bdd0eddb87d 100644 --- a/service/history/workflow/delete_manager.go +++ b/service/history/workflow/delete_manager.go @@ -162,6 +162,11 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( if err != nil { return err } + closeTime := completionEvent.GetEventTime() + if closeTime == nil { + // This should never happen unless wrongly created synthetic workflow history in tests. + panic("completion event doesn't have event time set") + } if err := m.shard.DeleteWorkflowExecution( definition.WorkflowKey{ @@ -171,7 +176,7 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( }, currentBranchToken, newTaskVersion, - *completionEvent.GetEventTime(), + *closeTime, ); err != nil { return err } From 3433a314b9df195646784e05d39882f49768bab4 Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Mon, 24 Jan 2022 14:11:05 -0800 Subject: [PATCH 6/7] Convert CloseTime to pointer --- common/persistence/serialization/task_serializer.go | 4 ++-- .../visibility_persistence_suite_test.go | 10 ++++++---- service/history/shard/context.go | 2 +- service/history/shard/context_impl.go | 2 +- service/history/shard/context_mock.go | 2 +- service/history/tasks/delete_visibility_task.go | 2 +- service/history/visibilityQueueTaskExecutor.go | 8 +++++++- service/history/workflow/delete_manager.go | 7 +------ 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/common/persistence/serialization/task_serializer.go b/common/persistence/serialization/task_serializer.go index bc2cc777bc1..2a0edf1ec6c 100644 --- a/common/persistence/serialization/task_serializer.go +++ b/common/persistence/serialization/task_serializer.go @@ -962,7 +962,7 @@ func (s *TaskSerializer) VisibilityDeleteTaskToProto( Version: deleteVisibilityTask.Version, TaskId: deleteVisibilityTask.TaskID, VisibilityTime: &deleteVisibilityTask.VisibilityTimestamp, - CloseTime: &deleteVisibilityTask.CloseTime, + CloseTime: deleteVisibilityTask.CloseTime, } } @@ -978,7 +978,7 @@ func (s *TaskSerializer) visibilityDeleteTaskFromProto( VisibilityTimestamp: *deleteVisibilityTask.VisibilityTime, TaskID: deleteVisibilityTask.TaskId, Version: deleteVisibilityTask.Version, - CloseTime: *deleteVisibilityTask.CloseTime, + CloseTime: deleteVisibilityTask.CloseTime, } } diff --git a/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go b/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go index 1a08072fdf3..4984790cba3 100644 --- a/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go +++ b/common/persistence/visibility/persistence-tests/visibility_persistence_suite_test.go @@ -508,7 +508,8 @@ func (s *VisibilityPersistenceSuite) TestFilteringByStatus() { func (s *VisibilityPersistenceSuite) TestDelete() { nRows := 5 testNamespaceUUID := namespace.ID(uuid.New()) - startTime := time.Now().UTC().Add(time.Second * -5) + closeTime := time.Now().UTC() + startTime := closeTime.Add(-5 * time.Second) for i := 0; i < nRows; i++ { workflowExecution := commonpb.WorkflowExecution{ WorkflowId: uuid.New(), @@ -531,7 +532,7 @@ func (s *VisibilityPersistenceSuite) TestDelete() { StartTime: startTime, Status: enumspb.WORKFLOW_EXECUTION_STATUS_FAILED, }, - CloseTime: time.Now(), + CloseTime: closeTime, HistoryLength: 3, } err1 := s.VisibilityMgr.RecordWorkflowExecutionClosed(closeReq) @@ -541,7 +542,7 @@ func (s *VisibilityPersistenceSuite) TestDelete() { resp, err3 := s.VisibilityMgr.ListClosedWorkflowExecutions(&manager.ListWorkflowExecutionsRequest{ NamespaceID: testNamespaceUUID, EarliestStartTime: startTime, - LatestStartTime: time.Now(), + LatestStartTime: closeTime, PageSize: 10, }) s.Nil(err3) @@ -553,13 +554,14 @@ func (s *VisibilityPersistenceSuite) TestDelete() { NamespaceID: testNamespaceUUID, WorkflowID: row.GetExecution().GetWorkflowId(), RunID: row.GetExecution().GetRunId(), + CloseTime: closeTime, }) s.Nil(err4) remaining-- resp, err5 := s.VisibilityMgr.ListClosedWorkflowExecutions(&manager.ListWorkflowExecutionsRequest{ NamespaceID: testNamespaceUUID, EarliestStartTime: startTime, - LatestStartTime: time.Now(), + LatestStartTime: closeTime, PageSize: 10, }) s.Nil(err5) diff --git a/service/history/shard/context.go b/service/history/shard/context.go index a4ff1f2f1f6..213188f6317 100644 --- a/service/history/shard/context.go +++ b/service/history/shard/context.go @@ -119,7 +119,7 @@ type ( ConflictResolveWorkflowExecution(request *persistence.ConflictResolveWorkflowExecutionRequest) (*persistence.ConflictResolveWorkflowExecutionResponse, error) // Delete workflow execution, current workflow execution, and add task to delete visibility. // If branchToken != nil, then delete history also, otherwise leave history. - DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime time.Time) error + DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime *time.Time) error AddTasks(request *persistence.AddTasksRequest) error AppendHistoryEvents(request *persistence.AppendHistoryNodesRequest, namespaceID namespace.ID, execution commonpb.WorkflowExecution) (int, error) diff --git a/service/history/shard/context_impl.go b/service/history/shard/context_impl.go index 719335fc627..45143e5a625 100644 --- a/service/history/shard/context_impl.go +++ b/service/history/shard/context_impl.go @@ -785,7 +785,7 @@ func (s *ContextImpl) DeleteWorkflowExecution( key definition.WorkflowKey, branchToken []byte, newTaskVersion int64, - closeTime time.Time, + closeTime *time.Time, ) error { if err := s.errorByState(); err != nil { return err diff --git a/service/history/shard/context_mock.go b/service/history/shard/context_mock.go index f319480b3f3..3bd26cafaaa 100644 --- a/service/history/shard/context_mock.go +++ b/service/history/shard/context_mock.go @@ -161,7 +161,7 @@ func (mr *MockContextMockRecorder) DeleteTransferFailoverLevel(failoverID interf } // DeleteWorkflowExecution mocks base method. -func (m *MockContext) DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime time.Time) error { +func (m *MockContext) DeleteWorkflowExecution(workflowKey definition.WorkflowKey, branchToken []byte, version int64, closeTime *time.Time) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteWorkflowExecution", workflowKey, branchToken, version, closeTime) ret0, _ := ret[0].(error) diff --git a/service/history/tasks/delete_visibility_task.go b/service/history/tasks/delete_visibility_task.go index c5770aac123..b3b1043ecda 100644 --- a/service/history/tasks/delete_visibility_task.go +++ b/service/history/tasks/delete_visibility_task.go @@ -36,7 +36,7 @@ type ( VisibilityTimestamp time.Time TaskID int64 Version int64 - CloseTime time.Time + CloseTime *time.Time } ) diff --git a/service/history/visibilityQueueTaskExecutor.go b/service/history/visibilityQueueTaskExecutor.go index 23531fbf770..4e36fd6f40f 100644 --- a/service/history/visibilityQueueTaskExecutor.go +++ b/service/history/visibilityQueueTaskExecutor.go @@ -469,12 +469,18 @@ func (t *visibilityQueueTaskExecutor) recordCloseExecution( func (t *visibilityQueueTaskExecutor) processDeleteExecution( task *tasks.DeleteExecutionVisibilityTask, ) (retError error) { + if task.CloseTime == nil { + // CloseTime is not set for workflow executions with TTL (old version). + // They will be deleted using Cassandra TTL and this task should be ignored. + return nil + } + request := &manager.VisibilityDeleteWorkflowExecutionRequest{ NamespaceID: namespace.ID(task.NamespaceID), WorkflowID: task.WorkflowID, RunID: task.RunID, TaskID: task.TaskID, - CloseTime: task.CloseTime, + CloseTime: *task.CloseTime, } return t.visibilityMgr.DeleteWorkflowExecution(request) } diff --git a/service/history/workflow/delete_manager.go b/service/history/workflow/delete_manager.go index bdd0eddb87d..f51b891ccbb 100644 --- a/service/history/workflow/delete_manager.go +++ b/service/history/workflow/delete_manager.go @@ -162,11 +162,6 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( if err != nil { return err } - closeTime := completionEvent.GetEventTime() - if closeTime == nil { - // This should never happen unless wrongly created synthetic workflow history in tests. - panic("completion event doesn't have event time set") - } if err := m.shard.DeleteWorkflowExecution( definition.WorkflowKey{ @@ -176,7 +171,7 @@ func (m *DeleteManagerImpl) deleteWorkflowExecutionInternal( }, currentBranchToken, newTaskVersion, - *closeTime, + completionEvent.GetEventTime(), ); err != nil { return err } From 4e9eb880db7ca29a4f14363fa48130f69cd375a5 Mon Sep 17 00:00:00 2001 From: Alex Shtin Date: Mon, 24 Jan 2022 14:16:26 -0800 Subject: [PATCH 7/7] Fix tests --- service/history/workflow/delete_manager_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service/history/workflow/delete_manager_test.go b/service/history/workflow/delete_manager_test.go index 748921e59b5..6bece03e004 100644 --- a/service/history/workflow/delete_manager_test.go +++ b/service/history/workflow/delete_manager_test.go @@ -126,7 +126,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution() { }, []byte{22, 8, 78}, int64(1), - closeTime, + &closeTime, ).Return(nil) mockWeCtx.EXPECT().Clear() @@ -166,7 +166,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteDeletedWorkflowExecution_Error() }, []byte{22, 8, 78}, int64(1), - closeTime, + &closeTime, ).Return(serviceerror.NewInternal("test error")) err := s.deleteManager.DeleteWorkflowExecution( @@ -238,7 +238,7 @@ func (s *deleteManagerWorkflowSuite) TestDeleteWorkflowExecutionRetention_Archiv }, nil, int64(1), - closeTime, + &closeTime, ).Return(nil) mockWeCtx.EXPECT().Clear()