diff --git a/tools/cli/admin.go b/tools/cli/admin.go index 2be7b690bed..8c57ee34f81 100644 --- a/tools/cli/admin.go +++ b/tools/cli/admin.go @@ -173,8 +173,9 @@ func newAdminShardManagementCommands() []cli.Command { { Name: "list_tasks", Usage: "List tasks for given shard Id and task type", - Flags: append( + Flags: append(append( getDBFlags(), + getFlagsForList()...), cli.StringFlag{ Name: FlagTargetCluster, Value: "active", diff --git a/tools/cli/adminCommands.go b/tools/cli/adminCommands.go index 6b28e95041a..a55be561bcf 100644 --- a/tools/cli/adminCommands.go +++ b/tools/cli/adminCommands.go @@ -433,11 +433,21 @@ func AdminListTasks(c *cli.Context) { maxVis := time.Unix(0, maxVisFlag) req := &persistence.GetTimerIndexTasksRequest{MinTimestamp: minVis, MaxTimestamp: maxVis} - tasks, err := executionManager.GetTimerIndexTasks(req) - if err != nil { - ErrorAndExit("Failed to get Timer Tasks", err) + paginationFunc := func(paginationToken []byte) ([]interface{}, []byte, error) { + req.NextPageToken = paginationToken + response, err := executionManager.GetTimerIndexTasks(req) + if err != nil { + return nil, nil, err + } + token := response.NextPageToken + + var items []interface{} + for _, task := range response.Timers { + items = append(items, task) + } + return items, token, nil } - prettyPrintJSONObject(tasks) + paginate(c, paginationFunc) } else if category == commongenpb.TASK_CATEGORY_REPLICATION { req := &persistence.GetReplicationTasksRequest{} task, err := executionManager.GetReplicationTasks(req) diff --git a/tools/cli/persistenceUtil.go b/tools/cli/persistenceUtil.go index 4c772382312..1b981558ace 100644 --- a/tools/cli/persistenceUtil.go +++ b/tools/cli/persistenceUtil.go @@ -40,7 +40,6 @@ import ( // CreatePersistenceFactory returns an initialized persistence managers factory. // The factory allows to easily initialize concrete persistence managers to execute commands against persistence layer func CreatePersistenceFactory(c *cli.Context) persistenceClient.Factory { - defaultStore, err := CreateDefaultDBConfig(c) if err != nil { ErrorAndExit("CreatePersistenceFactory err", err) diff --git a/tools/cli/util.go b/tools/cli/util.go index ddc1eed9573..c5aa44b4a30 100644 --- a/tools/cli/util.go +++ b/tools/cli/util.go @@ -52,6 +52,7 @@ import ( sdkclient "go.temporal.io/temporal/client" "github.com/temporalio/temporal/common/codec" + "github.com/temporalio/temporal/common/collection" "github.com/temporalio/temporal/common/payload" "github.com/temporalio/temporal/common/payloads" "github.com/temporalio/temporal/common/rpc" @@ -901,6 +902,32 @@ func showNextPage() bool { return strings.Trim(input, " ") == "" } +// paginate creates an interactive CLI mode to control the printing of items +func paginate(c *cli.Context, paginationFn collection.PaginationFn) error { + more := c.Bool(FlagMore) + pageSize := c.Int(FlagPageSize) + if pageSize == 0 { + pageSize = defaultPageSize + } + iter := collection.NewPagingIterator(paginationFn) + + pageItemsCount := 0 + for iter.HasNext() { + batch, err := iter.Next() + if err != nil { + return err + } + + prettyPrintJSONObject(batch) + pageItemsCount++ + if pageItemsCount%pageSize == 0 && (!more || !showNextPage()) { + break + } + } + + return nil +} + // prompt will show input msg, then waiting user input y/yes to continue func prompt(msg string, autoConfirm bool) { reader := bufio.NewReader(os.Stdin)