Files
tasks/service/history/workflow/mutable_state_util.go
Stephan BehnkeandGitHub b43c4b0f8e Enforce import alias for protobufs (#6968)
## What changed?
<!-- Describe what has changed in this PR -->

Linter to enforce import aliases for protobuf imports.

Enforced rules across entire codebase.

## Why?
<!-- Tell your future self why have you made these changes -->

Consistency. Relief reviewers from pointing it out.

We had 100+ violations.

## How did you test it?
<!-- How have you verified this change? Tested locally? Added a unit
test? Checked in staging env? -->

Running
```
make lint-code
.bin/golangci-lint-dafd65537336fdce063c492a7ab2a68cc89f8d52 run --config=.golangci.yml | grep importas
```

comes up empty (compared to say `grep typecheck`).

Plus compiler and tests ofc.

## Potential risks
<!-- Assuming the worst case, what can be broken when deploying this
change to production? -->

Me smuggling in an easter egg into the code (I didn't, I swear 🙃)

## Documentation
<!-- Have you made sure this change doesn't falsify anything currently
stated in `docs/`? If significant
new behavior is added, have you described that in `docs/`? -->

## Is hotfix candidate?
<!-- Is this PR a hotfix candidate or does it require a notification to
be sent to the broader community? (Yes/No) -->
2024-12-12 12:45:30 -08:00

101 lines
3.7 KiB
Go

// The MIT License
//
// Copyright (c) 2020 Temporal Technologies Inc. All rights reserved.
//
// Copyright (c) 2020 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package workflow
import (
"time"
persistencespb "go.temporal.io/server/api/persistence/v1"
"go.temporal.io/server/common"
"go.temporal.io/server/common/definition"
"go.temporal.io/server/service/history/tasks"
)
func convertSyncActivityInfos(
now time.Time,
workflowKey definition.WorkflowKey,
activityInfos map[int64]*persistencespb.ActivityInfo,
inputs map[int64]struct{},
) []tasks.Task {
outputs := make([]tasks.Task, 0, len(inputs))
for item := range inputs {
activityInfo, ok := activityInfos[item]
if ok {
outputs = append(outputs, &tasks.SyncActivityTask{
WorkflowKey: workflowKey,
Version: activityInfo.Version,
ScheduledEventID: activityInfo.ScheduledEventId,
VisibilityTimestamp: now,
})
}
}
return outputs
}
func SanitizeMutableState(
workflowMutableState *persistencespb.WorkflowMutableState,
) error {
// Some values stored in mutable state are cluster or shard specific.
// E.g task status (if task is created or not), taskID (derived from shard rangeID), txnID (derived from shard rangeID), etc.
// Those fields should not be replicated across clusters and should be sanitized.
workflowMutableState.ExecutionInfo.WorkflowExecutionTimerTaskStatus = TimerTaskStatusNone
workflowMutableState.ExecutionInfo.LastFirstEventTxnId = common.EmptyEventTaskID
workflowMutableState.ExecutionInfo.CloseVisibilityTaskId = common.EmptyEventTaskID
workflowMutableState.ExecutionInfo.CloseTransferTaskId = common.EmptyEventTaskID
// TODO: after adding cluster to clock info, no need to reset clock here
workflowMutableState.ExecutionInfo.ParentClock = nil
for _, childExecutionInfo := range workflowMutableState.ChildExecutionInfos {
childExecutionInfo.Clock = nil
}
// Timer tasks are generated locally, do not sync them.
workflowMutableState.ExecutionInfo.StateMachineTimers = nil
workflowMutableState.ExecutionInfo.TaskGenerationShardClockTimestamp = common.EmptyEventTaskID
rootNode := persistencespb.StateMachineNode{
Children: workflowMutableState.ExecutionInfo.SubStateMachinesByType,
}
SanitizeStateMachineNode(&rootNode)
return nil
}
func SanitizeStateMachineNode(
node *persistencespb.StateMachineNode,
) {
if node == nil {
return
}
// Node TransitionCount is cluster local information used for detecting staleness.
// Reset it to 1 since we are creating a new mutable state.
node.TransitionCount = 1
for _, stateMachineMap := range node.Children {
for _, childNode := range stateMachineMap.MachinesById {
SanitizeStateMachineNode(childNode)
}
}
}