mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
## What changed? Make import formatting a part of the build, and test validity with "ensure-no-changes" target ## Why? So we never discuss import order again (hopefully) ## How did you test it? its a build change, so the build will test it! ## Potential risks As long as build works, the only thing I risk is the ire of coworker who want imports to be different ;) ## Documentation N/A ## Is hotfix candidate? No
131 lines
4.8 KiB
Go
131 lines
4.8 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 persistence
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
historypb "go.temporal.io/api/history/v1"
|
|
persistencespb "go.temporal.io/server/api/persistence/v1"
|
|
)
|
|
|
|
// ReadFullPageEvents reads a full page of history events from ExecutionManager. Due to storage format of V2 History
|
|
// it is not guaranteed that pageSize amount of data is returned. Function returns the list of history events, the size
|
|
// of data read, the next page token, and an error if present.
|
|
func ReadFullPageEvents(
|
|
ctx context.Context,
|
|
executionMgr ExecutionManager,
|
|
req *ReadHistoryBranchRequest,
|
|
) ([]*historypb.HistoryEvent, int, []byte, error) {
|
|
var historyEvents []*historypb.HistoryEvent
|
|
size := 0
|
|
for {
|
|
response, err := executionMgr.ReadHistoryBranch(ctx, req)
|
|
if err != nil {
|
|
return nil, 0, nil, err
|
|
}
|
|
historyEvents = append(historyEvents, response.HistoryEvents...)
|
|
size += response.Size
|
|
if len(historyEvents) >= req.PageSize || len(response.NextPageToken) == 0 {
|
|
return historyEvents, size, response.NextPageToken, nil
|
|
}
|
|
req.NextPageToken = response.NextPageToken
|
|
}
|
|
}
|
|
|
|
// ReadFullPageEventsByBatch reads a full page of history events by batch from ExecutionManager. Due to storage format of V2 History
|
|
// it is not guaranteed that pageSize amount of data is returned. Function returns the list of history batches, the size
|
|
// of data read, the next page token, and an error if present.
|
|
func ReadFullPageEventsByBatch(
|
|
ctx context.Context,
|
|
executionMgr ExecutionManager,
|
|
req *ReadHistoryBranchRequest,
|
|
) ([]*historypb.History, int, []byte, error) {
|
|
var historyBatches []*historypb.History
|
|
eventsRead := 0
|
|
size := 0
|
|
for {
|
|
response, err := executionMgr.ReadHistoryBranchByBatch(ctx, req)
|
|
if err != nil {
|
|
return nil, 0, nil, err
|
|
}
|
|
historyBatches = append(historyBatches, response.History...)
|
|
for _, batch := range response.History {
|
|
eventsRead += len(batch.Events)
|
|
}
|
|
size += response.Size
|
|
if eventsRead >= req.PageSize || len(response.NextPageToken) == 0 {
|
|
return historyBatches, size, response.NextPageToken, nil
|
|
}
|
|
req.NextPageToken = response.NextPageToken
|
|
}
|
|
}
|
|
|
|
// ReadFullPageEventsReverse reads a full page of history events from ExecutionManager in reverse orcer. Due to storage
|
|
// format of V2 History it is not guaranteed that pageSize amount of data is returned. Function returns the list of
|
|
// history events, the size of data read, the next page token, and an error if present.
|
|
func ReadFullPageEventsReverse(
|
|
ctx context.Context,
|
|
executionMgr ExecutionManager,
|
|
req *ReadHistoryBranchReverseRequest,
|
|
) ([]*historypb.HistoryEvent, int, []byte, error) {
|
|
var historyEvents []*historypb.HistoryEvent
|
|
size := 0
|
|
for {
|
|
response, err := executionMgr.ReadHistoryBranchReverse(ctx, req)
|
|
if err != nil {
|
|
return nil, 0, nil, err
|
|
}
|
|
historyEvents = append(historyEvents, response.HistoryEvents...)
|
|
size += response.Size
|
|
if len(historyEvents) >= req.PageSize || len(response.NextPageToken) == 0 {
|
|
return historyEvents, size, response.NextPageToken, nil
|
|
}
|
|
req.NextPageToken = response.NextPageToken
|
|
}
|
|
}
|
|
|
|
// GetBeginNodeID gets node id from last ancestor
|
|
func GetBeginNodeID(bi *persistencespb.HistoryBranch) int64 {
|
|
if len(bi.Ancestors) == 0 {
|
|
// root branch
|
|
return 1
|
|
}
|
|
idx := len(bi.Ancestors) - 1
|
|
return bi.Ancestors[idx].GetEndNodeId()
|
|
}
|
|
|
|
func sortAncestors(ans []*persistencespb.HistoryBranchRange) {
|
|
if len(ans) > 0 {
|
|
// sort ans based onf EndNodeID so that we can set BeginNodeID
|
|
sort.Slice(ans, func(i, j int) bool { return (ans)[i].GetEndNodeId() < (ans)[j].GetEndNodeId() })
|
|
(ans)[0].BeginNodeId = int64(1)
|
|
for i := 1; i < len(ans); i++ {
|
|
(ans)[i].BeginNodeId = (ans)[i-1].GetEndNodeId()
|
|
}
|
|
}
|
|
}
|