From 0012778625a61701f1b0664d92aac0ed14da06f2 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 17:58:15 +0000 Subject: [PATCH 1/9] docs(stovepipe): define List API contract and portable time lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Intent: - Define a review-ready List contract without tying storage to SQL secondary indexes. - Distinguish existing request data from the projections and access paths still needed. Changes: - Specify queue-scoped request-ID and acceptance-time ordering, optional time bounds, summary fields, and cursor pagination. - Describe canonical acceptance time and outcome reason in summaries, with an immutable time-to-request mapping for timestamp selection. - Document bounded reads, numeric-key migration, idempotent repair, rollout coverage, and deferred features. - Align the history RFC and storage guide with existing materialization and register the new RFC. - Documentation only; RPC and storage implementation remain proposed. --- Generated by the 🪄 [pr-create](https://sg.uberinternal.com/code.uber.internal/uber-code/devexp-agent-marketplace/-/blob/claude-code/plugins/dev/uber-dev/skills/pr-create/SKILL.md) skill in devexp-agent-marketplace --- doc/rfc/index.md | 1 + doc/rfc/stovepipe/list-api.md | 132 +++++++++++++++++++++++ doc/rfc/stovepipe/request-history-api.md | 12 +-- stovepipe/extension/storage/README.md | 8 +- 4 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 doc/rfc/stovepipe/list-api.md diff --git a/doc/rfc/index.md b/doc/rfc/index.md index d36971904..4122aff77 100644 --- a/doc/rfc/index.md +++ b/doc/rfc/index.md @@ -34,6 +34,7 @@ Design documents and technical proposals, grouped by scope. Shared/cross-cutting - [Record stage](stovepipe/steps/record.md) - Immutable validation facts keyed by `(queue, uri, project)`, monotonic last-green bookmark advancement and ref promotion, and the repository hook event. The analyze-stage handoff in that doc is design only - [Request Log](stovepipe/request-log.md) - Append-only request lifecycle log, durable source context, idempotent storage, and reliable write and repair paths - [Request History API](stovepipe/request-history-api.md) - Queue-scoped request-ID and URI lookup, public projection, materialization decision, ordering, and retention +- [List API](stovepipe/list-api.md) - Proposed request-ID and acceptance-time listing, immutable acceptance time in summaries, cursor pagination, and a portable time-to-request mapping - [GetProjectStatusByURI API](stovepipe/get-project-status-by-uri-api.md) - Queue-scoped current validation lookup for a commit, with repository and future project-level results ## Runway diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md new file mode 100644 index 000000000..cbf95bd9f --- /dev/null +++ b/doc/rfc/stovepipe/list-api.md @@ -0,0 +1,132 @@ +# Stovepipe List API + +## Status and Decisions + +Proposed contract; the RPC and storage changes are not implemented. + +List serves retained request summaries for one queue. Its default is numeric request-ID ingest order, newest first, with 50 rows per page. Callers can instead select acceptance-time order and an optional time range. Superseded requests are included, and duplicate Ingest calls resolving to one request produce one row. + +Acceptance time is copied from the original retained accepted event into the existing summary. No new producer signal or per-queue counter is needed. Request-ID listing reads the summaries directly. Acceptance-time listing uses a small immutable time-to-request mapping and then reads those same summaries. Mutable lifecycle state has one materialized copy. + +## RPC Contract + +The RPC is `List(ListRequest) -> ListResponse` on the existing Stovepipe service. Published protobufs belong under `api/stovepipe/proto/`; controller inputs and results remain domain values. + +| Request field | Type | Meaning | +| --- | --- | --- | +| `queue` | string | Required exact configured queue; non-empty and at most 255 bytes. | +| `order` | ListOrder enum | `REQUEST_ID_DESC = 0` is the default; `ACCEPTED_AT_DESC = 1` selects acceptance-time order. Other values are invalid. | +| `accepted_at_or_after_ms` | int64 with presence | Optional inclusive lower acceptance-time bound, in Unix milliseconds; valid only with acceptance-time order. | +| `accepted_before_ms` | int64 with presence | Optional exclusive upper acceptance-time bound, in Unix milliseconds; valid only with acceptance-time order. | +| `page_size` | int32 | Zero or omitted selects 50; valid nonzero values are 1 through 200. | +| `page_token` | string | Opaque continuation token; empty selects the first page. | + +| Response field | Type | Meaning | +| --- | --- | --- | +| `requests` | repeated RequestSummary | Summaries in the selected order. | +| `next_page_token` | string | Continuation when a further row was observed; empty otherwise. | +| `accepted_at_or_after_ms` | int64 with presence | Effective lower bound in acceptance-time mode; absent in request-ID mode. | +| `accepted_before_ms` | int64 with presence | Effective upper bound in acceptance-time mode; absent in request-ID mode. | + +On every page, callers supply the queue and order used for the first page. Page size may change. Time bounds may be omitted on continuations; if supplied, each must match its token value. There is no cross-queue selector, and every call follows the service's queue-access policy. IDs remain opaque to clients. + +## Ordering and Time Defaults + +`REQUEST_ID_DESC` uses the numeric per-queue sequence already used by [CompareRequestID](../../../stovepipe/entity/request_id.go) and [backlog coalescing](steps/process.md#backlog-coalescing). It lists all retained summaries, including legacy rows whose acceptance time is unknown. It has no time cutoff and rejects supplied time bounds. Counter gaps are valid and do not represent requests to synthesize or individually probe. + +`ACCEPTED_AT_DESC` orders by `(accepted_at_ms DESC, request_id DESC)`. The ID tie-breaker uses UTF-8 byte ordering, independent of locale or numeric interpretation. This mode includes only summaries with a verified acceptance timestamp. It never promises numeric ingest order within a time interval. + +Resolve an acceptance-time query's bounds once on the first page: + +| Supplied bounds | Effective interval | +| --- | --- | +| Neither | `[0, now)`, sampling the server clock once. | +| Lower only | `[lower, now)`, sampling the server clock once. | +| Upper only | `[0, upper)`. | +| Both | `[lower, upper)`. | + +Supplied bounds must be non-negative, and the resolved lower bound must be strictly less than the upper bound. Explicit future bounds are allowed. Scalar presence distinguishes omission from an explicit zero. Every acceptance-time response echoes the resolved bounds; a token preserves them, so later pages never resample the clock. Starting with an empty token resolves a new query. Neither mode has an implicit 24-hour window or a maximum interval width: the ordered access path and page limit bound each call. + +Time selection uses `lower <= accepted_at_ms < upper`, with current materialized lifecycle state at read time. It does not reconstruct state at the upper bound or find every request active during the interval. A request accepted before the lower bound is excluded even if still processing. + +## Summary Fields and Existing Data + +The [domain summary](../../../stovepipe/entity/request_summary.go) and [SQL schema](../../../stovepipe/extension/storage/mysql/schema/request_summary.sql) already contain six response fields. Acceptance time and outcome reason are recorded in logs but need to be added to the summary. + +| Wire field | Type | Current source | Required work | +| --- | --- | --- | --- | +| `request_id` | string | RequestSummary.RequestID | Already materialized. | +| `queue` | string | RequestSummary.Queue | Already materialized. | +| `change_uri` | string | RequestSummary.URI | Already materialized; preserve the exact URI. | +| `base_uri` | string | RequestSummary.BaseURI | Already materialized; empty before selection or for a full build. | +| `request_state` | string | RequestSummary.State | Already materialized. | +| `state_updated_at_ms` | int64 | RequestSummary.StateTimestampMs | Already materialized; timestamp of the represented state entry. | +| `accepted_at_ms` | int64 with presence | Canonical version-1 accepted log's TimestampMs | Add immutable acceptance time, preserving absence for legacy summaries. | +| `outcome_reason` | string | Winning state log's OutcomeReason | Add to the summary and advance with the winning state; empty when unavailable or inapplicable. | + +Acceptance time is the timestamp of the original retained `accepted` entry for request version 1. The materializer samples time before an insertion attempt, and duplicate reconciliation preserves the first successfully retained entry's timestamp. It records acceptance-log time, not first RPC receipt, commit author time, build start, or completion. Once known, it never changes. `StateTimestampMs` advances with lifecycle state and is not a substitute. + +A retained accepted entry can supply its timestamp directly. To initialize an older summary, retrieve that one occurrence by stable ID. Missing historical acceptance leaves the field absent, rather than inventing a time or using zero as unknown. The row remains available in request-ID mode and is excluded from acceptance-time mode. Infrastructure lookup failures remain errors. + +Outcome reason comes from the retained log matching the summary's current `RequestVersion`, not an older entry that triggered repair. Initialize missing context conditionally and reload after a version race. Filling context advances the summary's projection version without changing the represented request version. Lifecycle winners advance state, baseline, state timestamp, and reason together. Timestamps do not decide the winner; existing request-version reconciliation remains authoritative. + +The public lifecycle vocabulary is `accepted`, `processing`, `superseded`, `succeeded`, `failed`, and `cancelled`; reasons use the existing [public vocabulary](request-log.md#outcome-reasons). Clients tolerate future values. A terminal lifecycle does not guarantee record-stage completion or a validation fact. List omits validation verdicts, project results, build details, arbitrary metadata, and histories; existing status and history APIs serve those concerns. + +## Storage Access Paths + +Keep `RequestSummaryStore` as the authoritative lifecycle read model and add a bounded request-ID range read for the resolved queue. Its current VARCHAR primary key does not provide numeric order: lexical order places 9 after 10. Use an order-preserving primary-key representation of the existing sequence, such as fixed-width encoded numeric keys, while retaining the public ID as a string. Point reads derive the same internal identity key. This requires a compatible storage-key migration, not a new event or a separate mutable projection. A numeric cast followed by sorting the entire queue is not a bounded range implementation. + +For time queries, add an immutable `RequestAcceptance` mapping with logical key `(queue, accepted_at_ms, request_id)`. Its only information is the verified acceptance tuple identifying an existing summary. The corresponding queue-scoped store provides idempotent create and a limited ordered range read with an exclusive tuple cursor. A MySQL implementation uses this tuple as its primary key with binary ID comparison; an ordered key-value backend uses the equivalent key. No secondary-index capability is required. + +Request-ID mode reads at most `page_size + 1` summaries directly. Acceptance-time mode reads at most `page_size + 1` mappings, then retrieves at most `page_size` summaries by individual primary-key reads. The extra mapping determines whether another page exists and needs no summary lookup. Reads may use bounded concurrency; the contract does not require multi-key queries or joins. A missing mapped summary, mismatched queue, or acceptance timestamp disagreeing with its mapping is an internal consistency error and fails the page. + +Both modes return current state from the same authoritative summary. There is no replicated mutable queue summary to synchronize. A per-queue latest ID or timestamp cannot replace the time mapping: IDs are allocated before acceptance is recorded, so one call may allocate 41 and stall while 42 records acceptance first. Scanning IDs and stopping at an old timestamp can therefore miss matching requests. + +This design follows the repository's [key-value storage contract](../../../submitqueue/extension/storage/README.md#key-value-contract), which permits bounded reads over leading primary-key components and first-class mapping stores for needed alternate lookups. A SQL secondary index on the summary could implement time selection for MySQL, but would make that alternate lookup implicit and require other backends to supply a capability the existing point-store contract does not express. The explicit immutable mapping is the portable index, not a way to avoid maintaining an index. Its cost is one additional durable mapping per request, an idempotent create/ensure step on state reconciliation, and bounded summary point reads per time-ordered page. V1 does not introduce an exception to the rule against secondary-index-dependent store queries. + +## Writes and Repair + +Extend the existing [materializer](../../../stovepipe/core/requestlog/request_summary.go) to retain the canonical state log, advance or initialize the authoritative summary, and ensure its acceptance mapping before dependent publication. New accepted entries must establish their timestamp and mapping before process publication. A publish failure leaves the durable admission visible; retry of the same queue and URI repairs the handoff. + +Mapping creation is idempotent and has no lifecycle update operation. If the incoming state loses to a newer summary, still ensure the mapping from that authoritative summary. If a legacy summary lacks trustworthy acceptance data, continue its lifecycle projection without creating a mapping. Once verified context becomes available, create the mapping from it. Informational event entries neither change lifecycle state nor determine acceptance time. + +The write order is source state, retained log, authoritative summary, acceptance mapping, then dependent publication. There is no cross-entity transaction. A mapping failure returns an error so the existing delivery or reconciliation trigger repairs it; Ingest failures rely on caller retry. Lifecycle changes do not rewrite mapping content. All conditional summary writes preserve caller-owned values, compute versions outside storage, and assign versions only after successful persistence. + +## Pagination and Errors + +The cursor is exclusive: request-ID mode continues below the last returned numeric ID, and acceptance-time mode below the last returned time/ID tuple. Return at most `page_size` rows and issue a token only when a further row was observed. An exhausted query returns an empty page and empty token. + +Tokens contain a format version, queue, order, cursor, and time-mode bounds. Reject malformed or unsupported tokens, invalid IDs, a query mismatch, and time cursors outside the token's interval. A cursor row need not still exist. Tokens confer no authorization. + +Identity order and verified acceptance tuples are immutable, preventing duplicates during forward traversal. Paging is not a snapshot: delayed summary or mapping creation can insert a row into a portion already passed, later pages may show newer state, and future pruning may remove rows. Refresh starts from an empty token. An empty continuation means no further row was observed in that read. + +| Condition | RPC result | +| --- | --- | +| Missing, invalid, or unconfigured queue; invalid order, bounds, page size, or token | Invalid argument. | +| Configured queue with no matching retained rows | Successful empty page. | +| Caller lacks access under the service's queue policy | Permission denied. | +| Classified retryable storage failure | Unavailable. | +| Cancellation or deadline | Corresponding canonical transport code. | +| Corrupt summary or dangling/inconsistent mapping | Internal error; fail the page rather than silently omit rows. | + +List performs no source-control query, history replay, initialization, repair, or publication during reads. An absent legacy acceptance timestamp is valid, not corrupt content. + +## Rollout and Acceptance Criteria + +Add acceptance time with explicit migration presence, such as a nullable SQL column and corresponding domain presence value. Add outcome reason with a compatible empty default. Existing summaries remain usable with an absent timestamp; only a retained accepted record can initialize it. Automatic historical backfill and reconstruction of Requests never summarized are outside v1. + +Deploy the schema, numeric-order key migration, and compatible materializers before exposing List. Enable the mapping handoff only once all writers can preserve initialized context and ensure mappings. Complete time-mode coverage starts with admissions after that writer cutover; older requests may appear when their context and mapping are repaired. Request-ID coverage is all retained summaries. A rollback to incompatible writers must disable the affected time-mode guarantee. + +V1 has no automatic pruning or fixed retention duration. Future pruning must coordinate summaries, mappings, retained history, URI mappings, and retry triggers so a dangling mapping does not fail reads or repair recreate an expired request. Neither mode promises a snapshot export, complete operational-request reconstruction, or lifetime retention. + +Implementation and review must verify: + +- Summary fields preserve the original accepted timestamp across retries and later states; conditional initialization uses the current winning reason and tolerates missing legacy history. +- Request-ID storage preserves numeric order across digit boundaries and counter gaps, retains string wire IDs, and preserves point lookup across the key migration. +- Acceptance mappings are immutable, use binary ID ties, and are repaired after partial writes even when an incoming state loses. +- Both query modes enforce page limits, token binding, queue isolation, and empty-page semantics; omitted time bounds remain fixed across continuations. +- Request-ID mode includes legacy summaries with absent timestamps; time mode excludes them and fails on a mapped summary that is missing or inconsistent. +- Source, log, summary, mapping, and publication failures retain the existing repair path, without requiring transactions or mutable-state duplication. +- New protobufs, domain values, controller, mapper, store implementations, mocks, and wiring preserve existing status/history contracts and tolerate future lifecycle values. + +State or verdict filtering, recently-updated ordering, lifecycle-overlap queries, real scheduler position, totals, exact snapshots, automated backfill, and pruning remain separate extensions. In particular, indexing mutable state-update time would need a different membership and pagination contract; it is not part of this acceptance index. diff --git a/doc/rfc/stovepipe/request-history-api.md b/doc/rfc/stovepipe/request-history-api.md index ccdefd9a5..0867e415f 100644 --- a/doc/rfc/stovepipe/request-history-api.md +++ b/doc/rfc/stovepipe/request-history-api.md @@ -4,7 +4,7 @@ Stovepipe exposes retained request history through queue-scoped point lookups by request ID and exact URI. URI lookup returns every retained request history associated with that commit; the current insert-once mapping produces exactly one. Both selectors return complete ordered events, and URI lookup groups them by request ID. -The API reads the append-only model defined by [Stovepipe Request Log](request-log.md) directly. It does not replay history into current state or introduce a second persisted history projection. Current commit status remains a separate read concern derived from operational entities rather than request history. +The API reads the append-only model defined by [Stovepipe Request Log](request-log.md) directly. It does not replay history into current state or introduce a second persisted history projection. Current commit status remains a separate read concern, served from the materialized request summary and durable validation facts by [GetProjectStatusByURI](get-project-status-by-uri-api.md). ## API Coverage @@ -103,11 +103,11 @@ SubmitQueue's `PersistLog` operation performs two jobs after receiving a log mes Event rows remain in SubmitQueue history but never participate in current-status materialization. The materializer exists because the gateway owns public reads but cannot read the orchestrator's mutable Request store. -Stovepipe has no equivalent ownership gap. The same service owns the queue-scoped `Request`, `ValidationFact`, request-URI mapping, and request-log store. Operational reads use their owning entities, while request history reads retained log records directly. +Stovepipe has no equivalent ownership gap. The same service owns the queue-scoped `Request`, `ValidationFact`, request summary, request-URI mapping, and request-log store. Operational reads use their owning entities, current-status reads use the materialized summary and validation facts, and request history reads retained log records directly. -Stovepipe calls `requestlog.Materializer.PersistLog` directly, without an intermediate topic. Its initial materializer appends only the request log: it does not add `RequestSummary`, replay history to determine current state, or materialize another history table. The controller performs only an in-memory wire projection from stored log records to protobuf messages. This avoids a second winner-selection algorithm competing with Request CAS state. +Stovepipe calls `requestlog.Materializer.PersistLog` directly, without an intermediate topic. The materializer retains occurrences idempotently and advances `RequestSummary` from state entries using their request versions. Informational events never compete for current state. The history controller still performs only an in-memory wire projection from stored log records to protobuf messages; it does not read summaries or infer missing history from current state. -`PersistLog` receives the whole queue-scoped storage aggregate so a future current-status or queue-list API can add SubmitQueue-style summary and index projections behind the same write boundary without changing request-log producers. Such projections remain deferred until a concrete read path needs them; `Request` remains authoritative in the initial implementation. +`PersistLog` receives the whole queue-scoped storage aggregate, allowing additional summary context behind the same write boundary without changing request-log producers. The proposed [List API](list-api.md) adds immutable acceptance time to the summary, serves request-ID-order pages directly from summaries, and serves time-order pages through an immutable acceptance mapping. It duplicates no mutable lifecycle state and requires no SQL secondary index. Acceptance time and these List read paths are not implemented; the summary used for current-status lookup is implemented. `Request` remains authoritative for operational lifecycle transitions. ## Ordering and Consistency @@ -146,9 +146,9 @@ Contract and controller tests cover: ## Alternatives Considered -### Materialize current status from history +### Replay history during reads -Rejected because `Request` and `ValidationFact` already own current operational state and verdicts. Replaying history would add another reconciliation path without enabling either selector. +Rejected because retained history is already the complete input for both history selectors. Current lifecycle summaries are materialized when state entries are retained, and validation facts own recorded verdicts; neither requires request-time replay by a history controller. ### Query history directly by URI diff --git a/stovepipe/extension/storage/README.md b/stovepipe/extension/storage/README.md index 8ced668dc..69aa6a1dc 100644 --- a/stovepipe/extension/storage/README.md +++ b/stovepipe/extension/storage/README.md @@ -18,4 +18,10 @@ A `Get` immediately following a successful write (`Create`/`Update`) — by the ## Key-value contract -Same design space as [`submitqueue/extension/storage`](../../../submitqueue/extension/storage/README.md#key-value-contract): every method must be satisfiable by a plain key-value backend as cheaply as by MySQL — get/put/conditional-update by primary key only, no query-by-attribute or server-side filtering. `RequestURIStore` is the reverse-lookup example here (which request owns a given commit URI), kept as its own store rather than a secondary index on `RequestStore`. +Same design space as [`submitqueue/extension/storage`](../../../submitqueue/extension/storage/README.md#key-value-contract): point operations use complete primary keys, and deliberate bounded prefix/range reads use leading primary-key components. Contracts do not require secondary-index lookups, joins, or arbitrary server-side filtering. `RequestURIStore` is the reverse-lookup example here (which request owns a given commit URI), kept as its own store rather than a secondary index on `RequestStore`. + +## Proposed summary listing + +The [List RFC](../../../doc/rfc/stovepipe/list-api.md) proposes acceptance time in the existing summary and two bounded read paths: descending numeric request-ID order directly over summaries, and acceptance-time order through an immutable mapping followed by summary point reads. These fields and query methods are not implemented. The current VARCHAR ID key does not provide numeric order; request-ID listing needs an order-preserving primary-key representation and a compatible key migration. + +Acceptance time is sourced from the retained version-1 accepted log and is immutable once known. The proposed mapping is keyed by `(queue, accepted_at_ms, request_id)`, created idempotently after summary persistence, and never rewritten for lifecycle changes. Both SQL and ordered key-value implementations can serve it by primary-key range scan. List's lifecycle read model remains the existing summary; there is no replicated queue summary, new per-queue counter, or exception to the prohibition on secondary-index-dependent queries. From bb35f9843985ff3cc0d73e9eded2e79246310668 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:05:18 +0000 Subject: [PATCH 2/9] feat(api): add Stovepipe List contract and simplify RFC --- api/stovepipe/proto/stovepipe.proto | 68 +++ api/stovepipe/protopb/stovepipe.pb.go | 560 ++++++++++++++++++-- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 178 +++++-- api/stovepipe/protopb/stovepipe_grpc.pb.go | 40 ++ doc/rfc/stovepipe/list-api.md | 145 ++--- doc/rfc/stovepipe/request-history-api.md | 12 +- stovepipe/extension/storage/README.md | 8 +- 7 files changed, 799 insertions(+), 212 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index b403ab653..afb3b41df 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -157,6 +157,72 @@ message GetProjectStatusByURIResponse { string next_page_token = 9; } +// ListOrder selects the immutable ordering key for request listing. +enum ListOrder { + // Descending numeric per-queue request sequence. + REQUEST_ID_DESC = 0; + // Descending acceptance time, then bytewise descending request ID. + ACCEPTED_AT_DESC = 1; +} + +// ListRequest selects a page of retained request summaries for one queue. +message ListRequest { + // Required configured queue. + string queue = 1; + // Ordering for every page. Defaults to request-ID order. + ListOrder order = 2; + oneof accepted_lower_bound { + // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. + int64 accepted_at_or_after_ms = 3; + } + oneof accepted_upper_bound { + // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. + int64 accepted_before_ms = 4; + } + // Zero selects 50; nonzero values must be between 1 and 200. + int32 page_size = 5; + // Opaque continuation token bound to the queue, order, and resolved time bounds. + string page_token = 6; +} + +// RequestSummary contains one request's current materialized lifecycle state. +message RequestSummary { + // Opaque identifier returned from Ingest. + string request_id = 1; + // Queue containing the request. + string queue = 2; + // Exact VCS-agnostic URI of the ingested commit. + string change_uri = 3; + // Selected baseline URI. Empty before selection or for a full build. + string base_uri = 4; + // Stable public lifecycle state; clients tolerate future values. + string request_state = 5; + // Unix millisecond timestamp of the represented state entry. + int64 state_updated_at_ms = 6; + oneof acceptance_time { + // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. + int64 accepted_at_ms = 7; + } + // Stable reason for the represented state. Empty when unavailable or inapplicable. + string outcome_reason = 8; +} + +// ListResponse contains a page in the requested order, not a snapshot across pages. +message ListResponse { + // Current summaries in the selected order. + repeated RequestSummary requests = 1; + // Opaque continuation token; empty when no further row was observed. + string next_page_token = 2; + oneof accepted_lower_bound { + // Resolved inclusive Unix millisecond bound; absent in request-ID order. + int64 accepted_at_or_after_ms = 3; + } + oneof accepted_upper_bound { + // Resolved exclusive Unix millisecond bound, fixed across pages; absent in request-ID order. + int64 accepted_before_ms = 4; + } +} + // Stovepipe provides the Stovepipe API. service Stovepipe { // Ping returns a response indicating the service is alive @@ -170,4 +236,6 @@ service Stovepipe { rpc GetRequestHistoryByURI(GetRequestHistoryByURIRequest) returns (GetRequestHistoryByURIResponse) {} // GetProjectStatusByURI returns the current validation status for an exact commit URI. rpc GetProjectStatusByURI(GetProjectStatusByURIRequest) returns (GetProjectStatusByURIResponse) {} + // List returns a queue-scoped page of current request summaries. + rpc List(ListRequest) returns (ListResponse) {} } diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index da2a7b420..4d69182db 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -36,6 +36,55 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// ListOrder selects the immutable ordering key for request listing. +type ListOrder int32 + +const ( + // Descending numeric per-queue request sequence. + ListOrder_REQUEST_ID_DESC ListOrder = 0 + // Descending acceptance time, then bytewise descending request ID. + ListOrder_ACCEPTED_AT_DESC ListOrder = 1 +) + +// Enum value maps for ListOrder. +var ( + ListOrder_name = map[int32]string{ + 0: "REQUEST_ID_DESC", + 1: "ACCEPTED_AT_DESC", + } + ListOrder_value = map[string]int32{ + "REQUEST_ID_DESC": 0, + "ACCEPTED_AT_DESC": 1, + } +) + +func (x ListOrder) Enum() *ListOrder { + p := new(ListOrder) + *p = x + return p +} + +func (x ListOrder) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ListOrder) Descriptor() protoreflect.EnumDescriptor { + return file_stovepipe_proto_enumTypes[0].Descriptor() +} + +func (ListOrder) Type() protoreflect.EnumType { + return &file_stovepipe_proto_enumTypes[0] +} + +func (x ListOrder) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ListOrder.Descriptor instead. +func (ListOrder) EnumDescriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{0} +} + // PingRequest is the request for the Ping method type PingRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -932,6 +981,389 @@ type GetProjectStatusByURIResponse_RepositoryBreakageDegree struct { func (*GetProjectStatusByURIResponse_RepositoryBreakageDegree) isGetProjectStatusByURIResponse_RepositoryResult() { } +// ListRequest selects a page of retained request summaries for one queue. +type ListRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required configured queue. + Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` + // Ordering for every page. Defaults to request-ID order. + Order ListOrder `protobuf:"varint,2,opt,name=order,proto3,enum=uber.submitqueue.stovepipe.ListOrder" json:"order,omitempty"` + // Types that are valid to be assigned to AcceptedLowerBound: + // + // *ListRequest_AcceptedAtOrAfterMs + AcceptedLowerBound isListRequest_AcceptedLowerBound `protobuf_oneof:"accepted_lower_bound"` + // Types that are valid to be assigned to AcceptedUpperBound: + // + // *ListRequest_AcceptedBeforeMs + AcceptedUpperBound isListRequest_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` + // Zero selects 50; nonzero values must be between 1 and 200. + PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Opaque continuation token bound to the queue, order, and resolved time bounds. + PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRequest) Reset() { + *x = ListRequest{} + mi := &file_stovepipe_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRequest) ProtoMessage() {} + +func (x *ListRequest) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. +func (*ListRequest) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{13} +} + +func (x *ListRequest) GetQueue() string { + if x != nil { + return x.Queue + } + return "" +} + +func (x *ListRequest) GetOrder() ListOrder { + if x != nil { + return x.Order + } + return ListOrder_REQUEST_ID_DESC +} + +func (x *ListRequest) GetAcceptedLowerBound() isListRequest_AcceptedLowerBound { + if x != nil { + return x.AcceptedLowerBound + } + return nil +} + +func (x *ListRequest) GetAcceptedAtOrAfterMs() int64 { + if x != nil { + if x, ok := x.AcceptedLowerBound.(*ListRequest_AcceptedAtOrAfterMs); ok { + return x.AcceptedAtOrAfterMs + } + } + return 0 +} + +func (x *ListRequest) GetAcceptedUpperBound() isListRequest_AcceptedUpperBound { + if x != nil { + return x.AcceptedUpperBound + } + return nil +} + +func (x *ListRequest) GetAcceptedBeforeMs() int64 { + if x != nil { + if x, ok := x.AcceptedUpperBound.(*ListRequest_AcceptedBeforeMs); ok { + return x.AcceptedBeforeMs + } + } + return 0 +} + +func (x *ListRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type isListRequest_AcceptedLowerBound interface { + isListRequest_AcceptedLowerBound() +} + +type ListRequest_AcceptedAtOrAfterMs struct { + // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. + AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` +} + +func (*ListRequest_AcceptedAtOrAfterMs) isListRequest_AcceptedLowerBound() {} + +type isListRequest_AcceptedUpperBound interface { + isListRequest_AcceptedUpperBound() +} + +type ListRequest_AcceptedBeforeMs struct { + // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. + AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` +} + +func (*ListRequest_AcceptedBeforeMs) isListRequest_AcceptedUpperBound() {} + +// RequestSummary contains one request's current materialized lifecycle state. +type RequestSummary struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Opaque identifier returned from Ingest. + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Queue containing the request. + Queue string `protobuf:"bytes,2,opt,name=queue,proto3" json:"queue,omitempty"` + // Exact VCS-agnostic URI of the ingested commit. + ChangeUri string `protobuf:"bytes,3,opt,name=change_uri,json=changeUri,proto3" json:"change_uri,omitempty"` + // Selected baseline URI. Empty before selection or for a full build. + BaseUri string `protobuf:"bytes,4,opt,name=base_uri,json=baseUri,proto3" json:"base_uri,omitempty"` + // Stable public lifecycle state; clients tolerate future values. + RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` + // Unix millisecond timestamp of the represented state entry. + StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` + // Types that are valid to be assigned to AcceptanceTime: + // + // *RequestSummary_AcceptedAtMs + AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` + // Stable reason for the represented state. Empty when unavailable or inapplicable. + OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RequestSummary) Reset() { + *x = RequestSummary{} + mi := &file_stovepipe_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestSummary) ProtoMessage() {} + +func (x *RequestSummary) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestSummary.ProtoReflect.Descriptor instead. +func (*RequestSummary) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{14} +} + +func (x *RequestSummary) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *RequestSummary) GetQueue() string { + if x != nil { + return x.Queue + } + return "" +} + +func (x *RequestSummary) GetChangeUri() string { + if x != nil { + return x.ChangeUri + } + return "" +} + +func (x *RequestSummary) GetBaseUri() string { + if x != nil { + return x.BaseUri + } + return "" +} + +func (x *RequestSummary) GetRequestState() string { + if x != nil { + return x.RequestState + } + return "" +} + +func (x *RequestSummary) GetStateUpdatedAtMs() int64 { + if x != nil { + return x.StateUpdatedAtMs + } + return 0 +} + +func (x *RequestSummary) GetAcceptanceTime() isRequestSummary_AcceptanceTime { + if x != nil { + return x.AcceptanceTime + } + return nil +} + +func (x *RequestSummary) GetAcceptedAtMs() int64 { + if x != nil { + if x, ok := x.AcceptanceTime.(*RequestSummary_AcceptedAtMs); ok { + return x.AcceptedAtMs + } + } + return 0 +} + +func (x *RequestSummary) GetOutcomeReason() string { + if x != nil { + return x.OutcomeReason + } + return "" +} + +type isRequestSummary_AcceptanceTime interface { + isRequestSummary_AcceptanceTime() +} + +type RequestSummary_AcceptedAtMs struct { + // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. + AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` +} + +func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} + +// ListResponse contains a page in the requested order, not a snapshot across pages. +type ListResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Current summaries in the selected order. + Requests []*RequestSummary `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` + // Opaque continuation token; empty when no further row was observed. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Types that are valid to be assigned to AcceptedLowerBound: + // + // *ListResponse_AcceptedAtOrAfterMs + AcceptedLowerBound isListResponse_AcceptedLowerBound `protobuf_oneof:"accepted_lower_bound"` + // Types that are valid to be assigned to AcceptedUpperBound: + // + // *ListResponse_AcceptedBeforeMs + AcceptedUpperBound isListResponse_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListResponse) Reset() { + *x = ListResponse{} + mi := &file_stovepipe_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListResponse) ProtoMessage() {} + +func (x *ListResponse) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListResponse.ProtoReflect.Descriptor instead. +func (*ListResponse) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{15} +} + +func (x *ListResponse) GetRequests() []*RequestSummary { + if x != nil { + return x.Requests + } + return nil +} + +func (x *ListResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListResponse) GetAcceptedLowerBound() isListResponse_AcceptedLowerBound { + if x != nil { + return x.AcceptedLowerBound + } + return nil +} + +func (x *ListResponse) GetAcceptedAtOrAfterMs() int64 { + if x != nil { + if x, ok := x.AcceptedLowerBound.(*ListResponse_AcceptedAtOrAfterMs); ok { + return x.AcceptedAtOrAfterMs + } + } + return 0 +} + +func (x *ListResponse) GetAcceptedUpperBound() isListResponse_AcceptedUpperBound { + if x != nil { + return x.AcceptedUpperBound + } + return nil +} + +func (x *ListResponse) GetAcceptedBeforeMs() int64 { + if x != nil { + if x, ok := x.AcceptedUpperBound.(*ListResponse_AcceptedBeforeMs); ok { + return x.AcceptedBeforeMs + } + } + return 0 +} + +type isListResponse_AcceptedLowerBound interface { + isListResponse_AcceptedLowerBound() +} + +type ListResponse_AcceptedAtOrAfterMs struct { + // Resolved inclusive Unix millisecond bound; absent in request-ID order. + AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` +} + +func (*ListResponse_AcceptedAtOrAfterMs) isListResponse_AcceptedLowerBound() {} + +type isListResponse_AcceptedUpperBound interface { + isListResponse_AcceptedUpperBound() +} + +type ListResponse_AcceptedBeforeMs struct { + // Resolved exclusive Unix millisecond bound, fixed across pages; absent in request-ID order. + AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` +} + +func (*ListResponse_AcceptedBeforeMs) isListResponse_AcceptedUpperBound() {} + var File_stovepipe_proto protoreflect.FileDescriptor const file_stovepipe_proto_rawDesc = "" + @@ -997,13 +1429,46 @@ const file_stovepipe_proto_rawDesc = "" + "\x18project_results_complete\x18\a \x01(\bR\x16projectResultsComplete\x12I\n" + "\bprojects\x18\b \x03(\v2-.uber.submitqueue.stovepipe.ProjectValidationR\bprojects\x12&\n" + "\x0fnext_page_token\x18\t \x01(\tR\rnextPageTokenB\x13\n" + - "\x11repository_result2\x81\x05\n" + + "\x11repository_result\"\xb4\x02\n" + + "\vListRequest\x12\x14\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12;\n" + + "\x05order\x18\x02 \x01(\x0e2%.uber.submitqueue.stovepipe.ListOrderR\x05order\x126\n" + + "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + + "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMs\x12\x1b\n" + + "\tpage_size\x18\x05 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + + "\x14accepted_lower_boundB\x16\n" + + "\x14accepted_upper_bound\"\xb5\x02\n" + + "\x0eRequestSummary\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x14\n" + + "\x05queue\x18\x02 \x01(\tR\x05queue\x12\x1d\n" + + "\n" + + "change_uri\x18\x03 \x01(\tR\tchangeUri\x12\x19\n" + + "\bbase_uri\x18\x04 \x01(\tR\abaseUri\x12#\n" + + "\rrequest_state\x18\x05 \x01(\tR\frequestState\x12-\n" + + "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + + "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + + "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + + "\x0facceptance_time\"\x96\x02\n" + + "\fListResponse\x12F\n" + + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x126\n" + + "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + + "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMsB\x16\n" + + "\x14accepted_lower_boundB\x16\n" + + "\x14accepted_upper_bound*6\n" + + "\tListOrder\x12\x13\n" + + "\x0fREQUEST_ID_DESC\x10\x00\x12\x14\n" + + "\x10ACCEPTED_AT_DESC\x10\x012\xde\x05\n" + "\tStovepipe\x12[\n" + "\x04Ping\x12'.uber.submitqueue.stovepipe.PingRequest\x1a(.uber.submitqueue.stovepipe.PingResponse\"\x00\x12a\n" + "\x06Ingest\x12).uber.submitqueue.stovepipe.IngestRequest\x1a*.uber.submitqueue.stovepipe.IngestResponse\"\x00\x12\x8e\x01\n" + "\x15GetRequestHistoryByID\x128.uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest\x1a9.uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse\"\x00\x12\x91\x01\n" + "\x16GetRequestHistoryByURI\x129.uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest\x1a:.uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse\"\x00\x12\x8e\x01\n" + - "\x15GetProjectStatusByURI\x128.uber.submitqueue.stovepipe.GetProjectStatusByURIRequest\x1a9.uber.submitqueue.stovepipe.GetProjectStatusByURIResponse\"\x00Be\n" + + "\x15GetProjectStatusByURI\x128.uber.submitqueue.stovepipe.GetProjectStatusByURIRequest\x1a9.uber.submitqueue.stovepipe.GetProjectStatusByURIResponse\"\x00\x12[\n" + + "\x04List\x12'.uber.submitqueue.stovepipe.ListRequest\x1a(.uber.submitqueue.stovepipe.ListResponse\"\x00Be\n" + "\x1ecom.uber.submitqueue.stovepipeB\x0eStovepipeProtoP\x01Z1github.com/uber/submitqueue/api/stovepipe/protopbb\x06proto3" var ( @@ -1018,42 +1483,51 @@ func file_stovepipe_proto_rawDescGZIP() []byte { return file_stovepipe_proto_rawDescData } -var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_stovepipe_proto_goTypes = []any{ - (*PingRequest)(nil), // 0: uber.submitqueue.stovepipe.PingRequest - (*PingResponse)(nil), // 1: uber.submitqueue.stovepipe.PingResponse - (*IngestRequest)(nil), // 2: uber.submitqueue.stovepipe.IngestRequest - (*IngestResponse)(nil), // 3: uber.submitqueue.stovepipe.IngestResponse - (*GetRequestHistoryByIDRequest)(nil), // 4: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - (*GetRequestHistoryByURIRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - (*HistoryEvent)(nil), // 6: uber.submitqueue.stovepipe.HistoryEvent - (*RequestHistory)(nil), // 7: uber.submitqueue.stovepipe.RequestHistory - (*GetRequestHistoryByIDResponse)(nil), // 8: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - (*GetRequestHistoryByURIResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - (*GetProjectStatusByURIRequest)(nil), // 10: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - (*ProjectValidation)(nil), // 11: uber.submitqueue.stovepipe.ProjectValidation - (*GetProjectStatusByURIResponse)(nil), // 12: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + (ListOrder)(0), // 0: uber.submitqueue.stovepipe.ListOrder + (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest + (*PingResponse)(nil), // 2: uber.submitqueue.stovepipe.PingResponse + (*IngestRequest)(nil), // 3: uber.submitqueue.stovepipe.IngestRequest + (*IngestResponse)(nil), // 4: uber.submitqueue.stovepipe.IngestResponse + (*GetRequestHistoryByIDRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + (*GetRequestHistoryByURIRequest)(nil), // 6: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + (*HistoryEvent)(nil), // 7: uber.submitqueue.stovepipe.HistoryEvent + (*RequestHistory)(nil), // 8: uber.submitqueue.stovepipe.RequestHistory + (*GetRequestHistoryByIDResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + (*GetRequestHistoryByURIResponse)(nil), // 10: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + (*GetProjectStatusByURIRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + (*ProjectValidation)(nil), // 12: uber.submitqueue.stovepipe.ProjectValidation + (*GetProjectStatusByURIResponse)(nil), // 13: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + (*ListRequest)(nil), // 14: uber.submitqueue.stovepipe.ListRequest + (*RequestSummary)(nil), // 15: uber.submitqueue.stovepipe.RequestSummary + (*ListResponse)(nil), // 16: uber.submitqueue.stovepipe.ListResponse } var file_stovepipe_proto_depIdxs = []int32{ - 6, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 6, // 1: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 7, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory - 11, // 3: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 0, // 4: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 2, // 5: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 4, // 6: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 5, // 7: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 10, // 8: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 1, // 9: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 3, // 10: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 8, // 11: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 9, // 12: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 12, // 13: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 9, // [9:14] is the sub-list for method output_type - 4, // [4:9] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 7, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 7, // 1: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 8, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory + 12, // 3: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 0, // 4: uber.submitqueue.stovepipe.ListRequest.order:type_name -> uber.submitqueue.stovepipe.ListOrder + 15, // 5: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 1, // 6: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest + 3, // 7: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest + 5, // 8: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + 6, // 9: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + 11, // 10: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + 14, // 11: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 2, // 12: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse + 4, // 13: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse + 9, // 14: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + 10, // 15: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + 13, // 16: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + 16, // 17: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse + 12, // [12:18] is the sub-list for method output_type + 6, // [6:12] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_stovepipe_proto_init() } @@ -1071,18 +1545,30 @@ func file_stovepipe_proto_init() { file_stovepipe_proto_msgTypes[12].OneofWrappers = []any{ (*GetProjectStatusByURIResponse_RepositoryBreakageDegree)(nil), } + file_stovepipe_proto_msgTypes[13].OneofWrappers = []any{ + (*ListRequest_AcceptedAtOrAfterMs)(nil), + (*ListRequest_AcceptedBeforeMs)(nil), + } + file_stovepipe_proto_msgTypes[14].OneofWrappers = []any{ + (*RequestSummary_AcceptedAtMs)(nil), + } + file_stovepipe_proto_msgTypes[15].OneofWrappers = []any{ + (*ListResponse_AcceptedAtOrAfterMs)(nil), + (*ListResponse_AcceptedBeforeMs)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_stovepipe_proto_rawDesc), len(file_stovepipe_proto_rawDesc)), - NumEnums: 0, - NumMessages: 13, + NumEnums: 1, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, GoTypes: file_stovepipe_proto_goTypes, DependencyIndexes: file_stovepipe_proto_depIdxs, + EnumInfos: file_stovepipe_proto_enumTypes, MessageInfos: file_stovepipe_proto_msgTypes, }.Build() File_stovepipe_proto = out.File diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index 6ee99feeb..5c80a74ae 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -26,6 +26,7 @@ type StovepipeYARPCClient interface { GetRequestHistoryByID(context.Context, *GetRequestHistoryByIDRequest, ...yarpc.CallOption) (*GetRequestHistoryByIDResponse, error) GetRequestHistoryByURI(context.Context, *GetRequestHistoryByURIRequest, ...yarpc.CallOption) (*GetRequestHistoryByURIResponse, error) GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest, ...yarpc.CallOption) (*GetProjectStatusByURIResponse, error) + List(context.Context, *ListRequest, ...yarpc.CallOption) (*ListResponse, error) } func newStovepipeYARPCClient(clientConfig transport.ClientConfig, anyResolver v2.AnyResolver, options ...v2.ClientOption) StovepipeYARPCClient { @@ -51,6 +52,7 @@ type StovepipeYARPCServer interface { GetRequestHistoryByID(context.Context, *GetRequestHistoryByIDRequest) (*GetRequestHistoryByIDResponse, error) GetRequestHistoryByURI(context.Context, *GetRequestHistoryByURIRequest) (*GetRequestHistoryByURIResponse, error) GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) + List(context.Context, *ListRequest) (*ListResponse, error) } type buildStovepipeYARPCProceduresParams struct { @@ -114,6 +116,16 @@ func buildStovepipeYARPCProcedures(params buildStovepipeYARPCProceduresParams) [ }, ), }, + { + MethodName: "List", + Handler: v2.NewUnaryHandler( + v2.UnaryHandlerParams{ + Handle: handler.List, + NewRequest: newStovepipeServiceListYARPCRequest, + AnyResolver: params.AnyResolver, + }, + ), + }, }, OnewayHandlerParams: []v2.BuildProceduresOnewayHandlerParams{}, StreamHandlerParams: []v2.BuildProceduresStreamHandlerParams{}, @@ -286,6 +298,18 @@ func (c *_StovepipeYARPCCaller) GetProjectStatusByURI(ctx context.Context, reque return response, err } +func (c *_StovepipeYARPCCaller) List(ctx context.Context, request *ListRequest, options ...yarpc.CallOption) (*ListResponse, error) { + responseMessage, err := c.streamClient.Call(ctx, "List", request, newStovepipeServiceListYARPCResponse, options...) + if responseMessage == nil { + return nil, err + } + response, ok := responseMessage.(*ListResponse) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceListYARPCResponse, responseMessage) + } + return response, err +} + type _StovepipeYARPCHandler struct { server StovepipeYARPCServer } @@ -370,6 +394,22 @@ func (h *_StovepipeYARPCHandler) GetProjectStatusByURI(ctx context.Context, requ return response, err } +func (h *_StovepipeYARPCHandler) List(ctx context.Context, requestMessage proto.Message) (proto.Message, error) { + var request *ListRequest + var ok bool + if requestMessage != nil { + request, ok = requestMessage.(*ListRequest) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceListYARPCRequest, requestMessage) + } + } + response, err := h.server.List(ctx, request) + if response == nil { + return nil, err + } + return response, err +} + func newStovepipeServicePingYARPCRequest() proto.Message { return &PingRequest{} } @@ -410,6 +450,14 @@ func newStovepipeServiceGetProjectStatusByURIYARPCResponse() proto.Message { return &GetProjectStatusByURIResponse{} } +func newStovepipeServiceListYARPCRequest() proto.Message { + return &ListRequest{} +} + +func newStovepipeServiceListYARPCResponse() proto.Message { + return &ListResponse{} +} + var ( emptyStovepipeServicePingYARPCRequest = &PingRequest{} emptyStovepipeServicePingYARPCResponse = &PingResponse{} @@ -421,66 +469,86 @@ var ( emptyStovepipeServiceGetRequestHistoryByURIYARPCResponse = &GetRequestHistoryByURIResponse{} emptyStovepipeServiceGetProjectStatusByURIYARPCRequest = &GetProjectStatusByURIRequest{} emptyStovepipeServiceGetProjectStatusByURIYARPCResponse = &GetProjectStatusByURIResponse{} + emptyStovepipeServiceListYARPCRequest = &ListRequest{} + emptyStovepipeServiceListYARPCResponse = &ListResponse{} ) var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x73, 0xdb, 0x44, - 0x14, 0xb7, 0xa2, 0xda, 0xb1, 0x5e, 0x1c, 0x87, 0x2e, 0x90, 0x51, 0x4d, 0xd3, 0x31, 0x62, 0x42, - 0xdd, 0xce, 0x60, 0x0f, 0xe5, 0x52, 0x38, 0x30, 0x60, 0xca, 0xd4, 0x3e, 0x94, 0xf1, 0x28, 0x94, - 0x03, 0x1c, 0x34, 0xb2, 0xf4, 0xc6, 0xd9, 0x36, 0xd2, 0x2a, 0xda, 0x55, 0x86, 0xf6, 0xc6, 0x81, - 0x2b, 0x33, 0x7c, 0x0e, 0xbe, 0x04, 0x5f, 0x83, 0x6f, 0xc3, 0xec, 0x1f, 0xc9, 0x7f, 0x6a, 0x2b, - 0x69, 0x6e, 0x7a, 0xff, 0xdf, 0xfe, 0xf6, 0xf7, 0xde, 0x0a, 0x8e, 0xb8, 0x60, 0x57, 0x98, 0xd1, - 0x0c, 0x87, 0x59, 0xce, 0x04, 0x23, 0xbd, 0x62, 0x8e, 0xf9, 0x90, 0x17, 0xf3, 0x84, 0x8a, 0xcb, - 0x02, 0x0b, 0x1c, 0x56, 0x1e, 0xde, 0x43, 0x38, 0x98, 0xd1, 0x74, 0xe1, 0xe3, 0x65, 0x81, 0x5c, - 0x10, 0x17, 0xf6, 0x13, 0xe4, 0x3c, 0x5c, 0xa0, 0x6b, 0xf5, 0xad, 0x81, 0xe3, 0x97, 0xa2, 0xf7, - 0xa7, 0x05, 0x1d, 0xed, 0xc9, 0x33, 0x96, 0x72, 0xdc, 0xed, 0x4a, 0x3e, 0x85, 0x0e, 0xc7, 0xfc, - 0x8a, 0x46, 0x18, 0xa4, 0x61, 0x82, 0xee, 0x9e, 0x32, 0x1f, 0x18, 0xdd, 0x4f, 0x61, 0x82, 0xe4, - 0x3e, 0x38, 0x82, 0x26, 0xc8, 0x45, 0x98, 0x64, 0xae, 0xdd, 0xb7, 0x06, 0xb6, 0xbf, 0x54, 0x90, - 0x1e, 0xb4, 0xcf, 0x19, 0x17, 0x2a, 0xf8, 0x8e, 0x0a, 0xae, 0x64, 0xef, 0x14, 0x0e, 0xa7, 0xe9, - 0x02, 0xb9, 0x28, 0x5b, 0xfe, 0x08, 0x9a, 0xea, 0x50, 0xa6, 0x0b, 0x2d, 0x78, 0x7d, 0xe8, 0x96, - 0x6e, 0xa6, 0xdf, 0x2e, 0xec, 0xd1, 0xd8, 0x38, 0xed, 0xd1, 0xd8, 0x3b, 0x83, 0xfb, 0xcf, 0xb1, - 0xcc, 0x32, 0xa1, 0x5c, 0xb0, 0xfc, 0xcd, 0xf8, 0xcd, 0xf4, 0x59, 0x6d, 0x5e, 0x72, 0x02, 0x90, - 0x6b, 0x87, 0x80, 0xc6, 0xe6, 0x64, 0x8e, 0xd1, 0x4c, 0x63, 0xef, 0x39, 0x9c, 0x6c, 0x49, 0xfa, - 0xd2, 0x9f, 0xd6, 0x67, 0xfd, 0x00, 0xec, 0x22, 0xa7, 0x26, 0x9d, 0xfc, 0xf4, 0xfe, 0xb5, 0xa0, - 0x63, 0xe2, 0x7f, 0xbc, 0xc2, 0x54, 0x90, 0x7b, 0xd0, 0x46, 0xf9, 0x11, 0x54, 0x87, 0xd8, 0x57, - 0xf2, 0x34, 0x96, 0x78, 0x57, 0xd8, 0x05, 0x09, 0x57, 0x69, 0x6c, 0xff, 0xa0, 0xd2, 0xbd, 0xe0, - 0xe4, 0x14, 0x0e, 0xcb, 0xb6, 0xb9, 0x08, 0x05, 0x2a, 0xcc, 0x9d, 0x49, 0xc3, 0xef, 0x18, 0xf5, - 0x99, 0xd4, 0x92, 0x63, 0x68, 0xaa, 0xa4, 0x1a, 0xf5, 0x49, 0xc3, 0xd7, 0x22, 0x39, 0x85, 0x2e, - 0x2b, 0x44, 0xc4, 0x12, 0x0c, 0x72, 0x0c, 0x39, 0x4b, 0xdd, 0xa6, 0x6a, 0xe1, 0xd0, 0x68, 0x7d, - 0xa5, 0x1c, 0x77, 0x00, 0x58, 0x14, 0x15, 0x79, 0x8e, 0x69, 0x84, 0xde, 0x25, 0x74, 0xd7, 0x81, - 0xd8, 0x00, 0xcf, 0xda, 0x00, 0x8f, 0x7c, 0x07, 0x2d, 0x55, 0x4e, 0x9e, 0xc0, 0x1e, 0x1c, 0x3c, - 0x19, 0x0c, 0x77, 0x13, 0x77, 0xb8, 0x0a, 0x8e, 0x6f, 0xe2, 0xbc, 0x70, 0x2b, 0xfc, 0xf2, 0x4e, - 0x0d, 0x09, 0x96, 0x25, 0xac, 0x5b, 0x96, 0x78, 0x05, 0x0f, 0x76, 0xdd, 0xb0, 0xa9, 0x31, 0x01, - 0xe7, 0x5c, 0xe9, 0x29, 0x96, 0x65, 0x1e, 0xd7, 0x95, 0x59, 0xcf, 0xe5, 0x2f, 0x83, 0xbd, 0x7f, - 0x2c, 0xc5, 0xd1, 0x59, 0xce, 0x5e, 0x61, 0xa4, 0xae, 0xa8, 0xe0, 0x37, 0x60, 0xd3, 0x09, 0x40, - 0x74, 0x1e, 0xa6, 0x0b, 0x0c, 0x96, 0xa4, 0x72, 0xb4, 0xe6, 0x65, 0x4e, 0xe5, 0x74, 0x65, 0x3a, - 0x23, 0x77, 0xed, 0xbe, 0x2d, 0xa7, 0xab, 0x94, 0xc9, 0x27, 0xe0, 0x64, 0xe1, 0x02, 0x03, 0x4e, - 0xdf, 0xea, 0xd1, 0x6b, 0xfa, 0x6d, 0xa9, 0x38, 0xa3, 0x6f, 0x55, 0x5e, 0x65, 0x14, 0xec, 0x35, - 0x96, 0x0c, 0x50, 0xee, 0x3f, 0x4b, 0x85, 0x37, 0x87, 0xbb, 0xa6, 0xd3, 0x5f, 0xc2, 0x0b, 0x1a, - 0x87, 0x82, 0xb2, 0x54, 0x6e, 0x09, 0x93, 0xbc, 0x64, 0xad, 0x11, 0xc9, 0x23, 0x38, 0x9a, 0xe7, - 0x18, 0xbe, 0x96, 0x19, 0x63, 0x5c, 0xe4, 0xa8, 0x17, 0x85, 0x35, 0x69, 0xf8, 0xdd, 0xd2, 0xf0, - 0x4c, 0xe9, 0xc7, 0x6d, 0x68, 0xe5, 0xc8, 0x8b, 0x0b, 0xe1, 0xfd, 0x67, 0xab, 0x1b, 0xde, 0x86, - 0x88, 0x41, 0xff, 0x1a, 0x8e, 0x55, 0x88, 0xed, 0xed, 0x46, 0xcc, 0xde, 0x44, 0xec, 0x1e, 0xb4, - 0xe7, 0x21, 0xd7, 0x46, 0xbd, 0x8f, 0xf6, 0xa5, 0x2c, 0x4d, 0x9f, 0x6d, 0x0e, 0x96, 0x86, 0x65, - 0x7d, 0xac, 0x3c, 0x38, 0x2c, 0xb2, 0x38, 0x14, 0x18, 0x07, 0xa1, 0x90, 0x13, 0x0a, 0x7a, 0x42, - 0x8d, 0xf2, 0x7b, 0xf1, 0x82, 0x93, 0x6f, 0xa1, 0x97, 0x63, 0xc6, 0x38, 0x95, 0x24, 0x08, 0x36, - 0x91, 0x69, 0x19, 0x64, 0xdc, 0xa5, 0xcf, 0x78, 0x0d, 0x23, 0xf2, 0x14, 0x5c, 0x83, 0x6c, 0xa0, - 0xb1, 0xe2, 0x41, 0xc4, 0x92, 0xec, 0x02, 0x05, 0xba, 0xfb, 0x7d, 0x6b, 0xd0, 0xf6, 0x8f, 0x8d, - 0xdd, 0xd7, 0xe6, 0x1f, 0x8c, 0x95, 0x4c, 0x57, 0xf8, 0xd0, 0x56, 0x74, 0xfd, 0xa2, 0x8e, 0xae, - 0xef, 0xdc, 0xf1, 0x0a, 0x7d, 0x3e, 0x87, 0xa3, 0x14, 0x7f, 0x17, 0xc1, 0x0a, 0x4d, 0x1c, 0xbd, - 0x28, 0xa4, 0x7a, 0x56, 0x52, 0x65, 0xfc, 0x21, 0xdc, 0x5d, 0x39, 0xac, 0xee, 0xf7, 0xc9, 0x1f, - 0x4d, 0x70, 0xce, 0xca, 0x32, 0xe4, 0x37, 0xb8, 0x23, 0x9f, 0x1b, 0xf2, 0xb0, 0xb6, 0x97, 0xe5, - 0xd3, 0xd5, 0x1b, 0x5c, 0xef, 0xa8, 0x29, 0xe2, 0x35, 0x48, 0x08, 0x2d, 0xfd, 0x3a, 0x90, 0x47, - 0x75, 0x51, 0x6b, 0x0f, 0x4d, 0xef, 0xf1, 0x4d, 0x5c, 0xab, 0x12, 0x7f, 0x59, 0xf0, 0xf1, 0xd6, - 0x5d, 0x44, 0x9e, 0xd6, 0xe5, 0xa9, 0x7b, 0x92, 0x7a, 0x5f, 0xdf, 0x22, 0xb2, 0x6a, 0xe8, 0x6f, - 0x0b, 0x8e, 0xb7, 0x6f, 0x2e, 0xf2, 0xbe, 0x79, 0x97, 0x1b, 0xa8, 0xf7, 0xcd, 0x6d, 0x42, 0x37, - 0x41, 0x7a, 0x77, 0x9c, 0xaf, 0x05, 0x69, 0xe7, 0x4e, 0xbc, 0x16, 0xa4, 0xdd, 0xbb, 0xc3, 0x6b, - 0x8c, 0x11, 0x1e, 0x44, 0x2c, 0xa9, 0xc9, 0x30, 0xee, 0x56, 0x14, 0x9d, 0xc9, 0x9f, 0xab, 0x99, - 0xf5, 0xeb, 0x97, 0x0b, 0x2a, 0xce, 0x8b, 0xf9, 0x30, 0x62, 0xc9, 0x48, 0x06, 0x8e, 0x56, 0x02, - 0x47, 0x61, 0x46, 0x47, 0x55, 0xf0, 0x48, 0xfd, 0x8f, 0x65, 0xf3, 0x79, 0x4b, 0x7d, 0x7c, 0xf5, - 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xe5, 0xeb, 0xab, 0x09, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcd, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0xda, 0xb5, 0x63, 0xbf, 0x38, 0x4e, 0x3a, 0x29, 0xc1, 0x35, 0x4d, 0x15, 0x16, 0xa5, + 0x75, 0x23, 0xd5, 0x11, 0x41, 0xaa, 0x0a, 0x48, 0x88, 0x38, 0x31, 0xb5, 0x25, 0x42, 0xcd, 0x3a, + 0xe1, 0x00, 0x87, 0xd5, 0x7a, 0xf7, 0xd5, 0xd9, 0x36, 0xfb, 0x91, 0x9d, 0xd9, 0x40, 0x7b, 0xe7, + 0x8a, 0xc4, 0x85, 0x7f, 0x82, 0x2b, 0xdc, 0xf9, 0x37, 0xb8, 0xf0, 0xb7, 0xa0, 0xf9, 0xd8, 0xf5, + 0x47, 0xed, 0x75, 0x93, 0x03, 0xdc, 0x76, 0xde, 0xd7, 0xcc, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0x0b, + 0xeb, 0x94, 0x05, 0x57, 0x18, 0xba, 0x21, 0xb6, 0xc2, 0x28, 0x60, 0x01, 0x69, 0xc4, 0x43, 0x8c, + 0x5a, 0x34, 0x1e, 0x7a, 0x2e, 0xbb, 0x8c, 0x31, 0xc6, 0x56, 0x6a, 0xa1, 0x3f, 0x84, 0xd5, 0xbe, + 0xeb, 0x8f, 0x0c, 0xbc, 0x8c, 0x91, 0x32, 0x52, 0x87, 0x15, 0x0f, 0x29, 0xb5, 0x46, 0x58, 0xd7, + 0x76, 0xb4, 0x66, 0xc5, 0x48, 0x96, 0xfa, 0xcf, 0x1a, 0x54, 0xa5, 0x25, 0x0d, 0x03, 0x9f, 0xe2, + 0x62, 0x53, 0xf2, 0x21, 0x54, 0x29, 0x46, 0x57, 0xae, 0x8d, 0xa6, 0x6f, 0x79, 0x58, 0xcf, 0x0b, + 0xf5, 0xaa, 0x92, 0x7d, 0x63, 0x79, 0x48, 0xee, 0x41, 0x85, 0xb9, 0x1e, 0x52, 0x66, 0x79, 0x61, + 0xbd, 0xb0, 0xa3, 0x35, 0x0b, 0xc6, 0x58, 0x40, 0x1a, 0x50, 0x3e, 0x0f, 0x28, 0x13, 0xce, 0xb7, + 0x84, 0x73, 0xba, 0xd6, 0x77, 0x61, 0xad, 0xe7, 0x8f, 0x90, 0xb2, 0xe4, 0xc8, 0x77, 0xa0, 0x28, + 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x0e, 0xd4, 0x12, 0x33, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, + 0x19, 0xe5, 0x5d, 0x47, 0x1f, 0xc0, 0xbd, 0x67, 0x98, 0x44, 0xe9, 0xba, 0x94, 0x05, 0xd1, 0xeb, + 0xf6, 0xeb, 0xde, 0x71, 0x66, 0x5c, 0xb2, 0x0d, 0x10, 0x49, 0x03, 0xd3, 0x75, 0xd4, 0xcd, 0x2a, + 0x4a, 0xd2, 0x73, 0xf4, 0x67, 0xb0, 0x3d, 0x27, 0xe8, 0x99, 0xd1, 0xcb, 0x8e, 0xba, 0x01, 0x85, + 0x38, 0x72, 0x55, 0x38, 0xfe, 0xa9, 0xff, 0xa5, 0x41, 0x55, 0xf9, 0x77, 0xae, 0xd0, 0x67, 0xe4, + 0x2e, 0x94, 0x91, 0x7f, 0x98, 0xe9, 0x25, 0x56, 0xc4, 0xba, 0xe7, 0x70, 0xbc, 0x53, 0xec, 0x4c, + 0x8f, 0x8a, 0x30, 0x05, 0x63, 0x35, 0x95, 0x9d, 0x50, 0xb2, 0x0b, 0x6b, 0xc9, 0xb1, 0x29, 0xb3, + 0x18, 0x0a, 0xcc, 0x2b, 0xdd, 0x9c, 0x51, 0x55, 0xe2, 0x01, 0x97, 0x92, 0x2d, 0x28, 0x8a, 0xa0, + 0x12, 0xf5, 0x6e, 0xce, 0x90, 0x4b, 0xb2, 0x0b, 0xb5, 0x20, 0x66, 0x76, 0xe0, 0xa1, 0x19, 0xa1, + 0x45, 0x03, 0xbf, 0x5e, 0x14, 0x47, 0x58, 0x53, 0x52, 0x43, 0x08, 0xdb, 0x55, 0x80, 0xc0, 0xb6, + 0xe3, 0x28, 0x42, 0xdf, 0x46, 0xfd, 0x12, 0x6a, 0xd3, 0x40, 0xcc, 0x80, 0xa7, 0xcd, 0x80, 0x47, + 0xbe, 0x84, 0x92, 0xd8, 0x8e, 0xdf, 0xa0, 0xd0, 0x5c, 0x3d, 0x68, 0xb6, 0x16, 0x13, 0xb7, 0x35, + 0x09, 0x8e, 0xa1, 0xfc, 0x74, 0x6b, 0x2e, 0xfc, 0x3c, 0xa7, 0x8a, 0x04, 0xe3, 0x2d, 0xb4, 0x1b, + 0x6e, 0xf1, 0x12, 0xee, 0x2f, 0xca, 0xb0, 0xda, 0xa3, 0x0b, 0x95, 0x73, 0x21, 0x77, 0x31, 0xd9, + 0x66, 0x2f, 0x6b, 0x9b, 0xe9, 0x58, 0xc6, 0xd8, 0x59, 0xff, 0x5d, 0x13, 0x1c, 0xed, 0x47, 0xc1, + 0x4b, 0xb4, 0x45, 0x8a, 0x62, 0xfa, 0x0e, 0x6c, 0xda, 0x06, 0xb0, 0xcf, 0x2d, 0x7f, 0x84, 0xe6, + 0x98, 0x54, 0x15, 0x29, 0x39, 0x8b, 0x5c, 0x5e, 0x5d, 0xa1, 0x8c, 0x48, 0xeb, 0x85, 0x9d, 0x02, + 0xaf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x8d, 0xd0, 0xa4, 0xee, 0x1b, 0x59, 0x7a, 0x45, + 0xa3, 0xcc, 0x05, 0x03, 0xf7, 0x8d, 0x88, 0x2b, 0x94, 0x2c, 0x78, 0x85, 0x09, 0x03, 0x84, 0xf9, + 0x29, 0x17, 0xe8, 0x43, 0xb8, 0xad, 0x4e, 0xfa, 0x9d, 0x75, 0xe1, 0x3a, 0x16, 0x73, 0x03, 0x9f, + 0x77, 0x09, 0x15, 0x3c, 0x61, 0xad, 0x5a, 0x92, 0x47, 0xb0, 0x3e, 0x8c, 0xd0, 0x7a, 0xc5, 0x23, + 0x3a, 0x38, 0x8a, 0x50, 0x36, 0x0a, 0xad, 0x9b, 0x33, 0x6a, 0x89, 0xe2, 0x58, 0xc8, 0xdb, 0x65, + 0x28, 0x45, 0x48, 0xe3, 0x0b, 0xa6, 0xff, 0x5d, 0x10, 0x19, 0x9e, 0x87, 0x88, 0x42, 0x7f, 0x09, + 0xc7, 0x52, 0xc4, 0xf2, 0x8b, 0x11, 0x2b, 0xcc, 0x22, 0x76, 0x17, 0xca, 0x43, 0x8b, 0x4a, 0xa5, + 0xec, 0x47, 0x2b, 0x7c, 0xcd, 0x55, 0x1f, 0xcd, 0x16, 0x96, 0x84, 0x65, 0xba, 0xac, 0x74, 0x58, + 0x8b, 0x43, 0xc7, 0x62, 0xe8, 0x98, 0x16, 0xe3, 0x15, 0x0a, 0xb2, 0x42, 0x95, 0xf0, 0x90, 0x9d, + 0x50, 0xf2, 0x05, 0x34, 0x22, 0x0c, 0x03, 0xea, 0x72, 0x12, 0x98, 0xb3, 0xc8, 0x94, 0x14, 0x32, + 0xf5, 0xb1, 0x4d, 0x7b, 0x0a, 0x23, 0xf2, 0x14, 0xea, 0x0a, 0x59, 0x53, 0x62, 0x45, 0x4d, 0x3b, + 0xf0, 0xc2, 0x0b, 0x64, 0x58, 0x5f, 0xd9, 0xd1, 0x9a, 0x65, 0x63, 0x4b, 0xe9, 0x0d, 0xa9, 0x3e, + 0x52, 0x5a, 0xd2, 0x9b, 0xe0, 0x43, 0x59, 0xd0, 0xf5, 0x71, 0x16, 0x5d, 0xdf, 0xca, 0xf1, 0x04, + 0x7d, 0x1e, 0xc0, 0xba, 0x8f, 0x3f, 0x31, 0x73, 0x82, 0x26, 0x15, 0xd9, 0x28, 0xb8, 0xb8, 0x9f, + 0x50, 0xa5, 0xbd, 0x09, 0xb7, 0x27, 0x2e, 0xab, 0x72, 0xfb, 0x47, 0x1e, 0x56, 0xbf, 0x76, 0x97, + 0x34, 0x76, 0xf2, 0x39, 0x14, 0x83, 0xc8, 0xc1, 0x48, 0x24, 0xb0, 0x76, 0xb0, 0x9b, 0x75, 0x54, + 0x1e, 0xed, 0x39, 0x37, 0x36, 0xa4, 0x0f, 0x79, 0x02, 0xef, 0x5b, 0xb6, 0x8d, 0xa1, 0xca, 0x44, + 0x10, 0x99, 0xd6, 0x0b, 0x86, 0x11, 0x4f, 0x89, 0x78, 0x84, 0xba, 0x39, 0x63, 0x33, 0x31, 0x38, + 0x64, 0xcf, 0xa3, 0x43, 0xae, 0x3d, 0xa1, 0xa4, 0x05, 0x24, 0xf5, 0x1b, 0xe2, 0x8b, 0x20, 0x42, + 0xee, 0x72, 0x4b, 0xb8, 0x68, 0xc6, 0x46, 0xa2, 0x6b, 0x0b, 0xd5, 0xc9, 0x4c, 0x19, 0x15, 0x33, + 0xcb, 0xa8, 0x34, 0x53, 0x46, 0xed, 0x2d, 0xb8, 0x93, 0xee, 0x75, 0x11, 0xfc, 0x88, 0x91, 0x39, + 0x0c, 0x62, 0xdf, 0x99, 0x92, 0xc7, 0x61, 0x98, 0xc8, 0xf5, 0x3f, 0xf3, 0x69, 0x9f, 0x1d, 0xc4, + 0x9e, 0x67, 0x2d, 0xef, 0xb3, 0xff, 0x4b, 0x0d, 0x3c, 0x86, 0x4d, 0xa1, 0x34, 0xa7, 0x2b, 0xa1, + 0x24, 0x2a, 0x61, 0x43, 0xa8, 0xce, 0x26, 0xca, 0xe1, 0x01, 0xd4, 0x26, 0x33, 0xe5, 0x51, 0x41, + 0x62, 0x9e, 0xa0, 0xea, 0x38, 0x41, 0xe2, 0x61, 0x9b, 0x7d, 0x99, 0xca, 0xf3, 0x5e, 0xa6, 0xdb, + 0xb0, 0x2e, 0xdd, 0x2c, 0xdf, 0x46, 0x93, 0xbf, 0x8c, 0xfa, 0x6f, 0x79, 0xa8, 0x4a, 0xba, 0xa9, + 0xce, 0xf1, 0x15, 0x94, 0xd5, 0x89, 0xaf, 0xd3, 0xb6, 0x15, 0xe6, 0x46, 0xea, 0x3b, 0xaf, 0x08, + 0xf2, 0x73, 0x8a, 0xe0, 0xbf, 0x22, 0xe3, 0x75, 0x09, 0xb5, 0xf7, 0x04, 0x2a, 0x69, 0xe1, 0x90, + 0x4d, 0x58, 0x37, 0x3a, 0xdf, 0x9e, 0x75, 0x06, 0xa7, 0x66, 0xef, 0xd8, 0x3c, 0xee, 0x0c, 0x8e, + 0x36, 0x72, 0xe4, 0x0e, 0x6c, 0x1c, 0x1e, 0x1d, 0x75, 0xfa, 0xa7, 0x9d, 0x63, 0xf3, 0xf0, 0x54, + 0x4a, 0xb5, 0x83, 0x7f, 0x8a, 0x50, 0x19, 0x24, 0xf0, 0x90, 0x1f, 0xe0, 0x16, 0x1f, 0x17, 0xc9, + 0xc3, 0xcc, 0x5e, 0x32, 0x1e, 0x3d, 0x1b, 0xcd, 0xe5, 0x86, 0x32, 0x51, 0x7a, 0x8e, 0x58, 0x50, + 0x92, 0xd3, 0x1d, 0x79, 0x94, 0xe5, 0x35, 0x35, 0x28, 0x36, 0xf6, 0xde, 0xc5, 0x34, 0xdd, 0xe2, + 0x17, 0x0d, 0xde, 0x9b, 0x3b, 0x4b, 0x90, 0xa7, 0x59, 0x71, 0xb2, 0x46, 0xca, 0xc6, 0xa7, 0x37, + 0xf0, 0x4c, 0x0f, 0xf4, 0xab, 0x06, 0x5b, 0xf3, 0x27, 0x0f, 0x72, 0xdd, 0xb8, 0xe3, 0x09, 0xa2, + 0xf1, 0xd9, 0x4d, 0x5c, 0x67, 0x41, 0x7a, 0xfb, 0x39, 0x5e, 0x0a, 0xd2, 0xc2, 0x99, 0x66, 0x29, + 0x48, 0x8b, 0xdf, 0x7e, 0x3d, 0xc7, 0x59, 0xc7, 0xb9, 0x9b, 0xcd, 0xba, 0x89, 0x47, 0x26, 0x9b, + 0x75, 0x93, 0xed, 0x41, 0xcf, 0xb5, 0x11, 0xee, 0xdb, 0x81, 0x97, 0xe1, 0xd0, 0xae, 0xa5, 0xfc, + 0xef, 0xf3, 0x3f, 0xaf, 0xbe, 0xf6, 0xfd, 0xc7, 0x23, 0x97, 0x9d, 0xc7, 0xc3, 0x96, 0x1d, 0x78, + 0xfb, 0xdc, 0x71, 0x7f, 0xc2, 0x71, 0xdf, 0x0a, 0xdd, 0xfd, 0xd4, 0x79, 0x5f, 0xfc, 0xac, 0x85, + 0xc3, 0x61, 0x49, 0x7c, 0x7c, 0xf2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x5a, 0x6e, 0x1c, + 0xc8, 0x0d, 0x00, 0x00, }, } diff --git a/api/stovepipe/protopb/stovepipe_grpc.pb.go b/api/stovepipe/protopb/stovepipe_grpc.pb.go index 1ceefa4c2..b766f9290 100644 --- a/api/stovepipe/protopb/stovepipe_grpc.pb.go +++ b/api/stovepipe/protopb/stovepipe_grpc.pb.go @@ -39,6 +39,7 @@ const ( Stovepipe_GetRequestHistoryByID_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetRequestHistoryByID" Stovepipe_GetRequestHistoryByURI_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetRequestHistoryByURI" Stovepipe_GetProjectStatusByURI_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetProjectStatusByURI" + Stovepipe_List_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/List" ) // StovepipeClient is the client API for Stovepipe service. @@ -58,6 +59,8 @@ type StovepipeClient interface { GetRequestHistoryByURI(ctx context.Context, in *GetRequestHistoryByURIRequest, opts ...grpc.CallOption) (*GetRequestHistoryByURIResponse, error) // GetProjectStatusByURI returns the current validation status for an exact commit URI. GetProjectStatusByURI(ctx context.Context, in *GetProjectStatusByURIRequest, opts ...grpc.CallOption) (*GetProjectStatusByURIResponse, error) + // List returns a queue-scoped page of current request summaries. + List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) } type stovepipeClient struct { @@ -118,6 +121,16 @@ func (c *stovepipeClient) GetProjectStatusByURI(ctx context.Context, in *GetProj return out, nil } +func (c *stovepipeClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListResponse) + err := c.cc.Invoke(ctx, Stovepipe_List_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // StovepipeServer is the server API for Stovepipe service. // All implementations must embed UnimplementedStovepipeServer // for forward compatibility. @@ -135,6 +148,8 @@ type StovepipeServer interface { GetRequestHistoryByURI(context.Context, *GetRequestHistoryByURIRequest) (*GetRequestHistoryByURIResponse, error) // GetProjectStatusByURI returns the current validation status for an exact commit URI. GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) + // List returns a queue-scoped page of current request summaries. + List(context.Context, *ListRequest) (*ListResponse, error) mustEmbedUnimplementedStovepipeServer() } @@ -160,6 +175,9 @@ func (UnimplementedStovepipeServer) GetRequestHistoryByURI(context.Context, *Get func (UnimplementedStovepipeServer) GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetProjectStatusByURI not implemented") } +func (UnimplementedStovepipeServer) List(context.Context, *ListRequest) (*ListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} func (UnimplementedStovepipeServer) mustEmbedUnimplementedStovepipeServer() {} func (UnimplementedStovepipeServer) testEmbeddedByValue() {} @@ -271,6 +289,24 @@ func _Stovepipe_GetProjectStatusByURI_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _Stovepipe_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StovepipeServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Stovepipe_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StovepipeServer).List(ctx, req.(*ListRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Stovepipe_ServiceDesc is the grpc.ServiceDesc for Stovepipe service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -298,6 +334,10 @@ var Stovepipe_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetProjectStatusByURI", Handler: _Stovepipe_GetProjectStatusByURI_Handler, }, + { + MethodName: "List", + Handler: _Stovepipe_List_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "stovepipe.proto", diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index cbf95bd9f..d87e8ee90 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -1,132 +1,63 @@ # Stovepipe List API -## Status and Decisions +The [protobuf contract](../../../api/stovepipe/proto/stovepipe.proto) is included for review; controller and storage implementation are deferred. -Proposed contract; the RPC and storage changes are not implemented. +## Proposal -List serves retained request summaries for one queue. Its default is numeric request-ID ingest order, newest first, with 50 rows per page. Callers can instead select acceptance-time order and an optional time range. Superseded requests are included, and duplicate Ingest calls resolving to one request produce one row. +`List(ListRequest) -> ListResponse` returns current request summaries for one queue. Default to newest request-ID order; offer acceptance-time order when callers want timestamp selection. This is a request listing, not scheduler position or historical state. -Acceptance time is copied from the original retained accepted event into the existing summary. No new producer signal or per-queue counter is needed. Request-ID listing reads the summaries directly. Acceptance-time listing uses a small immutable time-to-request mapping and then reads those same summaries. Mutable lifecycle state has one materialized copy. - -## RPC Contract - -The RPC is `List(ListRequest) -> ListResponse` on the existing Stovepipe service. Published protobufs belong under `api/stovepipe/proto/`; controller inputs and results remain domain values. +## Contract | Request field | Type | Meaning | | --- | --- | --- | -| `queue` | string | Required exact configured queue; non-empty and at most 255 bytes. | -| `order` | ListOrder enum | `REQUEST_ID_DESC = 0` is the default; `ACCEPTED_AT_DESC = 1` selects acceptance-time order. Other values are invalid. | -| `accepted_at_or_after_ms` | int64 with presence | Optional inclusive lower acceptance-time bound, in Unix milliseconds; valid only with acceptance-time order. | -| `accepted_before_ms` | int64 with presence | Optional exclusive upper acceptance-time bound, in Unix milliseconds; valid only with acceptance-time order. | -| `page_size` | int32 | Zero or omitted selects 50; valid nonzero values are 1 through 200. | -| `page_token` | string | Opaque continuation token; empty selects the first page. | - -| Response field | Type | Meaning | -| --- | --- | --- | -| `requests` | repeated RequestSummary | Summaries in the selected order. | -| `next_page_token` | string | Continuation when a further row was observed; empty otherwise. | -| `accepted_at_or_after_ms` | int64 with presence | Effective lower bound in acceptance-time mode; absent in request-ID mode. | -| `accepted_before_ms` | int64 with presence | Effective upper bound in acceptance-time mode; absent in request-ID mode. | - -On every page, callers supply the queue and order used for the first page. Page size may change. Time bounds may be omitted on continuations; if supplied, each must match its token value. There is no cross-queue selector, and every call follows the service's queue-access policy. IDs remain opaque to clients. - -## Ordering and Time Defaults - -`REQUEST_ID_DESC` uses the numeric per-queue sequence already used by [CompareRequestID](../../../stovepipe/entity/request_id.go) and [backlog coalescing](steps/process.md#backlog-coalescing). It lists all retained summaries, including legacy rows whose acceptance time is unknown. It has no time cutoff and rejects supplied time bounds. Counter gaps are valid and do not represent requests to synthesize or individually probe. - -`ACCEPTED_AT_DESC` orders by `(accepted_at_ms DESC, request_id DESC)`. The ID tie-breaker uses UTF-8 byte ordering, independent of locale or numeric interpretation. This mode includes only summaries with a verified acceptance timestamp. It never promises numeric ingest order within a time interval. - -Resolve an acceptance-time query's bounds once on the first page: - -| Supplied bounds | Effective interval | -| --- | --- | -| Neither | `[0, now)`, sampling the server clock once. | -| Lower only | `[lower, now)`, sampling the server clock once. | -| Upper only | `[0, upper)`. | -| Both | `[lower, upper)`. | - -Supplied bounds must be non-negative, and the resolved lower bound must be strictly less than the upper bound. Explicit future bounds are allowed. Scalar presence distinguishes omission from an explicit zero. Every acceptance-time response echoes the resolved bounds; a token preserves them, so later pages never resample the clock. Starting with an empty token resolves a new query. Neither mode has an implicit 24-hour window or a maximum interval width: the ordered access path and page limit bound each call. - -Time selection uses `lower <= accepted_at_ms < upper`, with current materialized lifecycle state at read time. It does not reconstruct state at the upper bound or find every request active during the interval. A request accepted before the lower bound is excluded even if still processing. - -## Summary Fields and Existing Data - -The [domain summary](../../../stovepipe/entity/request_summary.go) and [SQL schema](../../../stovepipe/extension/storage/mysql/schema/request_summary.sql) already contain six response fields. Acceptance time and outcome reason are recorded in logs but need to be added to the summary. +| `queue` | string | Required configured queue. | +| `order` | ListOrder | `REQUEST_ID_DESC = 0` (default) or `ACCEPTED_AT_DESC = 1`. | +| `accepted_at_or_after_ms` | optional int64 | Inclusive lower acceptance-time bound; time order only. | +| `accepted_before_ms` | optional int64 | Exclusive upper acceptance-time bound; time order only. | +| `page_size` | int32 | Default 50; maximum 200. Zero means default. | +| `page_token` | string | Empty for the first page; otherwise an opaque continuation. | -| Wire field | Type | Current source | Required work | -| --- | --- | --- | --- | -| `request_id` | string | RequestSummary.RequestID | Already materialized. | -| `queue` | string | RequestSummary.Queue | Already materialized. | -| `change_uri` | string | RequestSummary.URI | Already materialized; preserve the exact URI. | -| `base_uri` | string | RequestSummary.BaseURI | Already materialized; empty before selection or for a full build. | -| `request_state` | string | RequestSummary.State | Already materialized. | -| `state_updated_at_ms` | int64 | RequestSummary.StateTimestampMs | Already materialized; timestamp of the represented state entry. | -| `accepted_at_ms` | int64 with presence | Canonical version-1 accepted log's TimestampMs | Add immutable acceptance time, preserving absence for legacy summaries. | -| `outcome_reason` | string | Winning state log's OutcomeReason | Add to the summary and advance with the winning state; empty when unavailable or inapplicable. | +The response contains `requests`, `next_page_token`, and, in time mode, the two resolved time bounds. No matches returns an empty page; an empty continuation means no further row was observed. -Acceptance time is the timestamp of the original retained `accepted` entry for request version 1. The materializer samples time before an insertion attempt, and duplicate reconciliation preserves the first successfully retained entry's timestamp. It records acceptance-log time, not first RPC receipt, commit author time, build start, or completion. Once known, it never changes. `StateTimestampMs` advances with lifecycle state and is not a substitute. +Continuations repeat the same queue and order. Time bounds may be omitted or must match the token; page size may change. Tokens preserve the query bounds and continue exclusively after the last returned ordering key. Invalid inputs and mismatched tokens fail the request. Every page follows the service's queue-access policy. -A retained accepted entry can supply its timestamp directly. To initialize an older summary, retrieve that one occurrence by stable ID. Missing historical acceptance leaves the field absent, rather than inventing a time or using zero as unknown. The row remains available in request-ID mode and is excluded from acceptance-time mode. Infrastructure lookup failures remain errors. - -Outcome reason comes from the retained log matching the summary's current `RequestVersion`, not an older entry that triggered repair. Initialize missing context conditionally and reload after a version race. Filling context advances the summary's projection version without changing the represented request version. Lifecycle winners advance state, baseline, state timestamp, and reason together. Timestamps do not decide the winner; existing request-version reconciliation remains authoritative. - -The public lifecycle vocabulary is `accepted`, `processing`, `superseded`, `succeeded`, `failed`, and `cancelled`; reasons use the existing [public vocabulary](request-log.md#outcome-reasons). Clients tolerate future values. A terminal lifecycle does not guarantee record-stage completion or a validation fact. List omits validation verdicts, project results, build details, arbitrary metadata, and histories; existing status and history APIs serve those concerns. - -## Storage Access Paths - -Keep `RequestSummaryStore` as the authoritative lifecycle read model and add a bounded request-ID range read for the resolved queue. Its current VARCHAR primary key does not provide numeric order: lexical order places 9 after 10. Use an order-preserving primary-key representation of the existing sequence, such as fixed-width encoded numeric keys, while retaining the public ID as a string. Point reads derive the same internal identity key. This requires a compatible storage-key migration, not a new event or a separate mutable projection. A numeric cast followed by sorting the entire queue is not a bounded range implementation. - -For time queries, add an immutable `RequestAcceptance` mapping with logical key `(queue, accepted_at_ms, request_id)`. Its only information is the verified acceptance tuple identifying an existing summary. The corresponding queue-scoped store provides idempotent create and a limited ordered range read with an exclusive tuple cursor. A MySQL implementation uses this tuple as its primary key with binary ID comparison; an ordered key-value backend uses the equivalent key. No secondary-index capability is required. - -Request-ID mode reads at most `page_size + 1` summaries directly. Acceptance-time mode reads at most `page_size + 1` mappings, then retrieves at most `page_size` summaries by individual primary-key reads. The extra mapping determines whether another page exists and needs no summary lookup. Reads may use bounded concurrency; the contract does not require multi-key queries or joins. A missing mapped summary, mismatched queue, or acceptance timestamp disagreeing with its mapping is an internal consistency error and fails the page. - -Both modes return current state from the same authoritative summary. There is no replicated mutable queue summary to synchronize. A per-queue latest ID or timestamp cannot replace the time mapping: IDs are allocated before acceptance is recorded, so one call may allocate 41 and stall while 42 records acceptance first. Scanning IDs and stopping at an old timestamp can therefore miss matching requests. - -This design follows the repository's [key-value storage contract](../../../submitqueue/extension/storage/README.md#key-value-contract), which permits bounded reads over leading primary-key components and first-class mapping stores for needed alternate lookups. A SQL secondary index on the summary could implement time selection for MySQL, but would make that alternate lookup implicit and require other backends to supply a capability the existing point-store contract does not express. The explicit immutable mapping is the portable index, not a way to avoid maintaining an index. Its cost is one additional durable mapping per request, an idempotent create/ensure step on state reconciliation, and bounded summary point reads per time-ordered page. V1 does not introduce an exception to the rule against secondary-index-dependent store queries. - -## Writes and Repair - -Extend the existing [materializer](../../../stovepipe/core/requestlog/request_summary.go) to retain the canonical state log, advance or initialize the authoritative summary, and ensure its acceptance mapping before dependent publication. New accepted entries must establish their timestamp and mapping before process publication. A publish failure leaves the durable admission visible; retry of the same queue and URI repairs the handoff. - -Mapping creation is idempotent and has no lifecycle update operation. If the incoming state loses to a newer summary, still ensure the mapping from that authoritative summary. If a legacy summary lacks trustworthy acceptance data, continue its lifecycle projection without creating a mapping. Once verified context becomes available, create the mapping from it. Informational event entries neither change lifecycle state nor determine acceptance time. +## Ordering and Time Defaults -The write order is source state, retained log, authoritative summary, acceptance mapping, then dependent publication. There is no cross-entity transaction. A mapping failure returns an error so the existing delivery or reconciliation trigger repairs it; Ingest failures rely on caller retry. Lifecycle changes do not rewrite mapping content. All conditional summary writes preserve caller-owned values, compute versions outside storage, and assign versions only after successful persistence. +- `REQUEST_ID_DESC`: descending numeric per-queue request sequence. Includes all retained summaries, even those with unknown acceptance time. No time cutoff; supplied time bounds are invalid. +- `ACCEPTED_AT_DESC`: descending `(accepted_at_ms, request_id)`, with bytewise request-ID ties. Includes only known acceptance times. Request-ID order cannot substitute for this: IDs are allocated before acceptance is recorded, so timestamp order can differ. -## Pagination and Errors +All timestamps are Unix milliseconds. Time selection is `lower <= accepted_at_ms < upper`. Omitted lower defaults to `0`; omitted upper defaults to server `now`, sampled once on the first page and retained in the token. Require `0 <= lower < upper`; explicit future bounds are allowed. There is no mandatory window, implicit 24-hour cutoff, or maximum window width. -The cursor is exclusive: request-ID mode continues below the last returned numeric ID, and acceptance-time mode below the last returned time/ID tuple. Return at most `page_size` rows and issue a token only when a further row was observed. An exhausted query returns an empty page and empty token. +Returned state is current, not state as of the upper bound. Pagination is not a snapshot: concurrent materialization may affect membership and state. -Tokens contain a format version, queue, order, cursor, and time-mode bounds. Reject malformed or unsupported tokens, invalid IDs, a query mismatch, and time cursors outside the token's interval. A cursor row need not still exist. Tokens confer no authorization. +## Request Summary -Identity order and verified acceptance tuples are immutable, preventing duplicates during forward traversal. Paging is not a snapshot: delayed summary or mapping creation can insert a row into a portion already passed, later pages may show newer state, and future pruning may remove rows. Refresh starts from an empty token. An empty continuation means no further row was observed in that read. +| Field | Type | Meaning | +| --- | --- | --- | +| `request_id` | string | Opaque request ID. | +| `queue` | string | Owning queue. | +| `change_uri` | string | Exact ingested URI. | +| `base_uri` | string | Selected baseline; empty before selection or for a full build. | +| `request_state` | string | Current public lifecycle state, including superseded requests. | +| `state_updated_at_ms` | int64 | Timestamp of the represented state entry. | +| `accepted_at_ms` | optional int64 | Immutable timestamp of the original retained accepted entry. | +| `outcome_reason` | string | Reason for the represented state; empty when unavailable or inapplicable. | -| Condition | RPC result | -| --- | --- | -| Missing, invalid, or unconfigured queue; invalid order, bounds, page size, or token | Invalid argument. | -| Configured queue with no matching retained rows | Successful empty page. | -| Caller lacks access under the service's queue policy | Permission denied. | -| Classified retryable storage failure | Unavailable. | -| Cancellation or deadline | Corresponding canonical transport code. | -| Corrupt summary or dangling/inconsistent mapping | Internal error; fail the page rather than silently omit rows. | +States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. -List performs no source-control query, history replay, initialization, repair, or publication during reads. An absent legacy acceptance timestamp is valid, not corrupt content. +## Data and Storage Work Required -## Rollout and Acceptance Criteria +The first six fields already exist in [RequestSummary](../../../stovepipe/entity/request_summary.go). Acceptance time and outcome reason already exist in retained logs but must be added to the summary. Acceptance time is acceptance-log time, not first RPC receipt time. No new producer signal or per-queue counter is needed. -Add acceptance time with explicit migration presence, such as a nullable SQL column and corresponding domain presence value. Add outcome reason with a compatible empty default. Existing summaries remain usable with an absent timestamp; only a retained accepted record can initialize it. Automatic historical backfill and reconstruction of Requests never summarized are outside v1. +Two bounded access paths are needed: -Deploy the schema, numeric-order key migration, and compatible materializers before exposing List. Enable the mapping handoff only once all writers can preserve initialized context and ensure mappings. Complete time-mode coverage starts with admissions after that writer cutover; older requests may appear when their context and mapping are repaired. Request-ID coverage is all retained summaries. A rollback to incompatible writers must disable the affected time-mode guarantee. +- Request-ID listing reads summaries directly. The current string key sorts lexically, not numerically, so it needs an order-preserving primary-key representation and compatible migration. +- Time listing uses an immutable mapping keyed by `(queue, accepted_at_ms, request_id)`, then point-reads the corresponding summaries. This adds one small record per request and bounded extra reads, not another mutable status projection. -V1 has no automatic pruning or fixed retention duration. Future pruning must coordinate summaries, mappings, retained history, URI mappings, and retry triggers so a dangling mapping does not fail reads or repair recreate an expired request. Neither mode promises a snapshot export, complete operational-request reconstruction, or lifetime retention. +The mapping follows the repository's [storage contract](../../../submitqueue/extension/storage/README.md#key-value-contract): a needed alternate lookup is an explicit primary-key mapping, not a SQL secondary-index requirement. Maintain it idempotently after summary persistence and before dependent publication, using existing retries rather than cross-entity transactions. -Implementation and review must verify: +## Coverage and Scope -- Summary fields preserve the original accepted timestamp across retries and later states; conditional initialization uses the current winning reason and tolerates missing legacy history. -- Request-ID storage preserves numeric order across digit boundaries and counter gaps, retains string wire IDs, and preserves point lookup across the key migration. -- Acceptance mappings are immutable, use binary ID ties, and are repaired after partial writes even when an incoming state loses. -- Both query modes enforce page limits, token binding, queue isolation, and empty-page semantics; omitted time bounds remain fixed across continuations. -- Request-ID mode includes legacy summaries with absent timestamps; time mode excludes them and fails on a mapped summary that is missing or inconsistent. -- Source, log, summary, mapping, and publication failures retain the existing repair path, without requiring transactions or mutable-state duplication. -- New protobufs, domain values, controller, mapper, store implementations, mocks, and wiring preserve existing status/history contracts and tolerate future lifecycle values. +Legacy summaries without a verified accepted log retain an absent acceptance time: request-ID mode includes them; time mode excludes them. Complete time-mode coverage begins after compatible writers are enabled; older requests need context and mapping repair. Automatic historical backfill is not part of this proposal. -State or verdict filtering, recently-updated ordering, lifecycle-overlap queries, real scheduler position, totals, exact snapshots, automated backfill, and pruning remain separate extensions. In particular, indexing mutable state-update time would need a different membership and pagination contract; it is not part of this acceptance index. +V1 has no fixed retention duration or automatic pruning. State/verdict filters, recently-updated order, totals, scheduler position, and snapshot exports are deferred. Validation details and histories remain separate APIs. diff --git a/doc/rfc/stovepipe/request-history-api.md b/doc/rfc/stovepipe/request-history-api.md index 0867e415f..ccdefd9a5 100644 --- a/doc/rfc/stovepipe/request-history-api.md +++ b/doc/rfc/stovepipe/request-history-api.md @@ -4,7 +4,7 @@ Stovepipe exposes retained request history through queue-scoped point lookups by request ID and exact URI. URI lookup returns every retained request history associated with that commit; the current insert-once mapping produces exactly one. Both selectors return complete ordered events, and URI lookup groups them by request ID. -The API reads the append-only model defined by [Stovepipe Request Log](request-log.md) directly. It does not replay history into current state or introduce a second persisted history projection. Current commit status remains a separate read concern, served from the materialized request summary and durable validation facts by [GetProjectStatusByURI](get-project-status-by-uri-api.md). +The API reads the append-only model defined by [Stovepipe Request Log](request-log.md) directly. It does not replay history into current state or introduce a second persisted history projection. Current commit status remains a separate read concern derived from operational entities rather than request history. ## API Coverage @@ -103,11 +103,11 @@ SubmitQueue's `PersistLog` operation performs two jobs after receiving a log mes Event rows remain in SubmitQueue history but never participate in current-status materialization. The materializer exists because the gateway owns public reads but cannot read the orchestrator's mutable Request store. -Stovepipe has no equivalent ownership gap. The same service owns the queue-scoped `Request`, `ValidationFact`, request summary, request-URI mapping, and request-log store. Operational reads use their owning entities, current-status reads use the materialized summary and validation facts, and request history reads retained log records directly. +Stovepipe has no equivalent ownership gap. The same service owns the queue-scoped `Request`, `ValidationFact`, request-URI mapping, and request-log store. Operational reads use their owning entities, while request history reads retained log records directly. -Stovepipe calls `requestlog.Materializer.PersistLog` directly, without an intermediate topic. The materializer retains occurrences idempotently and advances `RequestSummary` from state entries using their request versions. Informational events never compete for current state. The history controller still performs only an in-memory wire projection from stored log records to protobuf messages; it does not read summaries or infer missing history from current state. +Stovepipe calls `requestlog.Materializer.PersistLog` directly, without an intermediate topic. Its initial materializer appends only the request log: it does not add `RequestSummary`, replay history to determine current state, or materialize another history table. The controller performs only an in-memory wire projection from stored log records to protobuf messages. This avoids a second winner-selection algorithm competing with Request CAS state. -`PersistLog` receives the whole queue-scoped storage aggregate, allowing additional summary context behind the same write boundary without changing request-log producers. The proposed [List API](list-api.md) adds immutable acceptance time to the summary, serves request-ID-order pages directly from summaries, and serves time-order pages through an immutable acceptance mapping. It duplicates no mutable lifecycle state and requires no SQL secondary index. Acceptance time and these List read paths are not implemented; the summary used for current-status lookup is implemented. `Request` remains authoritative for operational lifecycle transitions. +`PersistLog` receives the whole queue-scoped storage aggregate so a future current-status or queue-list API can add SubmitQueue-style summary and index projections behind the same write boundary without changing request-log producers. Such projections remain deferred until a concrete read path needs them; `Request` remains authoritative in the initial implementation. ## Ordering and Consistency @@ -146,9 +146,9 @@ Contract and controller tests cover: ## Alternatives Considered -### Replay history during reads +### Materialize current status from history -Rejected because retained history is already the complete input for both history selectors. Current lifecycle summaries are materialized when state entries are retained, and validation facts own recorded verdicts; neither requires request-time replay by a history controller. +Rejected because `Request` and `ValidationFact` already own current operational state and verdicts. Replaying history would add another reconciliation path without enabling either selector. ### Query history directly by URI diff --git a/stovepipe/extension/storage/README.md b/stovepipe/extension/storage/README.md index 69aa6a1dc..8ced668dc 100644 --- a/stovepipe/extension/storage/README.md +++ b/stovepipe/extension/storage/README.md @@ -18,10 +18,4 @@ A `Get` immediately following a successful write (`Create`/`Update`) — by the ## Key-value contract -Same design space as [`submitqueue/extension/storage`](../../../submitqueue/extension/storage/README.md#key-value-contract): point operations use complete primary keys, and deliberate bounded prefix/range reads use leading primary-key components. Contracts do not require secondary-index lookups, joins, or arbitrary server-side filtering. `RequestURIStore` is the reverse-lookup example here (which request owns a given commit URI), kept as its own store rather than a secondary index on `RequestStore`. - -## Proposed summary listing - -The [List RFC](../../../doc/rfc/stovepipe/list-api.md) proposes acceptance time in the existing summary and two bounded read paths: descending numeric request-ID order directly over summaries, and acceptance-time order through an immutable mapping followed by summary point reads. These fields and query methods are not implemented. The current VARCHAR ID key does not provide numeric order; request-ID listing needs an order-preserving primary-key representation and a compatible key migration. - -Acceptance time is sourced from the retained version-1 accepted log and is immutable once known. The proposed mapping is keyed by `(queue, accepted_at_ms, request_id)`, created idempotently after summary persistence, and never rewritten for lifecycle changes. Both SQL and ordered key-value implementations can serve it by primary-key range scan. List's lifecycle read model remains the existing summary; there is no replicated queue summary, new per-queue counter, or exception to the prohibition on secondary-index-dependent queries. +Same design space as [`submitqueue/extension/storage`](../../../submitqueue/extension/storage/README.md#key-value-contract): every method must be satisfiable by a plain key-value backend as cheaply as by MySQL — get/put/conditional-update by primary key only, no query-by-attribute or server-side filtering. `RequestURIStore` is the reverse-lookup example here (which request owns a given commit URI), kept as its own store rather than a secondary index on `RequestStore`. From ba53d62e529b70e6f30aca1e0bfbbdc1a0831880 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:20:54 +0000 Subject: [PATCH 3/9] fix(api): align request summary with existing status wire fields --- api/stovepipe/proto/stovepipe.proto | 9 +- api/stovepipe/protopb/BUILD.bazel | 13 +- api/stovepipe/protopb/compatibility_test.go | 77 +++++++++++ api/stovepipe/protopb/stovepipe.pb.go | 16 +-- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 146 ++++++++++---------- doc/rfc/stovepipe/list-api.md | 2 + 6 files changed, 178 insertions(+), 85 deletions(-) create mode 100644 api/stovepipe/protopb/compatibility_test.go diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index afb3b41df..4e7c58cea 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -187,6 +187,9 @@ message ListRequest { // RequestSummary contains one request's current materialized lifecycle state. message RequestSummary { + // GetProjectStatusByURIResponse uses these numbers for validation data and combined update time. + reserved 6 to 10; + // Opaque identifier returned from Ingest. string request_id = 1; // Queue containing the request. @@ -198,13 +201,13 @@ message RequestSummary { // Stable public lifecycle state; clients tolerate future values. string request_state = 5; // Unix millisecond timestamp of the represented state entry. - int64 state_updated_at_ms = 6; + int64 state_updated_at_ms = 11; oneof acceptance_time { // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - int64 accepted_at_ms = 7; + int64 accepted_at_ms = 12; } // Stable reason for the represented state. Empty when unavailable or inapplicable. - string outcome_reason = 8; + string outcome_reason = 13; } // ListResponse contains a page in the requested order, not a snapshot across pages. diff --git a/api/stovepipe/protopb/BUILD.bazel b/api/stovepipe/protopb/BUILD.bazel index 68cbecda8..cdd4f72f6 100644 --- a/api/stovepipe/protopb/BUILD.bazel +++ b/api/stovepipe/protopb/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_go//go:def.bzl", "go_library") +load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -24,3 +24,14 @@ go_library( "@org_uber_go_yarpc//encoding/protobuf/v2:go_default_library", ], ) + +go_test( + name = "go_default_test", + srcs = ["compatibility_test.go"], + embed = [":go_default_library"], + deps = [ + "@com_github_stretchr_testify//require:go_default_library", + "@org_golang_google_protobuf//encoding/protojson:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) diff --git a/api/stovepipe/protopb/compatibility_test.go b/api/stovepipe/protopb/compatibility_test.go new file mode 100644 index 000000000..4f159ad22 --- /dev/null +++ b/api/stovepipe/protopb/compatibility_test.go @@ -0,0 +1,77 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package protopb + +import ( + "testing" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" +) + +func TestRequestSummaryCompatibilityWithProjectStatus(t *testing.T) { + sharedSummary := &RequestSummary{ + RequestId: "request/queue/42", Queue: "queue", ChangeUri: "uri", BaseUri: "base", RequestState: "failed", + } + sharedStatus := &GetProjectStatusByURIResponse{ + RequestId: "request/queue/42", Queue: "queue", ChangeUri: "uri", BaseUri: "base", RequestState: "failed", + } + summary := proto.Clone(sharedSummary).(*RequestSummary) + summary.StateUpdatedAtMs = 100 + summary.AcceptanceTime = &RequestSummary_AcceptedAtMs{AcceptedAtMs: 50} + summary.OutcomeReason = "build_failed" + zeroAcceptanceSummary := proto.Clone(summary).(*RequestSummary) + zeroAcceptanceSummary.AcceptanceTime = &RequestSummary_AcceptedAtMs{AcceptedAtMs: 0} + status := proto.Clone(sharedStatus).(*GetProjectStatusByURIResponse) + status.UpdatedAtMs = 200 + status.RepositoryResult = &GetProjectStatusByURIResponse_RepositoryBreakageDegree{RepositoryBreakageDegree: 0} + status.ProjectResultsComplete = true + status.Projects = []*ProjectValidation{{Project: "project", Result: &ProjectValidation_BreakageDegree{BreakageDegree: 1}}} + status.NextPageToken = "next" + + codecs := []struct { + name string + marshal func(proto.Message) ([]byte, error) + unmarshal func([]byte, proto.Message) error + }{ + {"protobuf", proto.Marshal, proto.UnmarshalOptions{DiscardUnknown: true}.Unmarshal}, + {"unknown_tolerant_json", protojson.Marshal, protojson.UnmarshalOptions{DiscardUnknown: true}.Unmarshal}, + } + tests := []struct { + name string + source proto.Message + destination func() proto.Message + want proto.Message + }{ + {"summary_to_legacy_status", summary, func() proto.Message { return &GetProjectStatusByURIResponse{} }, sharedStatus}, + {"legacy_status_to_summary", status, func() proto.Message { return &RequestSummary{} }, sharedSummary}, + {"summary_round_trip", summary, func() proto.Message { return &RequestSummary{} }, summary}, + {"explicit_zero_acceptance_round_trip", zeroAcceptanceSummary, func() proto.Message { return &RequestSummary{} }, zeroAcceptanceSummary}, + } + for _, codec := range codecs { + t.Run(codec.name, func(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + encoded, err := codec.marshal(tt.source) + require.NoError(t, err) + decoded := tt.destination() + require.NoError(t, codec.unmarshal(encoded, decoded)) + require.True(t, proto.Equal(tt.want, decoded), "decoded: %v", decoded) + }) + } + }) + } +} diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 4d69182db..395f7f8a5 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1130,13 +1130,13 @@ type RequestSummary struct { // Stable public lifecycle state; clients tolerate future values. RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` // Unix millisecond timestamp of the represented state entry. - StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` + StateUpdatedAtMs int64 `protobuf:"varint,11,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` // Types that are valid to be assigned to AcceptanceTime: // // *RequestSummary_AcceptedAtMs AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` // Stable reason for the represented state. Empty when unavailable or inapplicable. - OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + OutcomeReason string `protobuf:"bytes,13,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1242,7 +1242,7 @@ type isRequestSummary_AcceptanceTime interface { type RequestSummary_AcceptedAtMs struct { // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` + AcceptedAtMs int64 `protobuf:"varint,12,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` } func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} @@ -1439,7 +1439,7 @@ const file_stovepipe_proto_rawDesc = "" + "\n" + "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound\"\xb5\x02\n" + + "\x14accepted_upper_bound\"\xbb\x02\n" + "\x0eRequestSummary\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12\x14\n" + @@ -1448,10 +1448,10 @@ const file_stovepipe_proto_rawDesc = "" + "change_uri\x18\x03 \x01(\tR\tchangeUri\x12\x19\n" + "\bbase_uri\x18\x04 \x01(\tR\abaseUri\x12#\n" + "\rrequest_state\x18\x05 \x01(\tR\frequestState\x12-\n" + - "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + - "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + - "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + - "\x0facceptance_time\"\x96\x02\n" + + "\x13state_updated_at_ms\x18\v \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + + "\x0eaccepted_at_ms\x18\f \x01(\x03H\x00R\facceptedAtMs\x12%\n" + + "\x0eoutcome_reason\x18\r \x01(\tR\routcomeReasonB\x11\n" + + "\x0facceptance_timeJ\x04\b\x06\x10\v\"\x96\x02\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x126\n" + diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index 5c80a74ae..e8439e647 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -476,79 +476,79 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xda, 0xb5, 0x63, 0xbf, 0x38, 0x4e, 0x3a, 0x29, 0xc1, 0x35, 0x4d, 0x15, 0x16, 0xa5, - 0x75, 0x23, 0xd5, 0x11, 0x41, 0xaa, 0x0a, 0x48, 0x88, 0x38, 0x31, 0xb5, 0x25, 0x42, 0xcd, 0x3a, - 0xe1, 0x00, 0x87, 0xd5, 0x7a, 0xf7, 0xd5, 0xd9, 0x36, 0xfb, 0x91, 0x9d, 0xd9, 0x40, 0x7b, 0xe7, - 0x8a, 0xc4, 0x85, 0x7f, 0x82, 0x2b, 0xdc, 0xf9, 0x37, 0xb8, 0xf0, 0xb7, 0xa0, 0xf9, 0xd8, 0xf5, - 0x47, 0xed, 0x75, 0x93, 0x03, 0xdc, 0x76, 0xde, 0xd7, 0xcc, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0x0b, - 0xeb, 0x94, 0x05, 0x57, 0x18, 0xba, 0x21, 0xb6, 0xc2, 0x28, 0x60, 0x01, 0x69, 0xc4, 0x43, 0x8c, - 0x5a, 0x34, 0x1e, 0x7a, 0x2e, 0xbb, 0x8c, 0x31, 0xc6, 0x56, 0x6a, 0xa1, 0x3f, 0x84, 0xd5, 0xbe, - 0xeb, 0x8f, 0x0c, 0xbc, 0x8c, 0x91, 0x32, 0x52, 0x87, 0x15, 0x0f, 0x29, 0xb5, 0x46, 0x58, 0xd7, - 0x76, 0xb4, 0x66, 0xc5, 0x48, 0x96, 0xfa, 0xcf, 0x1a, 0x54, 0xa5, 0x25, 0x0d, 0x03, 0x9f, 0xe2, - 0x62, 0x53, 0xf2, 0x21, 0x54, 0x29, 0x46, 0x57, 0xae, 0x8d, 0xa6, 0x6f, 0x79, 0x58, 0xcf, 0x0b, - 0xf5, 0xaa, 0x92, 0x7d, 0x63, 0x79, 0x48, 0xee, 0x41, 0x85, 0xb9, 0x1e, 0x52, 0x66, 0x79, 0x61, - 0xbd, 0xb0, 0xa3, 0x35, 0x0b, 0xc6, 0x58, 0x40, 0x1a, 0x50, 0x3e, 0x0f, 0x28, 0x13, 0xce, 0xb7, - 0x84, 0x73, 0xba, 0xd6, 0x77, 0x61, 0xad, 0xe7, 0x8f, 0x90, 0xb2, 0xe4, 0xc8, 0x77, 0xa0, 0x28, - 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x0e, 0xd4, 0x12, 0x33, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, - 0x19, 0xe5, 0x5d, 0x47, 0x1f, 0xc0, 0xbd, 0x67, 0x98, 0x44, 0xe9, 0xba, 0x94, 0x05, 0xd1, 0xeb, - 0xf6, 0xeb, 0xde, 0x71, 0x66, 0x5c, 0xb2, 0x0d, 0x10, 0x49, 0x03, 0xd3, 0x75, 0xd4, 0xcd, 0x2a, - 0x4a, 0xd2, 0x73, 0xf4, 0x67, 0xb0, 0x3d, 0x27, 0xe8, 0x99, 0xd1, 0xcb, 0x8e, 0xba, 0x01, 0x85, - 0x38, 0x72, 0x55, 0x38, 0xfe, 0xa9, 0xff, 0xa5, 0x41, 0x55, 0xf9, 0x77, 0xae, 0xd0, 0x67, 0xe4, - 0x2e, 0x94, 0x91, 0x7f, 0x98, 0xe9, 0x25, 0x56, 0xc4, 0xba, 0xe7, 0x70, 0xbc, 0x53, 0xec, 0x4c, - 0x8f, 0x8a, 0x30, 0x05, 0x63, 0x35, 0x95, 0x9d, 0x50, 0xb2, 0x0b, 0x6b, 0xc9, 0xb1, 0x29, 0xb3, - 0x18, 0x0a, 0xcc, 0x2b, 0xdd, 0x9c, 0x51, 0x55, 0xe2, 0x01, 0x97, 0x92, 0x2d, 0x28, 0x8a, 0xa0, - 0x12, 0xf5, 0x6e, 0xce, 0x90, 0x4b, 0xb2, 0x0b, 0xb5, 0x20, 0x66, 0x76, 0xe0, 0xa1, 0x19, 0xa1, - 0x45, 0x03, 0xbf, 0x5e, 0x14, 0x47, 0x58, 0x53, 0x52, 0x43, 0x08, 0xdb, 0x55, 0x80, 0xc0, 0xb6, - 0xe3, 0x28, 0x42, 0xdf, 0x46, 0xfd, 0x12, 0x6a, 0xd3, 0x40, 0xcc, 0x80, 0xa7, 0xcd, 0x80, 0x47, - 0xbe, 0x84, 0x92, 0xd8, 0x8e, 0xdf, 0xa0, 0xd0, 0x5c, 0x3d, 0x68, 0xb6, 0x16, 0x13, 0xb7, 0x35, - 0x09, 0x8e, 0xa1, 0xfc, 0x74, 0x6b, 0x2e, 0xfc, 0x3c, 0xa7, 0x8a, 0x04, 0xe3, 0x2d, 0xb4, 0x1b, - 0x6e, 0xf1, 0x12, 0xee, 0x2f, 0xca, 0xb0, 0xda, 0xa3, 0x0b, 0x95, 0x73, 0x21, 0x77, 0x31, 0xd9, - 0x66, 0x2f, 0x6b, 0x9b, 0xe9, 0x58, 0xc6, 0xd8, 0x59, 0xff, 0x5d, 0x13, 0x1c, 0xed, 0x47, 0xc1, - 0x4b, 0xb4, 0x45, 0x8a, 0x62, 0xfa, 0x0e, 0x6c, 0xda, 0x06, 0xb0, 0xcf, 0x2d, 0x7f, 0x84, 0xe6, - 0x98, 0x54, 0x15, 0x29, 0x39, 0x8b, 0x5c, 0x5e, 0x5d, 0xa1, 0x8c, 0x48, 0xeb, 0x85, 0x9d, 0x02, - 0xaf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x8d, 0xd0, 0xa4, 0xee, 0x1b, 0x59, 0x7a, 0x45, - 0xa3, 0xcc, 0x05, 0x03, 0xf7, 0x8d, 0x88, 0x2b, 0x94, 0x2c, 0x78, 0x85, 0x09, 0x03, 0x84, 0xf9, - 0x29, 0x17, 0xe8, 0x43, 0xb8, 0xad, 0x4e, 0xfa, 0x9d, 0x75, 0xe1, 0x3a, 0x16, 0x73, 0x03, 0x9f, - 0x77, 0x09, 0x15, 0x3c, 0x61, 0xad, 0x5a, 0x92, 0x47, 0xb0, 0x3e, 0x8c, 0xd0, 0x7a, 0xc5, 0x23, - 0x3a, 0x38, 0x8a, 0x50, 0x36, 0x0a, 0xad, 0x9b, 0x33, 0x6a, 0x89, 0xe2, 0x58, 0xc8, 0xdb, 0x65, - 0x28, 0x45, 0x48, 0xe3, 0x0b, 0xa6, 0xff, 0x5d, 0x10, 0x19, 0x9e, 0x87, 0x88, 0x42, 0x7f, 0x09, - 0xc7, 0x52, 0xc4, 0xf2, 0x8b, 0x11, 0x2b, 0xcc, 0x22, 0x76, 0x17, 0xca, 0x43, 0x8b, 0x4a, 0xa5, - 0xec, 0x47, 0x2b, 0x7c, 0xcd, 0x55, 0x1f, 0xcd, 0x16, 0x96, 0x84, 0x65, 0xba, 0xac, 0x74, 0x58, - 0x8b, 0x43, 0xc7, 0x62, 0xe8, 0x98, 0x16, 0xe3, 0x15, 0x0a, 0xb2, 0x42, 0x95, 0xf0, 0x90, 0x9d, - 0x50, 0xf2, 0x05, 0x34, 0x22, 0x0c, 0x03, 0xea, 0x72, 0x12, 0x98, 0xb3, 0xc8, 0x94, 0x14, 0x32, - 0xf5, 0xb1, 0x4d, 0x7b, 0x0a, 0x23, 0xf2, 0x14, 0xea, 0x0a, 0x59, 0x53, 0x62, 0x45, 0x4d, 0x3b, - 0xf0, 0xc2, 0x0b, 0x64, 0x58, 0x5f, 0xd9, 0xd1, 0x9a, 0x65, 0x63, 0x4b, 0xe9, 0x0d, 0xa9, 0x3e, - 0x52, 0x5a, 0xd2, 0x9b, 0xe0, 0x43, 0x59, 0xd0, 0xf5, 0x71, 0x16, 0x5d, 0xdf, 0xca, 0xf1, 0x04, - 0x7d, 0x1e, 0xc0, 0xba, 0x8f, 0x3f, 0x31, 0x73, 0x82, 0x26, 0x15, 0xd9, 0x28, 0xb8, 0xb8, 0x9f, - 0x50, 0xa5, 0xbd, 0x09, 0xb7, 0x27, 0x2e, 0xab, 0x72, 0xfb, 0x47, 0x1e, 0x56, 0xbf, 0x76, 0x97, - 0x34, 0x76, 0xf2, 0x39, 0x14, 0x83, 0xc8, 0xc1, 0x48, 0x24, 0xb0, 0x76, 0xb0, 0x9b, 0x75, 0x54, - 0x1e, 0xed, 0x39, 0x37, 0x36, 0xa4, 0x0f, 0x79, 0x02, 0xef, 0x5b, 0xb6, 0x8d, 0xa1, 0xca, 0x44, - 0x10, 0x99, 0xd6, 0x0b, 0x86, 0x11, 0x4f, 0x89, 0x78, 0x84, 0xba, 0x39, 0x63, 0x33, 0x31, 0x38, - 0x64, 0xcf, 0xa3, 0x43, 0xae, 0x3d, 0xa1, 0xa4, 0x05, 0x24, 0xf5, 0x1b, 0xe2, 0x8b, 0x20, 0x42, - 0xee, 0x72, 0x4b, 0xb8, 0x68, 0xc6, 0x46, 0xa2, 0x6b, 0x0b, 0xd5, 0xc9, 0x4c, 0x19, 0x15, 0x33, - 0xcb, 0xa8, 0x34, 0x53, 0x46, 0xed, 0x2d, 0xb8, 0x93, 0xee, 0x75, 0x11, 0xfc, 0x88, 0x91, 0x39, - 0x0c, 0x62, 0xdf, 0x99, 0x92, 0xc7, 0x61, 0x98, 0xc8, 0xf5, 0x3f, 0xf3, 0x69, 0x9f, 0x1d, 0xc4, - 0x9e, 0x67, 0x2d, 0xef, 0xb3, 0xff, 0x4b, 0x0d, 0x3c, 0x86, 0x4d, 0xa1, 0x34, 0xa7, 0x2b, 0xa1, - 0x24, 0x2a, 0x61, 0x43, 0xa8, 0xce, 0x26, 0xca, 0xe1, 0x01, 0xd4, 0x26, 0x33, 0xe5, 0x51, 0x41, - 0x62, 0x9e, 0xa0, 0xea, 0x38, 0x41, 0xe2, 0x61, 0x9b, 0x7d, 0x99, 0xca, 0xf3, 0x5e, 0xa6, 0xdb, - 0xb0, 0x2e, 0xdd, 0x2c, 0xdf, 0x46, 0x93, 0xbf, 0x8c, 0xfa, 0x6f, 0x79, 0xa8, 0x4a, 0xba, 0xa9, - 0xce, 0xf1, 0x15, 0x94, 0xd5, 0x89, 0xaf, 0xd3, 0xb6, 0x15, 0xe6, 0x46, 0xea, 0x3b, 0xaf, 0x08, - 0xf2, 0x73, 0x8a, 0xe0, 0xbf, 0x22, 0xe3, 0x75, 0x09, 0xb5, 0xf7, 0x04, 0x2a, 0x69, 0xe1, 0x90, - 0x4d, 0x58, 0x37, 0x3a, 0xdf, 0x9e, 0x75, 0x06, 0xa7, 0x66, 0xef, 0xd8, 0x3c, 0xee, 0x0c, 0x8e, - 0x36, 0x72, 0xe4, 0x0e, 0x6c, 0x1c, 0x1e, 0x1d, 0x75, 0xfa, 0xa7, 0x9d, 0x63, 0xf3, 0xf0, 0x54, - 0x4a, 0xb5, 0x83, 0x7f, 0x8a, 0x50, 0x19, 0x24, 0xf0, 0x90, 0x1f, 0xe0, 0x16, 0x1f, 0x17, 0xc9, - 0xc3, 0xcc, 0x5e, 0x32, 0x1e, 0x3d, 0x1b, 0xcd, 0xe5, 0x86, 0x32, 0x51, 0x7a, 0x8e, 0x58, 0x50, - 0x92, 0xd3, 0x1d, 0x79, 0x94, 0xe5, 0x35, 0x35, 0x28, 0x36, 0xf6, 0xde, 0xc5, 0x34, 0xdd, 0xe2, - 0x17, 0x0d, 0xde, 0x9b, 0x3b, 0x4b, 0x90, 0xa7, 0x59, 0x71, 0xb2, 0x46, 0xca, 0xc6, 0xa7, 0x37, - 0xf0, 0x4c, 0x0f, 0xf4, 0xab, 0x06, 0x5b, 0xf3, 0x27, 0x0f, 0x72, 0xdd, 0xb8, 0xe3, 0x09, 0xa2, - 0xf1, 0xd9, 0x4d, 0x5c, 0x67, 0x41, 0x7a, 0xfb, 0x39, 0x5e, 0x0a, 0xd2, 0xc2, 0x99, 0x66, 0x29, - 0x48, 0x8b, 0xdf, 0x7e, 0x3d, 0xc7, 0x59, 0xc7, 0xb9, 0x9b, 0xcd, 0xba, 0x89, 0x47, 0x26, 0x9b, - 0x75, 0x93, 0xed, 0x41, 0xcf, 0xb5, 0x11, 0xee, 0xdb, 0x81, 0x97, 0xe1, 0xd0, 0xae, 0xa5, 0xfc, - 0xef, 0xf3, 0x3f, 0xaf, 0xbe, 0xf6, 0xfd, 0xc7, 0x23, 0x97, 0x9d, 0xc7, 0xc3, 0x96, 0x1d, 0x78, - 0xfb, 0xdc, 0x71, 0x7f, 0xc2, 0x71, 0xdf, 0x0a, 0xdd, 0xfd, 0xd4, 0x79, 0x5f, 0xfc, 0xac, 0x85, - 0xc3, 0x61, 0x49, 0x7c, 0x7c, 0xf2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x5a, 0x6e, 0x1c, - 0xc8, 0x0d, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4f, 0x73, 0xdb, 0x44, + 0x14, 0xb7, 0xec, 0xd8, 0xb1, 0x9f, 0x1d, 0xc7, 0xd9, 0x84, 0xe0, 0x9a, 0xa6, 0x13, 0xc4, 0xa4, + 0x75, 0x33, 0x53, 0x67, 0x08, 0x33, 0x9d, 0x02, 0x33, 0x0c, 0x71, 0x62, 0x6a, 0x33, 0x84, 0x1a, + 0x39, 0xe1, 0x00, 0x07, 0x8d, 0x2c, 0xbd, 0x3a, 0x6a, 0xa3, 0x3f, 0xd1, 0xae, 0x02, 0xed, 0x9d, + 0x2b, 0x33, 0x5c, 0xf8, 0x12, 0x5c, 0xb9, 0x71, 0xe1, 0x6b, 0x70, 0xe1, 0xb3, 0x30, 0xbb, 0x5a, + 0xc9, 0x7f, 0x6a, 0xcb, 0x4d, 0x0e, 0xf4, 0xa6, 0x7d, 0xff, 0x76, 0xf7, 0xf7, 0x7e, 0xef, 0xed, + 0x13, 0xac, 0x53, 0xe6, 0x5d, 0xa3, 0x6f, 0xfb, 0xd8, 0xf2, 0x03, 0x8f, 0x79, 0xa4, 0x11, 0x0e, + 0x31, 0x68, 0xd1, 0x70, 0xe8, 0xd8, 0xec, 0x2a, 0xc4, 0x10, 0x5b, 0x89, 0x85, 0xfa, 0x00, 0xca, + 0x7d, 0xdb, 0x1d, 0x69, 0x78, 0x15, 0x22, 0x65, 0xa4, 0x0e, 0xab, 0x0e, 0x52, 0x6a, 0x8c, 0xb0, + 0xae, 0xec, 0x2a, 0xcd, 0x92, 0x16, 0x2f, 0xd5, 0x5f, 0x14, 0xa8, 0x44, 0x96, 0xd4, 0xf7, 0x5c, + 0x8a, 0x8b, 0x4d, 0xc9, 0x87, 0x50, 0xa1, 0x18, 0x5c, 0xdb, 0x26, 0xea, 0xae, 0xe1, 0x60, 0x3d, + 0x2b, 0xd4, 0x65, 0x29, 0xfb, 0xd6, 0x70, 0x90, 0xdc, 0x85, 0x12, 0xb3, 0x1d, 0xa4, 0xcc, 0x70, + 0xfc, 0x7a, 0x6e, 0x57, 0x69, 0xe6, 0xb4, 0xb1, 0x80, 0x34, 0xa0, 0x78, 0xe1, 0x51, 0x26, 0x9c, + 0x57, 0x84, 0x73, 0xb2, 0x56, 0xf7, 0x60, 0xad, 0xe7, 0x8e, 0x90, 0xb2, 0xf8, 0xc8, 0x5b, 0x90, + 0x17, 0x97, 0x92, 0xa7, 0x88, 0x16, 0xea, 0x2e, 0x54, 0x63, 0x33, 0x79, 0xde, 0x2a, 0x64, 0x6d, + 0x4b, 0x1a, 0x65, 0x6d, 0x4b, 0x1d, 0xc0, 0xdd, 0xa7, 0x18, 0x47, 0xe9, 0xda, 0x94, 0x79, 0xc1, + 0xab, 0xf6, 0xab, 0xde, 0x49, 0x6a, 0x5c, 0xb2, 0x03, 0x10, 0x44, 0x06, 0xba, 0x6d, 0xc9, 0x9b, + 0x95, 0xa4, 0xa4, 0x67, 0xa9, 0x4f, 0x61, 0x67, 0x4e, 0xd0, 0x73, 0xad, 0x97, 0x1e, 0xb5, 0x06, + 0xb9, 0x30, 0xb0, 0x65, 0x38, 0xfe, 0xa9, 0xfe, 0xad, 0x40, 0x45, 0xfa, 0x77, 0xae, 0xd1, 0x65, + 0xe4, 0x0e, 0x14, 0x91, 0x7f, 0xe8, 0xc9, 0x25, 0x56, 0xc5, 0xba, 0x67, 0x71, 0xbc, 0x13, 0xec, + 0x74, 0x87, 0x8a, 0x30, 0x39, 0xad, 0x9c, 0xc8, 0x4e, 0x29, 0xd9, 0x83, 0xb5, 0xf8, 0xd8, 0x94, + 0x19, 0x0c, 0x05, 0xe6, 0xa5, 0x6e, 0x46, 0xab, 0x48, 0xf1, 0x80, 0x4b, 0xc9, 0x36, 0xe4, 0x45, + 0xd0, 0x08, 0xf5, 0x6e, 0x46, 0x8b, 0x96, 0x64, 0x0f, 0xaa, 0x5e, 0xc8, 0x4c, 0xcf, 0x41, 0x3d, + 0x40, 0x83, 0x7a, 0x6e, 0x3d, 0x2f, 0x8e, 0xb0, 0x26, 0xa5, 0x9a, 0x10, 0xb6, 0x2b, 0x00, 0x9e, + 0x69, 0x86, 0x41, 0x80, 0xae, 0x89, 0xea, 0x15, 0x54, 0xa7, 0x81, 0x98, 0x01, 0x4f, 0x99, 0x01, + 0x8f, 0x7c, 0x09, 0x05, 0xb1, 0x1d, 0xbf, 0x41, 0xae, 0x59, 0x3e, 0x6c, 0xb6, 0x16, 0x13, 0xb7, + 0x35, 0x09, 0x8e, 0x26, 0xfd, 0x54, 0x63, 0x2e, 0xfc, 0x3c, 0xa7, 0x92, 0x04, 0xe3, 0x2d, 0x94, + 0x5b, 0x6e, 0xf1, 0x02, 0xee, 0x2d, 0xca, 0xb0, 0xdc, 0xa3, 0x0b, 0xa5, 0x0b, 0x21, 0xb7, 0x31, + 0xde, 0x66, 0x3f, 0x6d, 0x9b, 0xe9, 0x58, 0xda, 0xd8, 0x59, 0xfd, 0x43, 0x11, 0x1c, 0xed, 0x07, + 0xde, 0x0b, 0x34, 0x45, 0x8a, 0x42, 0xfa, 0x16, 0x6c, 0xda, 0x01, 0x30, 0x2f, 0x0c, 0x77, 0x84, + 0xfa, 0x98, 0x54, 0xa5, 0x48, 0x72, 0x1e, 0xd8, 0xbc, 0xba, 0xfc, 0x28, 0x22, 0xad, 0xe7, 0x76, + 0x73, 0xbc, 0xba, 0xe2, 0x35, 0xf9, 0x00, 0x4a, 0xbe, 0x31, 0x42, 0x9d, 0xda, 0xaf, 0xa3, 0xd2, + 0xcb, 0x6b, 0x45, 0x2e, 0x18, 0xd8, 0xaf, 0x45, 0x5c, 0xa1, 0x64, 0xde, 0x4b, 0x8c, 0x19, 0x20, + 0xcc, 0xcf, 0xb8, 0x40, 0x1d, 0xc2, 0x86, 0x3c, 0xe9, 0xf7, 0xc6, 0xa5, 0x6d, 0x19, 0xcc, 0xf6, + 0x5c, 0xde, 0x25, 0x64, 0xf0, 0x98, 0xb5, 0x72, 0x49, 0x1e, 0xc2, 0xfa, 0x30, 0x40, 0xe3, 0x25, + 0x8f, 0x68, 0xe1, 0x28, 0xc0, 0xa8, 0x51, 0x28, 0xdd, 0x8c, 0x56, 0x8d, 0x15, 0x27, 0x42, 0xde, + 0x2e, 0x42, 0x21, 0x40, 0x1a, 0x5e, 0x32, 0xf5, 0x9f, 0x9c, 0xc8, 0xf0, 0x3c, 0x44, 0x24, 0xfa, + 0x4b, 0x38, 0x96, 0x20, 0x96, 0x5d, 0x8c, 0x58, 0x6e, 0x16, 0xb1, 0x3b, 0x50, 0x1c, 0x1a, 0x34, + 0x52, 0x46, 0xfd, 0x68, 0x95, 0xaf, 0xb9, 0xea, 0xa3, 0xd9, 0xc2, 0x8a, 0x60, 0x99, 0x2e, 0x2b, + 0x15, 0xd6, 0x42, 0xdf, 0x32, 0x18, 0x5a, 0xba, 0xc1, 0x78, 0x85, 0x42, 0x54, 0xa1, 0x52, 0x78, + 0xc4, 0x4e, 0x29, 0xf9, 0x02, 0x1a, 0x01, 0xfa, 0x1e, 0xb5, 0x39, 0x09, 0xf4, 0x59, 0x64, 0x0a, + 0x12, 0x99, 0xfa, 0xd8, 0xa6, 0x3d, 0x85, 0x11, 0x79, 0x02, 0x75, 0x89, 0xac, 0x1e, 0x61, 0x45, + 0x75, 0xd3, 0x73, 0xfc, 0x4b, 0x64, 0x58, 0x5f, 0xdd, 0x55, 0x9a, 0x45, 0x6d, 0x5b, 0xea, 0xb5, + 0x48, 0x7d, 0x2c, 0xb5, 0xa4, 0x37, 0xc1, 0x87, 0xa2, 0xa0, 0xeb, 0xa3, 0x34, 0xba, 0xbe, 0x91, + 0xe3, 0x09, 0xfa, 0xdc, 0x87, 0x75, 0x17, 0x7f, 0x66, 0xfa, 0x04, 0x4d, 0x4a, 0x51, 0xa3, 0xe0, + 0xe2, 0x7e, 0x4c, 0x95, 0xf6, 0x26, 0x6c, 0x4c, 0x5c, 0x56, 0xe6, 0xf6, 0xcf, 0x2c, 0x94, 0xbf, + 0xb1, 0x97, 0x34, 0x76, 0xf2, 0x39, 0xe4, 0xbd, 0xc0, 0xc2, 0x40, 0x24, 0xb0, 0x7a, 0xb8, 0x97, + 0x76, 0x54, 0x1e, 0xed, 0x19, 0x37, 0xd6, 0x22, 0x1f, 0xf2, 0x18, 0xde, 0x37, 0x4c, 0x13, 0x7d, + 0x99, 0x09, 0x2f, 0xd0, 0x8d, 0xe7, 0x0c, 0x03, 0x9e, 0x12, 0xf1, 0x08, 0x75, 0x33, 0xda, 0x66, + 0x6c, 0x70, 0xc4, 0x9e, 0x05, 0x47, 0x5c, 0x7b, 0x4a, 0x49, 0x0b, 0x48, 0xe2, 0x37, 0xc4, 0xe7, + 0x5e, 0x80, 0xdc, 0x65, 0x45, 0xb8, 0x28, 0x5a, 0x2d, 0xd6, 0xb5, 0x85, 0xea, 0x74, 0xa6, 0x8c, + 0xf2, 0xa9, 0x65, 0x54, 0x98, 0x29, 0xa3, 0xf6, 0x36, 0x6c, 0x25, 0x7b, 0x5d, 0x7a, 0x3f, 0x61, + 0xa0, 0x0f, 0xbd, 0xd0, 0xb5, 0xa6, 0xe4, 0xa1, 0xef, 0xc7, 0x72, 0xf5, 0xaf, 0x6c, 0xd2, 0x67, + 0x07, 0xa1, 0xe3, 0x18, 0xcb, 0xfb, 0xec, 0x3b, 0xa9, 0x81, 0x47, 0xb0, 0x29, 0x94, 0xfa, 0x74, + 0x25, 0x94, 0x45, 0x25, 0xd4, 0x84, 0xea, 0x7c, 0xa2, 0x1c, 0xee, 0x43, 0x75, 0x32, 0x53, 0x0e, + 0xad, 0x57, 0x64, 0x82, 0x2a, 0xe3, 0x04, 0x89, 0x87, 0x6d, 0xf6, 0x65, 0x5a, 0x9b, 0xf7, 0x32, + 0x6d, 0xc0, 0x7a, 0xe4, 0x66, 0xb8, 0x26, 0xea, 0xfc, 0x65, 0xfc, 0x7a, 0xa5, 0x58, 0xa8, 0x95, + 0xd5, 0xdf, 0xb3, 0x50, 0x89, 0x48, 0x27, 0xfb, 0xc7, 0x57, 0x50, 0x94, 0xe7, 0xbe, 0x49, 0xf3, + 0x96, 0xc8, 0x6b, 0x89, 0xef, 0xbc, 0x52, 0xc8, 0xce, 0x29, 0x85, 0xff, 0x8b, 0x92, 0x37, 0xa5, + 0xd5, 0xfe, 0x63, 0x28, 0x25, 0xe5, 0x43, 0x36, 0x61, 0x5d, 0xeb, 0x7c, 0x77, 0xde, 0x19, 0x9c, + 0xe9, 0xbd, 0x13, 0xfd, 0xa4, 0x33, 0x38, 0xae, 0x65, 0xc8, 0x16, 0xd4, 0x8e, 0x8e, 0x8f, 0x3b, + 0xfd, 0xb3, 0xce, 0x89, 0x7e, 0x74, 0x16, 0x49, 0x95, 0xc3, 0x7f, 0xf3, 0x50, 0x1a, 0xc4, 0xf0, + 0x90, 0x1f, 0x61, 0x85, 0x0f, 0x8d, 0xe4, 0x41, 0x6a, 0x47, 0x19, 0x0f, 0xa0, 0x8d, 0xe6, 0x72, + 0xc3, 0x28, 0x51, 0x6a, 0x86, 0x18, 0x50, 0x88, 0x66, 0x3c, 0xf2, 0x30, 0xcd, 0x6b, 0x6a, 0x5c, + 0x6c, 0xec, 0xbf, 0x8d, 0x69, 0xb2, 0xc5, 0xaf, 0x0a, 0xbc, 0x37, 0x77, 0xa2, 0x20, 0x4f, 0xd2, + 0xe2, 0xa4, 0x0d, 0x96, 0x8d, 0x4f, 0x6f, 0xe1, 0x99, 0x1c, 0xe8, 0x37, 0x05, 0xb6, 0xe7, 0xcf, + 0x1f, 0xe4, 0xa6, 0x71, 0xc7, 0x73, 0x44, 0xe3, 0xb3, 0xdb, 0xb8, 0xce, 0x82, 0xf4, 0xe6, 0xa3, + 0xbc, 0x14, 0xa4, 0x85, 0x93, 0xcd, 0x52, 0x90, 0x16, 0x4f, 0x00, 0x6a, 0x86, 0xb3, 0x8e, 0x73, + 0x37, 0x9d, 0x75, 0x13, 0x4f, 0x4d, 0x3a, 0xeb, 0x26, 0xdb, 0x83, 0x9a, 0x69, 0x23, 0xdc, 0x33, + 0x3d, 0x27, 0xc5, 0xa1, 0x5d, 0x4d, 0xf8, 0xdf, 0xe7, 0xff, 0x5f, 0x7d, 0xe5, 0x87, 0x8f, 0x47, + 0x36, 0xbb, 0x08, 0x87, 0x2d, 0xd3, 0x73, 0x0e, 0xb8, 0xe3, 0xc1, 0x84, 0xe3, 0x81, 0xe1, 0xdb, + 0x07, 0x89, 0xf3, 0x81, 0xf8, 0x65, 0xf3, 0x87, 0xc3, 0x82, 0xf8, 0xf8, 0xe4, 0xbf, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xf8, 0x83, 0xa4, 0x64, 0xce, 0x0d, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index d87e8ee90..a22f9d336 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -32,6 +32,8 @@ Returned state is current, not state as of the upper bound. Pagination is not a ## Request Summary +This is the wire representation of the existing domain `RequestSummary`, not another stored projection. Its first five fields match the names, types, and numbers in `GetProjectStatusByURIResponse`; numbers 6–10 are reserved to avoid colliding with status-only data. New summary fields use 11–13. The status RPC remains unchanged; refactoring it to share this message is deferred and must preserve its existing wire fields. Summary `state_updated_at_ms` is lifecycle-only, unlike status `updated_at_ms`, which also includes validation results. + | Field | Type | Meaning | | --- | --- | --- | | `request_id` | string | Opaque request ID. | From 43261ca02ed2d154281bf96b6db27b09c45bbae7 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:24:46 +0000 Subject: [PATCH 4/9] docs(stovepipe): clarify request states and remove compatibility test --- api/stovepipe/protopb/BUILD.bazel | 13 +--- api/stovepipe/protopb/compatibility_test.go | 77 --------------------- doc/rfc/stovepipe/list-api.md | 4 +- 3 files changed, 3 insertions(+), 91 deletions(-) delete mode 100644 api/stovepipe/protopb/compatibility_test.go diff --git a/api/stovepipe/protopb/BUILD.bazel b/api/stovepipe/protopb/BUILD.bazel index cdd4f72f6..68cbecda8 100644 --- a/api/stovepipe/protopb/BUILD.bazel +++ b/api/stovepipe/protopb/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_go//go:def.bzl", "go_library", "go_test") +load("@rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -24,14 +24,3 @@ go_library( "@org_uber_go_yarpc//encoding/protobuf/v2:go_default_library", ], ) - -go_test( - name = "go_default_test", - srcs = ["compatibility_test.go"], - embed = [":go_default_library"], - deps = [ - "@com_github_stretchr_testify//require:go_default_library", - "@org_golang_google_protobuf//encoding/protojson:go_default_library", - "@org_golang_google_protobuf//proto:go_default_library", - ], -) diff --git a/api/stovepipe/protopb/compatibility_test.go b/api/stovepipe/protopb/compatibility_test.go deleted file mode 100644 index 4f159ad22..000000000 --- a/api/stovepipe/protopb/compatibility_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2026 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package protopb - -import ( - "testing" - - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" -) - -func TestRequestSummaryCompatibilityWithProjectStatus(t *testing.T) { - sharedSummary := &RequestSummary{ - RequestId: "request/queue/42", Queue: "queue", ChangeUri: "uri", BaseUri: "base", RequestState: "failed", - } - sharedStatus := &GetProjectStatusByURIResponse{ - RequestId: "request/queue/42", Queue: "queue", ChangeUri: "uri", BaseUri: "base", RequestState: "failed", - } - summary := proto.Clone(sharedSummary).(*RequestSummary) - summary.StateUpdatedAtMs = 100 - summary.AcceptanceTime = &RequestSummary_AcceptedAtMs{AcceptedAtMs: 50} - summary.OutcomeReason = "build_failed" - zeroAcceptanceSummary := proto.Clone(summary).(*RequestSummary) - zeroAcceptanceSummary.AcceptanceTime = &RequestSummary_AcceptedAtMs{AcceptedAtMs: 0} - status := proto.Clone(sharedStatus).(*GetProjectStatusByURIResponse) - status.UpdatedAtMs = 200 - status.RepositoryResult = &GetProjectStatusByURIResponse_RepositoryBreakageDegree{RepositoryBreakageDegree: 0} - status.ProjectResultsComplete = true - status.Projects = []*ProjectValidation{{Project: "project", Result: &ProjectValidation_BreakageDegree{BreakageDegree: 1}}} - status.NextPageToken = "next" - - codecs := []struct { - name string - marshal func(proto.Message) ([]byte, error) - unmarshal func([]byte, proto.Message) error - }{ - {"protobuf", proto.Marshal, proto.UnmarshalOptions{DiscardUnknown: true}.Unmarshal}, - {"unknown_tolerant_json", protojson.Marshal, protojson.UnmarshalOptions{DiscardUnknown: true}.Unmarshal}, - } - tests := []struct { - name string - source proto.Message - destination func() proto.Message - want proto.Message - }{ - {"summary_to_legacy_status", summary, func() proto.Message { return &GetProjectStatusByURIResponse{} }, sharedStatus}, - {"legacy_status_to_summary", status, func() proto.Message { return &RequestSummary{} }, sharedSummary}, - {"summary_round_trip", summary, func() proto.Message { return &RequestSummary{} }, summary}, - {"explicit_zero_acceptance_round_trip", zeroAcceptanceSummary, func() proto.Message { return &RequestSummary{} }, zeroAcceptanceSummary}, - } - for _, codec := range codecs { - t.Run(codec.name, func(t *testing.T) { - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - encoded, err := codec.marshal(tt.source) - require.NoError(t, err) - decoded := tt.destination() - require.NoError(t, codec.unmarshal(encoded, decoded)) - require.True(t, proto.Equal(tt.want, decoded), "decoded: %v", decoded) - }) - } - }) - } -} diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index a22f9d336..1dd87210a 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -40,12 +40,12 @@ This is the wire representation of the existing domain `RequestSummary`, not ano | `queue` | string | Owning queue. | | `change_uri` | string | Exact ingested URI. | | `base_uri` | string | Selected baseline; empty before selection or for a full build. | -| `request_state` | string | Current public lifecycle state, including superseded requests. | +| `request_state` | string | Current lifecycle state: `accepted`, `processing`, `superseded`, `succeeded`, `failed`, or `cancelled`. | | `state_updated_at_ms` | int64 | Timestamp of the represented state entry. | | `accepted_at_ms` | optional int64 | Immutable timestamp of the original retained accepted entry. | | `outcome_reason` | string | Reason for the represented state; empty when unavailable or inapplicable. | -States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. +The domain already defines a typed [RequestState](../../../stovepipe/entity/request.go). The wire field remains a string to match existing status/history APIs; replacing it with a protobuf enum would not be wire-compatible. States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. ## Data and Storage Work Required From 51557edec7415da12776e751b57b960b4653f12e Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:26:28 +0000 Subject: [PATCH 5/9] refactor(api): give request summary independent field numbers --- api/stovepipe/proto/stovepipe.proto | 9 +- api/stovepipe/protopb/stovepipe.pb.go | 16 +-- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 146 ++++++++++---------- doc/rfc/stovepipe/list-api.md | 4 +- 4 files changed, 86 insertions(+), 89 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 4e7c58cea..afb3b41df 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -187,9 +187,6 @@ message ListRequest { // RequestSummary contains one request's current materialized lifecycle state. message RequestSummary { - // GetProjectStatusByURIResponse uses these numbers for validation data and combined update time. - reserved 6 to 10; - // Opaque identifier returned from Ingest. string request_id = 1; // Queue containing the request. @@ -201,13 +198,13 @@ message RequestSummary { // Stable public lifecycle state; clients tolerate future values. string request_state = 5; // Unix millisecond timestamp of the represented state entry. - int64 state_updated_at_ms = 11; + int64 state_updated_at_ms = 6; oneof acceptance_time { // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - int64 accepted_at_ms = 12; + int64 accepted_at_ms = 7; } // Stable reason for the represented state. Empty when unavailable or inapplicable. - string outcome_reason = 13; + string outcome_reason = 8; } // ListResponse contains a page in the requested order, not a snapshot across pages. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 395f7f8a5..4d69182db 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1130,13 +1130,13 @@ type RequestSummary struct { // Stable public lifecycle state; clients tolerate future values. RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` // Unix millisecond timestamp of the represented state entry. - StateUpdatedAtMs int64 `protobuf:"varint,11,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` + StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` // Types that are valid to be assigned to AcceptanceTime: // // *RequestSummary_AcceptedAtMs AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` // Stable reason for the represented state. Empty when unavailable or inapplicable. - OutcomeReason string `protobuf:"bytes,13,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1242,7 +1242,7 @@ type isRequestSummary_AcceptanceTime interface { type RequestSummary_AcceptedAtMs struct { // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - AcceptedAtMs int64 `protobuf:"varint,12,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` + AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` } func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} @@ -1439,7 +1439,7 @@ const file_stovepipe_proto_rawDesc = "" + "\n" + "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound\"\xbb\x02\n" + + "\x14accepted_upper_bound\"\xb5\x02\n" + "\x0eRequestSummary\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12\x14\n" + @@ -1448,10 +1448,10 @@ const file_stovepipe_proto_rawDesc = "" + "change_uri\x18\x03 \x01(\tR\tchangeUri\x12\x19\n" + "\bbase_uri\x18\x04 \x01(\tR\abaseUri\x12#\n" + "\rrequest_state\x18\x05 \x01(\tR\frequestState\x12-\n" + - "\x13state_updated_at_ms\x18\v \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + - "\x0eaccepted_at_ms\x18\f \x01(\x03H\x00R\facceptedAtMs\x12%\n" + - "\x0eoutcome_reason\x18\r \x01(\tR\routcomeReasonB\x11\n" + - "\x0facceptance_timeJ\x04\b\x06\x10\v\"\x96\x02\n" + + "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + + "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + + "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + + "\x0facceptance_time\"\x96\x02\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x126\n" + diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index e8439e647..5c80a74ae 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -476,79 +476,79 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4f, 0x73, 0xdb, 0x44, - 0x14, 0xb7, 0xec, 0xd8, 0xb1, 0x9f, 0x1d, 0xc7, 0xd9, 0x84, 0xe0, 0x9a, 0xa6, 0x13, 0xc4, 0xa4, - 0x75, 0x33, 0x53, 0x67, 0x08, 0x33, 0x9d, 0x02, 0x33, 0x0c, 0x71, 0x62, 0x6a, 0x33, 0x84, 0x1a, - 0x39, 0xe1, 0x00, 0x07, 0x8d, 0x2c, 0xbd, 0x3a, 0x6a, 0xa3, 0x3f, 0xd1, 0xae, 0x02, 0xed, 0x9d, - 0x2b, 0x33, 0x5c, 0xf8, 0x12, 0x5c, 0xb9, 0x71, 0xe1, 0x6b, 0x70, 0xe1, 0xb3, 0x30, 0xbb, 0x5a, - 0xc9, 0x7f, 0x6a, 0xcb, 0x4d, 0x0e, 0xf4, 0xa6, 0x7d, 0xff, 0x76, 0xf7, 0xf7, 0x7e, 0xef, 0xed, - 0x13, 0xac, 0x53, 0xe6, 0x5d, 0xa3, 0x6f, 0xfb, 0xd8, 0xf2, 0x03, 0x8f, 0x79, 0xa4, 0x11, 0x0e, - 0x31, 0x68, 0xd1, 0x70, 0xe8, 0xd8, 0xec, 0x2a, 0xc4, 0x10, 0x5b, 0x89, 0x85, 0xfa, 0x00, 0xca, - 0x7d, 0xdb, 0x1d, 0x69, 0x78, 0x15, 0x22, 0x65, 0xa4, 0x0e, 0xab, 0x0e, 0x52, 0x6a, 0x8c, 0xb0, - 0xae, 0xec, 0x2a, 0xcd, 0x92, 0x16, 0x2f, 0xd5, 0x5f, 0x14, 0xa8, 0x44, 0x96, 0xd4, 0xf7, 0x5c, - 0x8a, 0x8b, 0x4d, 0xc9, 0x87, 0x50, 0xa1, 0x18, 0x5c, 0xdb, 0x26, 0xea, 0xae, 0xe1, 0x60, 0x3d, - 0x2b, 0xd4, 0x65, 0x29, 0xfb, 0xd6, 0x70, 0x90, 0xdc, 0x85, 0x12, 0xb3, 0x1d, 0xa4, 0xcc, 0x70, - 0xfc, 0x7a, 0x6e, 0x57, 0x69, 0xe6, 0xb4, 0xb1, 0x80, 0x34, 0xa0, 0x78, 0xe1, 0x51, 0x26, 0x9c, - 0x57, 0x84, 0x73, 0xb2, 0x56, 0xf7, 0x60, 0xad, 0xe7, 0x8e, 0x90, 0xb2, 0xf8, 0xc8, 0x5b, 0x90, - 0x17, 0x97, 0x92, 0xa7, 0x88, 0x16, 0xea, 0x2e, 0x54, 0x63, 0x33, 0x79, 0xde, 0x2a, 0x64, 0x6d, - 0x4b, 0x1a, 0x65, 0x6d, 0x4b, 0x1d, 0xc0, 0xdd, 0xa7, 0x18, 0x47, 0xe9, 0xda, 0x94, 0x79, 0xc1, - 0xab, 0xf6, 0xab, 0xde, 0x49, 0x6a, 0x5c, 0xb2, 0x03, 0x10, 0x44, 0x06, 0xba, 0x6d, 0xc9, 0x9b, - 0x95, 0xa4, 0xa4, 0x67, 0xa9, 0x4f, 0x61, 0x67, 0x4e, 0xd0, 0x73, 0xad, 0x97, 0x1e, 0xb5, 0x06, - 0xb9, 0x30, 0xb0, 0x65, 0x38, 0xfe, 0xa9, 0xfe, 0xad, 0x40, 0x45, 0xfa, 0x77, 0xae, 0xd1, 0x65, - 0xe4, 0x0e, 0x14, 0x91, 0x7f, 0xe8, 0xc9, 0x25, 0x56, 0xc5, 0xba, 0x67, 0x71, 0xbc, 0x13, 0xec, - 0x74, 0x87, 0x8a, 0x30, 0x39, 0xad, 0x9c, 0xc8, 0x4e, 0x29, 0xd9, 0x83, 0xb5, 0xf8, 0xd8, 0x94, - 0x19, 0x0c, 0x05, 0xe6, 0xa5, 0x6e, 0x46, 0xab, 0x48, 0xf1, 0x80, 0x4b, 0xc9, 0x36, 0xe4, 0x45, - 0xd0, 0x08, 0xf5, 0x6e, 0x46, 0x8b, 0x96, 0x64, 0x0f, 0xaa, 0x5e, 0xc8, 0x4c, 0xcf, 0x41, 0x3d, - 0x40, 0x83, 0x7a, 0x6e, 0x3d, 0x2f, 0x8e, 0xb0, 0x26, 0xa5, 0x9a, 0x10, 0xb6, 0x2b, 0x00, 0x9e, - 0x69, 0x86, 0x41, 0x80, 0xae, 0x89, 0xea, 0x15, 0x54, 0xa7, 0x81, 0x98, 0x01, 0x4f, 0x99, 0x01, - 0x8f, 0x7c, 0x09, 0x05, 0xb1, 0x1d, 0xbf, 0x41, 0xae, 0x59, 0x3e, 0x6c, 0xb6, 0x16, 0x13, 0xb7, - 0x35, 0x09, 0x8e, 0x26, 0xfd, 0x54, 0x63, 0x2e, 0xfc, 0x3c, 0xa7, 0x92, 0x04, 0xe3, 0x2d, 0x94, - 0x5b, 0x6e, 0xf1, 0x02, 0xee, 0x2d, 0xca, 0xb0, 0xdc, 0xa3, 0x0b, 0xa5, 0x0b, 0x21, 0xb7, 0x31, - 0xde, 0x66, 0x3f, 0x6d, 0x9b, 0xe9, 0x58, 0xda, 0xd8, 0x59, 0xfd, 0x43, 0x11, 0x1c, 0xed, 0x07, - 0xde, 0x0b, 0x34, 0x45, 0x8a, 0x42, 0xfa, 0x16, 0x6c, 0xda, 0x01, 0x30, 0x2f, 0x0c, 0x77, 0x84, - 0xfa, 0x98, 0x54, 0xa5, 0x48, 0x72, 0x1e, 0xd8, 0xbc, 0xba, 0xfc, 0x28, 0x22, 0xad, 0xe7, 0x76, - 0x73, 0xbc, 0xba, 0xe2, 0x35, 0xf9, 0x00, 0x4a, 0xbe, 0x31, 0x42, 0x9d, 0xda, 0xaf, 0xa3, 0xd2, - 0xcb, 0x6b, 0x45, 0x2e, 0x18, 0xd8, 0xaf, 0x45, 0x5c, 0xa1, 0x64, 0xde, 0x4b, 0x8c, 0x19, 0x20, - 0xcc, 0xcf, 0xb8, 0x40, 0x1d, 0xc2, 0x86, 0x3c, 0xe9, 0xf7, 0xc6, 0xa5, 0x6d, 0x19, 0xcc, 0xf6, - 0x5c, 0xde, 0x25, 0x64, 0xf0, 0x98, 0xb5, 0x72, 0x49, 0x1e, 0xc2, 0xfa, 0x30, 0x40, 0xe3, 0x25, - 0x8f, 0x68, 0xe1, 0x28, 0xc0, 0xa8, 0x51, 0x28, 0xdd, 0x8c, 0x56, 0x8d, 0x15, 0x27, 0x42, 0xde, - 0x2e, 0x42, 0x21, 0x40, 0x1a, 0x5e, 0x32, 0xf5, 0x9f, 0x9c, 0xc8, 0xf0, 0x3c, 0x44, 0x24, 0xfa, - 0x4b, 0x38, 0x96, 0x20, 0x96, 0x5d, 0x8c, 0x58, 0x6e, 0x16, 0xb1, 0x3b, 0x50, 0x1c, 0x1a, 0x34, - 0x52, 0x46, 0xfd, 0x68, 0x95, 0xaf, 0xb9, 0xea, 0xa3, 0xd9, 0xc2, 0x8a, 0x60, 0x99, 0x2e, 0x2b, - 0x15, 0xd6, 0x42, 0xdf, 0x32, 0x18, 0x5a, 0xba, 0xc1, 0x78, 0x85, 0x42, 0x54, 0xa1, 0x52, 0x78, - 0xc4, 0x4e, 0x29, 0xf9, 0x02, 0x1a, 0x01, 0xfa, 0x1e, 0xb5, 0x39, 0x09, 0xf4, 0x59, 0x64, 0x0a, - 0x12, 0x99, 0xfa, 0xd8, 0xa6, 0x3d, 0x85, 0x11, 0x79, 0x02, 0x75, 0x89, 0xac, 0x1e, 0x61, 0x45, - 0x75, 0xd3, 0x73, 0xfc, 0x4b, 0x64, 0x58, 0x5f, 0xdd, 0x55, 0x9a, 0x45, 0x6d, 0x5b, 0xea, 0xb5, - 0x48, 0x7d, 0x2c, 0xb5, 0xa4, 0x37, 0xc1, 0x87, 0xa2, 0xa0, 0xeb, 0xa3, 0x34, 0xba, 0xbe, 0x91, - 0xe3, 0x09, 0xfa, 0xdc, 0x87, 0x75, 0x17, 0x7f, 0x66, 0xfa, 0x04, 0x4d, 0x4a, 0x51, 0xa3, 0xe0, - 0xe2, 0x7e, 0x4c, 0x95, 0xf6, 0x26, 0x6c, 0x4c, 0x5c, 0x56, 0xe6, 0xf6, 0xcf, 0x2c, 0x94, 0xbf, - 0xb1, 0x97, 0x34, 0x76, 0xf2, 0x39, 0xe4, 0xbd, 0xc0, 0xc2, 0x40, 0x24, 0xb0, 0x7a, 0xb8, 0x97, - 0x76, 0x54, 0x1e, 0xed, 0x19, 0x37, 0xd6, 0x22, 0x1f, 0xf2, 0x18, 0xde, 0x37, 0x4c, 0x13, 0x7d, - 0x99, 0x09, 0x2f, 0xd0, 0x8d, 0xe7, 0x0c, 0x03, 0x9e, 0x12, 0xf1, 0x08, 0x75, 0x33, 0xda, 0x66, - 0x6c, 0x70, 0xc4, 0x9e, 0x05, 0x47, 0x5c, 0x7b, 0x4a, 0x49, 0x0b, 0x48, 0xe2, 0x37, 0xc4, 0xe7, - 0x5e, 0x80, 0xdc, 0x65, 0x45, 0xb8, 0x28, 0x5a, 0x2d, 0xd6, 0xb5, 0x85, 0xea, 0x74, 0xa6, 0x8c, - 0xf2, 0xa9, 0x65, 0x54, 0x98, 0x29, 0xa3, 0xf6, 0x36, 0x6c, 0x25, 0x7b, 0x5d, 0x7a, 0x3f, 0x61, - 0xa0, 0x0f, 0xbd, 0xd0, 0xb5, 0xa6, 0xe4, 0xa1, 0xef, 0xc7, 0x72, 0xf5, 0xaf, 0x6c, 0xd2, 0x67, - 0x07, 0xa1, 0xe3, 0x18, 0xcb, 0xfb, 0xec, 0x3b, 0xa9, 0x81, 0x47, 0xb0, 0x29, 0x94, 0xfa, 0x74, - 0x25, 0x94, 0x45, 0x25, 0xd4, 0x84, 0xea, 0x7c, 0xa2, 0x1c, 0xee, 0x43, 0x75, 0x32, 0x53, 0x0e, - 0xad, 0x57, 0x64, 0x82, 0x2a, 0xe3, 0x04, 0x89, 0x87, 0x6d, 0xf6, 0x65, 0x5a, 0x9b, 0xf7, 0x32, - 0x6d, 0xc0, 0x7a, 0xe4, 0x66, 0xb8, 0x26, 0xea, 0xfc, 0x65, 0xfc, 0x7a, 0xa5, 0x58, 0xa8, 0x95, - 0xd5, 0xdf, 0xb3, 0x50, 0x89, 0x48, 0x27, 0xfb, 0xc7, 0x57, 0x50, 0x94, 0xe7, 0xbe, 0x49, 0xf3, - 0x96, 0xc8, 0x6b, 0x89, 0xef, 0xbc, 0x52, 0xc8, 0xce, 0x29, 0x85, 0xff, 0x8b, 0x92, 0x37, 0xa5, - 0xd5, 0xfe, 0x63, 0x28, 0x25, 0xe5, 0x43, 0x36, 0x61, 0x5d, 0xeb, 0x7c, 0x77, 0xde, 0x19, 0x9c, - 0xe9, 0xbd, 0x13, 0xfd, 0xa4, 0x33, 0x38, 0xae, 0x65, 0xc8, 0x16, 0xd4, 0x8e, 0x8e, 0x8f, 0x3b, - 0xfd, 0xb3, 0xce, 0x89, 0x7e, 0x74, 0x16, 0x49, 0x95, 0xc3, 0x7f, 0xf3, 0x50, 0x1a, 0xc4, 0xf0, - 0x90, 0x1f, 0x61, 0x85, 0x0f, 0x8d, 0xe4, 0x41, 0x6a, 0x47, 0x19, 0x0f, 0xa0, 0x8d, 0xe6, 0x72, - 0xc3, 0x28, 0x51, 0x6a, 0x86, 0x18, 0x50, 0x88, 0x66, 0x3c, 0xf2, 0x30, 0xcd, 0x6b, 0x6a, 0x5c, - 0x6c, 0xec, 0xbf, 0x8d, 0x69, 0xb2, 0xc5, 0xaf, 0x0a, 0xbc, 0x37, 0x77, 0xa2, 0x20, 0x4f, 0xd2, - 0xe2, 0xa4, 0x0d, 0x96, 0x8d, 0x4f, 0x6f, 0xe1, 0x99, 0x1c, 0xe8, 0x37, 0x05, 0xb6, 0xe7, 0xcf, - 0x1f, 0xe4, 0xa6, 0x71, 0xc7, 0x73, 0x44, 0xe3, 0xb3, 0xdb, 0xb8, 0xce, 0x82, 0xf4, 0xe6, 0xa3, - 0xbc, 0x14, 0xa4, 0x85, 0x93, 0xcd, 0x52, 0x90, 0x16, 0x4f, 0x00, 0x6a, 0x86, 0xb3, 0x8e, 0x73, - 0x37, 0x9d, 0x75, 0x13, 0x4f, 0x4d, 0x3a, 0xeb, 0x26, 0xdb, 0x83, 0x9a, 0x69, 0x23, 0xdc, 0x33, - 0x3d, 0x27, 0xc5, 0xa1, 0x5d, 0x4d, 0xf8, 0xdf, 0xe7, 0xff, 0x5f, 0x7d, 0xe5, 0x87, 0x8f, 0x47, - 0x36, 0xbb, 0x08, 0x87, 0x2d, 0xd3, 0x73, 0x0e, 0xb8, 0xe3, 0xc1, 0x84, 0xe3, 0x81, 0xe1, 0xdb, - 0x07, 0x89, 0xf3, 0x81, 0xf8, 0x65, 0xf3, 0x87, 0xc3, 0x82, 0xf8, 0xf8, 0xe4, 0xbf, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xf8, 0x83, 0xa4, 0x64, 0xce, 0x0d, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcd, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0xda, 0xb5, 0x63, 0xbf, 0x38, 0x4e, 0x3a, 0x29, 0xc1, 0x35, 0x4d, 0x15, 0x16, 0xa5, + 0x75, 0x23, 0xd5, 0x11, 0x41, 0xaa, 0x0a, 0x48, 0x88, 0x38, 0x31, 0xb5, 0x25, 0x42, 0xcd, 0x3a, + 0xe1, 0x00, 0x87, 0xd5, 0x7a, 0xf7, 0xd5, 0xd9, 0x36, 0xfb, 0x91, 0x9d, 0xd9, 0x40, 0x7b, 0xe7, + 0x8a, 0xc4, 0x85, 0x7f, 0x82, 0x2b, 0xdc, 0xf9, 0x37, 0xb8, 0xf0, 0xb7, 0xa0, 0xf9, 0xd8, 0xf5, + 0x47, 0xed, 0x75, 0x93, 0x03, 0xdc, 0x76, 0xde, 0xd7, 0xcc, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0x0b, + 0xeb, 0x94, 0x05, 0x57, 0x18, 0xba, 0x21, 0xb6, 0xc2, 0x28, 0x60, 0x01, 0x69, 0xc4, 0x43, 0x8c, + 0x5a, 0x34, 0x1e, 0x7a, 0x2e, 0xbb, 0x8c, 0x31, 0xc6, 0x56, 0x6a, 0xa1, 0x3f, 0x84, 0xd5, 0xbe, + 0xeb, 0x8f, 0x0c, 0xbc, 0x8c, 0x91, 0x32, 0x52, 0x87, 0x15, 0x0f, 0x29, 0xb5, 0x46, 0x58, 0xd7, + 0x76, 0xb4, 0x66, 0xc5, 0x48, 0x96, 0xfa, 0xcf, 0x1a, 0x54, 0xa5, 0x25, 0x0d, 0x03, 0x9f, 0xe2, + 0x62, 0x53, 0xf2, 0x21, 0x54, 0x29, 0x46, 0x57, 0xae, 0x8d, 0xa6, 0x6f, 0x79, 0x58, 0xcf, 0x0b, + 0xf5, 0xaa, 0x92, 0x7d, 0x63, 0x79, 0x48, 0xee, 0x41, 0x85, 0xb9, 0x1e, 0x52, 0x66, 0x79, 0x61, + 0xbd, 0xb0, 0xa3, 0x35, 0x0b, 0xc6, 0x58, 0x40, 0x1a, 0x50, 0x3e, 0x0f, 0x28, 0x13, 0xce, 0xb7, + 0x84, 0x73, 0xba, 0xd6, 0x77, 0x61, 0xad, 0xe7, 0x8f, 0x90, 0xb2, 0xe4, 0xc8, 0x77, 0xa0, 0x28, + 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x0e, 0xd4, 0x12, 0x33, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, + 0x19, 0xe5, 0x5d, 0x47, 0x1f, 0xc0, 0xbd, 0x67, 0x98, 0x44, 0xe9, 0xba, 0x94, 0x05, 0xd1, 0xeb, + 0xf6, 0xeb, 0xde, 0x71, 0x66, 0x5c, 0xb2, 0x0d, 0x10, 0x49, 0x03, 0xd3, 0x75, 0xd4, 0xcd, 0x2a, + 0x4a, 0xd2, 0x73, 0xf4, 0x67, 0xb0, 0x3d, 0x27, 0xe8, 0x99, 0xd1, 0xcb, 0x8e, 0xba, 0x01, 0x85, + 0x38, 0x72, 0x55, 0x38, 0xfe, 0xa9, 0xff, 0xa5, 0x41, 0x55, 0xf9, 0x77, 0xae, 0xd0, 0x67, 0xe4, + 0x2e, 0x94, 0x91, 0x7f, 0x98, 0xe9, 0x25, 0x56, 0xc4, 0xba, 0xe7, 0x70, 0xbc, 0x53, 0xec, 0x4c, + 0x8f, 0x8a, 0x30, 0x05, 0x63, 0x35, 0x95, 0x9d, 0x50, 0xb2, 0x0b, 0x6b, 0xc9, 0xb1, 0x29, 0xb3, + 0x18, 0x0a, 0xcc, 0x2b, 0xdd, 0x9c, 0x51, 0x55, 0xe2, 0x01, 0x97, 0x92, 0x2d, 0x28, 0x8a, 0xa0, + 0x12, 0xf5, 0x6e, 0xce, 0x90, 0x4b, 0xb2, 0x0b, 0xb5, 0x20, 0x66, 0x76, 0xe0, 0xa1, 0x19, 0xa1, + 0x45, 0x03, 0xbf, 0x5e, 0x14, 0x47, 0x58, 0x53, 0x52, 0x43, 0x08, 0xdb, 0x55, 0x80, 0xc0, 0xb6, + 0xe3, 0x28, 0x42, 0xdf, 0x46, 0xfd, 0x12, 0x6a, 0xd3, 0x40, 0xcc, 0x80, 0xa7, 0xcd, 0x80, 0x47, + 0xbe, 0x84, 0x92, 0xd8, 0x8e, 0xdf, 0xa0, 0xd0, 0x5c, 0x3d, 0x68, 0xb6, 0x16, 0x13, 0xb7, 0x35, + 0x09, 0x8e, 0xa1, 0xfc, 0x74, 0x6b, 0x2e, 0xfc, 0x3c, 0xa7, 0x8a, 0x04, 0xe3, 0x2d, 0xb4, 0x1b, + 0x6e, 0xf1, 0x12, 0xee, 0x2f, 0xca, 0xb0, 0xda, 0xa3, 0x0b, 0x95, 0x73, 0x21, 0x77, 0x31, 0xd9, + 0x66, 0x2f, 0x6b, 0x9b, 0xe9, 0x58, 0xc6, 0xd8, 0x59, 0xff, 0x5d, 0x13, 0x1c, 0xed, 0x47, 0xc1, + 0x4b, 0xb4, 0x45, 0x8a, 0x62, 0xfa, 0x0e, 0x6c, 0xda, 0x06, 0xb0, 0xcf, 0x2d, 0x7f, 0x84, 0xe6, + 0x98, 0x54, 0x15, 0x29, 0x39, 0x8b, 0x5c, 0x5e, 0x5d, 0xa1, 0x8c, 0x48, 0xeb, 0x85, 0x9d, 0x02, + 0xaf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x8d, 0xd0, 0xa4, 0xee, 0x1b, 0x59, 0x7a, 0x45, + 0xa3, 0xcc, 0x05, 0x03, 0xf7, 0x8d, 0x88, 0x2b, 0x94, 0x2c, 0x78, 0x85, 0x09, 0x03, 0x84, 0xf9, + 0x29, 0x17, 0xe8, 0x43, 0xb8, 0xad, 0x4e, 0xfa, 0x9d, 0x75, 0xe1, 0x3a, 0x16, 0x73, 0x03, 0x9f, + 0x77, 0x09, 0x15, 0x3c, 0x61, 0xad, 0x5a, 0x92, 0x47, 0xb0, 0x3e, 0x8c, 0xd0, 0x7a, 0xc5, 0x23, + 0x3a, 0x38, 0x8a, 0x50, 0x36, 0x0a, 0xad, 0x9b, 0x33, 0x6a, 0x89, 0xe2, 0x58, 0xc8, 0xdb, 0x65, + 0x28, 0x45, 0x48, 0xe3, 0x0b, 0xa6, 0xff, 0x5d, 0x10, 0x19, 0x9e, 0x87, 0x88, 0x42, 0x7f, 0x09, + 0xc7, 0x52, 0xc4, 0xf2, 0x8b, 0x11, 0x2b, 0xcc, 0x22, 0x76, 0x17, 0xca, 0x43, 0x8b, 0x4a, 0xa5, + 0xec, 0x47, 0x2b, 0x7c, 0xcd, 0x55, 0x1f, 0xcd, 0x16, 0x96, 0x84, 0x65, 0xba, 0xac, 0x74, 0x58, + 0x8b, 0x43, 0xc7, 0x62, 0xe8, 0x98, 0x16, 0xe3, 0x15, 0x0a, 0xb2, 0x42, 0x95, 0xf0, 0x90, 0x9d, + 0x50, 0xf2, 0x05, 0x34, 0x22, 0x0c, 0x03, 0xea, 0x72, 0x12, 0x98, 0xb3, 0xc8, 0x94, 0x14, 0x32, + 0xf5, 0xb1, 0x4d, 0x7b, 0x0a, 0x23, 0xf2, 0x14, 0xea, 0x0a, 0x59, 0x53, 0x62, 0x45, 0x4d, 0x3b, + 0xf0, 0xc2, 0x0b, 0x64, 0x58, 0x5f, 0xd9, 0xd1, 0x9a, 0x65, 0x63, 0x4b, 0xe9, 0x0d, 0xa9, 0x3e, + 0x52, 0x5a, 0xd2, 0x9b, 0xe0, 0x43, 0x59, 0xd0, 0xf5, 0x71, 0x16, 0x5d, 0xdf, 0xca, 0xf1, 0x04, + 0x7d, 0x1e, 0xc0, 0xba, 0x8f, 0x3f, 0x31, 0x73, 0x82, 0x26, 0x15, 0xd9, 0x28, 0xb8, 0xb8, 0x9f, + 0x50, 0xa5, 0xbd, 0x09, 0xb7, 0x27, 0x2e, 0xab, 0x72, 0xfb, 0x47, 0x1e, 0x56, 0xbf, 0x76, 0x97, + 0x34, 0x76, 0xf2, 0x39, 0x14, 0x83, 0xc8, 0xc1, 0x48, 0x24, 0xb0, 0x76, 0xb0, 0x9b, 0x75, 0x54, + 0x1e, 0xed, 0x39, 0x37, 0x36, 0xa4, 0x0f, 0x79, 0x02, 0xef, 0x5b, 0xb6, 0x8d, 0xa1, 0xca, 0x44, + 0x10, 0x99, 0xd6, 0x0b, 0x86, 0x11, 0x4f, 0x89, 0x78, 0x84, 0xba, 0x39, 0x63, 0x33, 0x31, 0x38, + 0x64, 0xcf, 0xa3, 0x43, 0xae, 0x3d, 0xa1, 0xa4, 0x05, 0x24, 0xf5, 0x1b, 0xe2, 0x8b, 0x20, 0x42, + 0xee, 0x72, 0x4b, 0xb8, 0x68, 0xc6, 0x46, 0xa2, 0x6b, 0x0b, 0xd5, 0xc9, 0x4c, 0x19, 0x15, 0x33, + 0xcb, 0xa8, 0x34, 0x53, 0x46, 0xed, 0x2d, 0xb8, 0x93, 0xee, 0x75, 0x11, 0xfc, 0x88, 0x91, 0x39, + 0x0c, 0x62, 0xdf, 0x99, 0x92, 0xc7, 0x61, 0x98, 0xc8, 0xf5, 0x3f, 0xf3, 0x69, 0x9f, 0x1d, 0xc4, + 0x9e, 0x67, 0x2d, 0xef, 0xb3, 0xff, 0x4b, 0x0d, 0x3c, 0x86, 0x4d, 0xa1, 0x34, 0xa7, 0x2b, 0xa1, + 0x24, 0x2a, 0x61, 0x43, 0xa8, 0xce, 0x26, 0xca, 0xe1, 0x01, 0xd4, 0x26, 0x33, 0xe5, 0x51, 0x41, + 0x62, 0x9e, 0xa0, 0xea, 0x38, 0x41, 0xe2, 0x61, 0x9b, 0x7d, 0x99, 0xca, 0xf3, 0x5e, 0xa6, 0xdb, + 0xb0, 0x2e, 0xdd, 0x2c, 0xdf, 0x46, 0x93, 0xbf, 0x8c, 0xfa, 0x6f, 0x79, 0xa8, 0x4a, 0xba, 0xa9, + 0xce, 0xf1, 0x15, 0x94, 0xd5, 0x89, 0xaf, 0xd3, 0xb6, 0x15, 0xe6, 0x46, 0xea, 0x3b, 0xaf, 0x08, + 0xf2, 0x73, 0x8a, 0xe0, 0xbf, 0x22, 0xe3, 0x75, 0x09, 0xb5, 0xf7, 0x04, 0x2a, 0x69, 0xe1, 0x90, + 0x4d, 0x58, 0x37, 0x3a, 0xdf, 0x9e, 0x75, 0x06, 0xa7, 0x66, 0xef, 0xd8, 0x3c, 0xee, 0x0c, 0x8e, + 0x36, 0x72, 0xe4, 0x0e, 0x6c, 0x1c, 0x1e, 0x1d, 0x75, 0xfa, 0xa7, 0x9d, 0x63, 0xf3, 0xf0, 0x54, + 0x4a, 0xb5, 0x83, 0x7f, 0x8a, 0x50, 0x19, 0x24, 0xf0, 0x90, 0x1f, 0xe0, 0x16, 0x1f, 0x17, 0xc9, + 0xc3, 0xcc, 0x5e, 0x32, 0x1e, 0x3d, 0x1b, 0xcd, 0xe5, 0x86, 0x32, 0x51, 0x7a, 0x8e, 0x58, 0x50, + 0x92, 0xd3, 0x1d, 0x79, 0x94, 0xe5, 0x35, 0x35, 0x28, 0x36, 0xf6, 0xde, 0xc5, 0x34, 0xdd, 0xe2, + 0x17, 0x0d, 0xde, 0x9b, 0x3b, 0x4b, 0x90, 0xa7, 0x59, 0x71, 0xb2, 0x46, 0xca, 0xc6, 0xa7, 0x37, + 0xf0, 0x4c, 0x0f, 0xf4, 0xab, 0x06, 0x5b, 0xf3, 0x27, 0x0f, 0x72, 0xdd, 0xb8, 0xe3, 0x09, 0xa2, + 0xf1, 0xd9, 0x4d, 0x5c, 0x67, 0x41, 0x7a, 0xfb, 0x39, 0x5e, 0x0a, 0xd2, 0xc2, 0x99, 0x66, 0x29, + 0x48, 0x8b, 0xdf, 0x7e, 0x3d, 0xc7, 0x59, 0xc7, 0xb9, 0x9b, 0xcd, 0xba, 0x89, 0x47, 0x26, 0x9b, + 0x75, 0x93, 0xed, 0x41, 0xcf, 0xb5, 0x11, 0xee, 0xdb, 0x81, 0x97, 0xe1, 0xd0, 0xae, 0xa5, 0xfc, + 0xef, 0xf3, 0x3f, 0xaf, 0xbe, 0xf6, 0xfd, 0xc7, 0x23, 0x97, 0x9d, 0xc7, 0xc3, 0x96, 0x1d, 0x78, + 0xfb, 0xdc, 0x71, 0x7f, 0xc2, 0x71, 0xdf, 0x0a, 0xdd, 0xfd, 0xd4, 0x79, 0x5f, 0xfc, 0xac, 0x85, + 0xc3, 0x61, 0x49, 0x7c, 0x7c, 0xf2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x5a, 0x6e, 0x1c, + 0xc8, 0x0d, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index 1dd87210a..fefb12de3 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -32,7 +32,7 @@ Returned state is current, not state as of the upper bound. Pagination is not a ## Request Summary -This is the wire representation of the existing domain `RequestSummary`, not another stored projection. Its first five fields match the names, types, and numbers in `GetProjectStatusByURIResponse`; numbers 6–10 are reserved to avoid colliding with status-only data. New summary fields use 11–13. The status RPC remains unchanged; refactoring it to share this message is deferred and must preserve its existing wire fields. Summary `state_updated_at_ms` is lifecycle-only, unlike status `updated_at_ms`, which also includes validation results. +This is the wire representation of the existing domain `RequestSummary`, not another stored projection. The status RPC remains unchanged; it can later add this message as a nested field while retaining its existing flat fields for compatibility. Nested messages have independent field numbers. Summary `state_updated_at_ms` is lifecycle-only, unlike status `updated_at_ms`, which also includes validation results. | Field | Type | Meaning | | --- | --- | --- | @@ -45,7 +45,7 @@ This is the wire representation of the existing domain `RequestSummary`, not ano | `accepted_at_ms` | optional int64 | Immutable timestamp of the original retained accepted entry. | | `outcome_reason` | string | Reason for the represented state; empty when unavailable or inapplicable. | -The domain already defines a typed [RequestState](../../../stovepipe/entity/request.go). The wire field remains a string to match existing status/history APIs; replacing it with a protobuf enum would not be wire-compatible. States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. +The domain already defines a typed [RequestState](../../../stovepipe/entity/request.go). The wire field remains a string to match existing status/history APIs. States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. ## Data and Storage Work Required From e47f3eb1bc5631fce33e9e7b7aac614d21e2da3e Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:27:46 +0000 Subject: [PATCH 6/9] style(api): group List request and response together --- api/stovepipe/proto/stovepipe.proto | 44 +-- api/stovepipe/protopb/stovepipe.pb.go | 290 ++++++++++---------- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 145 +++++----- 3 files changed, 239 insertions(+), 240 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index afb3b41df..0a2f3dcdd 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -157,6 +157,28 @@ message GetProjectStatusByURIResponse { string next_page_token = 9; } +// RequestSummary contains one request's current materialized lifecycle state. +message RequestSummary { + // Opaque identifier returned from Ingest. + string request_id = 1; + // Queue containing the request. + string queue = 2; + // Exact VCS-agnostic URI of the ingested commit. + string change_uri = 3; + // Selected baseline URI. Empty before selection or for a full build. + string base_uri = 4; + // Stable public lifecycle state; clients tolerate future values. + string request_state = 5; + // Unix millisecond timestamp of the represented state entry. + int64 state_updated_at_ms = 6; + oneof acceptance_time { + // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. + int64 accepted_at_ms = 7; + } + // Stable reason for the represented state. Empty when unavailable or inapplicable. + string outcome_reason = 8; +} + // ListOrder selects the immutable ordering key for request listing. enum ListOrder { // Descending numeric per-queue request sequence. @@ -185,28 +207,6 @@ message ListRequest { string page_token = 6; } -// RequestSummary contains one request's current materialized lifecycle state. -message RequestSummary { - // Opaque identifier returned from Ingest. - string request_id = 1; - // Queue containing the request. - string queue = 2; - // Exact VCS-agnostic URI of the ingested commit. - string change_uri = 3; - // Selected baseline URI. Empty before selection or for a full build. - string base_uri = 4; - // Stable public lifecycle state; clients tolerate future values. - string request_state = 5; - // Unix millisecond timestamp of the represented state entry. - int64 state_updated_at_ms = 6; - oneof acceptance_time { - // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - int64 accepted_at_ms = 7; - } - // Stable reason for the represented state. Empty when unavailable or inapplicable. - string outcome_reason = 8; -} - // ListResponse contains a page in the requested order, not a snapshot across pages. message ListResponse { // Current summaries in the selected order. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 4d69182db..869e25448 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -981,43 +981,45 @@ type GetProjectStatusByURIResponse_RepositoryBreakageDegree struct { func (*GetProjectStatusByURIResponse_RepositoryBreakageDegree) isGetProjectStatusByURIResponse_RepositoryResult() { } -// ListRequest selects a page of retained request summaries for one queue. -type ListRequest struct { +// RequestSummary contains one request's current materialized lifecycle state. +type RequestSummary struct { state protoimpl.MessageState `protogen:"open.v1"` - // Required configured queue. - Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` - // Ordering for every page. Defaults to request-ID order. - Order ListOrder `protobuf:"varint,2,opt,name=order,proto3,enum=uber.submitqueue.stovepipe.ListOrder" json:"order,omitempty"` - // Types that are valid to be assigned to AcceptedLowerBound: - // - // *ListRequest_AcceptedAtOrAfterMs - AcceptedLowerBound isListRequest_AcceptedLowerBound `protobuf_oneof:"accepted_lower_bound"` - // Types that are valid to be assigned to AcceptedUpperBound: + // Opaque identifier returned from Ingest. + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Queue containing the request. + Queue string `protobuf:"bytes,2,opt,name=queue,proto3" json:"queue,omitempty"` + // Exact VCS-agnostic URI of the ingested commit. + ChangeUri string `protobuf:"bytes,3,opt,name=change_uri,json=changeUri,proto3" json:"change_uri,omitempty"` + // Selected baseline URI. Empty before selection or for a full build. + BaseUri string `protobuf:"bytes,4,opt,name=base_uri,json=baseUri,proto3" json:"base_uri,omitempty"` + // Stable public lifecycle state; clients tolerate future values. + RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` + // Unix millisecond timestamp of the represented state entry. + StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` + // Types that are valid to be assigned to AcceptanceTime: // - // *ListRequest_AcceptedBeforeMs - AcceptedUpperBound isListRequest_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` - // Zero selects 50; nonzero values must be between 1 and 200. - PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Opaque continuation token bound to the queue, order, and resolved time bounds. - PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // *RequestSummary_AcceptedAtMs + AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` + // Stable reason for the represented state. Empty when unavailable or inapplicable. + OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ListRequest) Reset() { - *x = ListRequest{} +func (x *RequestSummary) Reset() { + *x = RequestSummary{} mi := &file_stovepipe_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ListRequest) String() string { +func (x *RequestSummary) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRequest) ProtoMessage() {} +func (*RequestSummary) ProtoMessage() {} -func (x *ListRequest) ProtoReflect() protoreflect.Message { +func (x *RequestSummary) ProtoReflect() protoreflect.Message { mi := &file_stovepipe_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1029,132 +1031,124 @@ func (x *ListRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. -func (*ListRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use RequestSummary.ProtoReflect.Descriptor instead. +func (*RequestSummary) Descriptor() ([]byte, []int) { return file_stovepipe_proto_rawDescGZIP(), []int{13} } -func (x *ListRequest) GetQueue() string { +func (x *RequestSummary) GetRequestId() string { if x != nil { - return x.Queue + return x.RequestId } return "" } -func (x *ListRequest) GetOrder() ListOrder { +func (x *RequestSummary) GetQueue() string { if x != nil { - return x.Order + return x.Queue } - return ListOrder_REQUEST_ID_DESC + return "" } -func (x *ListRequest) GetAcceptedLowerBound() isListRequest_AcceptedLowerBound { +func (x *RequestSummary) GetChangeUri() string { if x != nil { - return x.AcceptedLowerBound + return x.ChangeUri } - return nil + return "" } -func (x *ListRequest) GetAcceptedAtOrAfterMs() int64 { +func (x *RequestSummary) GetBaseUri() string { if x != nil { - if x, ok := x.AcceptedLowerBound.(*ListRequest_AcceptedAtOrAfterMs); ok { - return x.AcceptedAtOrAfterMs - } + return x.BaseUri } - return 0 + return "" } -func (x *ListRequest) GetAcceptedUpperBound() isListRequest_AcceptedUpperBound { +func (x *RequestSummary) GetRequestState() string { if x != nil { - return x.AcceptedUpperBound + return x.RequestState } - return nil + return "" } -func (x *ListRequest) GetAcceptedBeforeMs() int64 { +func (x *RequestSummary) GetStateUpdatedAtMs() int64 { if x != nil { - if x, ok := x.AcceptedUpperBound.(*ListRequest_AcceptedBeforeMs); ok { - return x.AcceptedBeforeMs - } + return x.StateUpdatedAtMs } return 0 } -func (x *ListRequest) GetPageSize() int32 { +func (x *RequestSummary) GetAcceptanceTime() isRequestSummary_AcceptanceTime { if x != nil { - return x.PageSize + return x.AcceptanceTime } - return 0 + return nil } -func (x *ListRequest) GetPageToken() string { +func (x *RequestSummary) GetAcceptedAtMs() int64 { if x != nil { - return x.PageToken + if x, ok := x.AcceptanceTime.(*RequestSummary_AcceptedAtMs); ok { + return x.AcceptedAtMs + } } - return "" -} - -type isListRequest_AcceptedLowerBound interface { - isListRequest_AcceptedLowerBound() + return 0 } -type ListRequest_AcceptedAtOrAfterMs struct { - // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. - AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` +func (x *RequestSummary) GetOutcomeReason() string { + if x != nil { + return x.OutcomeReason + } + return "" } -func (*ListRequest_AcceptedAtOrAfterMs) isListRequest_AcceptedLowerBound() {} - -type isListRequest_AcceptedUpperBound interface { - isListRequest_AcceptedUpperBound() +type isRequestSummary_AcceptanceTime interface { + isRequestSummary_AcceptanceTime() } -type ListRequest_AcceptedBeforeMs struct { - // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. - AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` +type RequestSummary_AcceptedAtMs struct { + // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. + AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` } -func (*ListRequest_AcceptedBeforeMs) isListRequest_AcceptedUpperBound() {} +func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} -// RequestSummary contains one request's current materialized lifecycle state. -type RequestSummary struct { +// ListRequest selects a page of retained request summaries for one queue. +type ListRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - // Opaque identifier returned from Ingest. - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - // Queue containing the request. - Queue string `protobuf:"bytes,2,opt,name=queue,proto3" json:"queue,omitempty"` - // Exact VCS-agnostic URI of the ingested commit. - ChangeUri string `protobuf:"bytes,3,opt,name=change_uri,json=changeUri,proto3" json:"change_uri,omitempty"` - // Selected baseline URI. Empty before selection or for a full build. - BaseUri string `protobuf:"bytes,4,opt,name=base_uri,json=baseUri,proto3" json:"base_uri,omitempty"` - // Stable public lifecycle state; clients tolerate future values. - RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` - // Unix millisecond timestamp of the represented state entry. - StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` - // Types that are valid to be assigned to AcceptanceTime: + // Required configured queue. + Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` + // Ordering for every page. Defaults to request-ID order. + Order ListOrder `protobuf:"varint,2,opt,name=order,proto3,enum=uber.submitqueue.stovepipe.ListOrder" json:"order,omitempty"` + // Types that are valid to be assigned to AcceptedLowerBound: // - // *RequestSummary_AcceptedAtMs - AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` - // Stable reason for the represented state. Empty when unavailable or inapplicable. - OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + // *ListRequest_AcceptedAtOrAfterMs + AcceptedLowerBound isListRequest_AcceptedLowerBound `protobuf_oneof:"accepted_lower_bound"` + // Types that are valid to be assigned to AcceptedUpperBound: + // + // *ListRequest_AcceptedBeforeMs + AcceptedUpperBound isListRequest_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` + // Zero selects 50; nonzero values must be between 1 and 200. + PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Opaque continuation token bound to the queue, order, and resolved time bounds. + PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RequestSummary) Reset() { - *x = RequestSummary{} +func (x *ListRequest) Reset() { + *x = ListRequest{} mi := &file_stovepipe_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RequestSummary) String() string { +func (x *ListRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RequestSummary) ProtoMessage() {} +func (*ListRequest) ProtoMessage() {} -func (x *RequestSummary) ProtoReflect() protoreflect.Message { +func (x *ListRequest) ProtoReflect() protoreflect.Message { mi := &file_stovepipe_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1166,86 +1160,92 @@ func (x *RequestSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RequestSummary.ProtoReflect.Descriptor instead. -func (*RequestSummary) Descriptor() ([]byte, []int) { +// Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. +func (*ListRequest) Descriptor() ([]byte, []int) { return file_stovepipe_proto_rawDescGZIP(), []int{14} } -func (x *RequestSummary) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -func (x *RequestSummary) GetQueue() string { +func (x *ListRequest) GetQueue() string { if x != nil { return x.Queue } return "" } -func (x *RequestSummary) GetChangeUri() string { +func (x *ListRequest) GetOrder() ListOrder { if x != nil { - return x.ChangeUri + return x.Order } - return "" + return ListOrder_REQUEST_ID_DESC } -func (x *RequestSummary) GetBaseUri() string { +func (x *ListRequest) GetAcceptedLowerBound() isListRequest_AcceptedLowerBound { if x != nil { - return x.BaseUri + return x.AcceptedLowerBound } - return "" + return nil } -func (x *RequestSummary) GetRequestState() string { +func (x *ListRequest) GetAcceptedAtOrAfterMs() int64 { if x != nil { - return x.RequestState + if x, ok := x.AcceptedLowerBound.(*ListRequest_AcceptedAtOrAfterMs); ok { + return x.AcceptedAtOrAfterMs + } } - return "" + return 0 } -func (x *RequestSummary) GetStateUpdatedAtMs() int64 { +func (x *ListRequest) GetAcceptedUpperBound() isListRequest_AcceptedUpperBound { if x != nil { - return x.StateUpdatedAtMs + return x.AcceptedUpperBound } - return 0 + return nil } -func (x *RequestSummary) GetAcceptanceTime() isRequestSummary_AcceptanceTime { +func (x *ListRequest) GetAcceptedBeforeMs() int64 { if x != nil { - return x.AcceptanceTime + if x, ok := x.AcceptedUpperBound.(*ListRequest_AcceptedBeforeMs); ok { + return x.AcceptedBeforeMs + } } - return nil + return 0 } -func (x *RequestSummary) GetAcceptedAtMs() int64 { +func (x *ListRequest) GetPageSize() int32 { if x != nil { - if x, ok := x.AcceptanceTime.(*RequestSummary_AcceptedAtMs); ok { - return x.AcceptedAtMs - } + return x.PageSize } return 0 } -func (x *RequestSummary) GetOutcomeReason() string { +func (x *ListRequest) GetPageToken() string { if x != nil { - return x.OutcomeReason + return x.PageToken } return "" } -type isRequestSummary_AcceptanceTime interface { - isRequestSummary_AcceptanceTime() +type isListRequest_AcceptedLowerBound interface { + isListRequest_AcceptedLowerBound() } -type RequestSummary_AcceptedAtMs struct { - // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` +type ListRequest_AcceptedAtOrAfterMs struct { + // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. + AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` } -func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} +func (*ListRequest_AcceptedAtOrAfterMs) isListRequest_AcceptedLowerBound() {} + +type isListRequest_AcceptedUpperBound interface { + isListRequest_AcceptedUpperBound() +} + +type ListRequest_AcceptedBeforeMs struct { + // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. + AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` +} + +func (*ListRequest_AcceptedBeforeMs) isListRequest_AcceptedUpperBound() {} // ListResponse contains a page in the requested order, not a snapshot across pages. type ListResponse struct { @@ -1429,17 +1429,7 @@ const file_stovepipe_proto_rawDesc = "" + "\x18project_results_complete\x18\a \x01(\bR\x16projectResultsComplete\x12I\n" + "\bprojects\x18\b \x03(\v2-.uber.submitqueue.stovepipe.ProjectValidationR\bprojects\x12&\n" + "\x0fnext_page_token\x18\t \x01(\tR\rnextPageTokenB\x13\n" + - "\x11repository_result\"\xb4\x02\n" + - "\vListRequest\x12\x14\n" + - "\x05queue\x18\x01 \x01(\tR\x05queue\x12;\n" + - "\x05order\x18\x02 \x01(\x0e2%.uber.submitqueue.stovepipe.ListOrderR\x05order\x126\n" + - "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + - "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMs\x12\x1b\n" + - "\tpage_size\x18\x05 \x01(\x05R\bpageSize\x12\x1d\n" + - "\n" + - "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + - "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound\"\xb5\x02\n" + + "\x11repository_result\"\xb5\x02\n" + "\x0eRequestSummary\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12\x14\n" + @@ -1451,7 +1441,17 @@ const file_stovepipe_proto_rawDesc = "" + "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + - "\x0facceptance_time\"\x96\x02\n" + + "\x0facceptance_time\"\xb4\x02\n" + + "\vListRequest\x12\x14\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12;\n" + + "\x05order\x18\x02 \x01(\x0e2%.uber.submitqueue.stovepipe.ListOrderR\x05order\x126\n" + + "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + + "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMs\x12\x1b\n" + + "\tpage_size\x18\x05 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + + "\x14accepted_lower_boundB\x16\n" + + "\x14accepted_upper_bound\"\x96\x02\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x126\n" + @@ -1500,8 +1500,8 @@ var file_stovepipe_proto_goTypes = []any{ (*GetProjectStatusByURIRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest (*ProjectValidation)(nil), // 12: uber.submitqueue.stovepipe.ProjectValidation (*GetProjectStatusByURIResponse)(nil), // 13: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - (*ListRequest)(nil), // 14: uber.submitqueue.stovepipe.ListRequest - (*RequestSummary)(nil), // 15: uber.submitqueue.stovepipe.RequestSummary + (*RequestSummary)(nil), // 14: uber.submitqueue.stovepipe.RequestSummary + (*ListRequest)(nil), // 15: uber.submitqueue.stovepipe.ListRequest (*ListResponse)(nil), // 16: uber.submitqueue.stovepipe.ListResponse } var file_stovepipe_proto_depIdxs = []int32{ @@ -1510,13 +1510,13 @@ var file_stovepipe_proto_depIdxs = []int32{ 8, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory 12, // 3: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation 0, // 4: uber.submitqueue.stovepipe.ListRequest.order:type_name -> uber.submitqueue.stovepipe.ListOrder - 15, // 5: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 14, // 5: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary 1, // 6: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest 3, // 7: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest 5, // 8: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest 6, // 9: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest 11, // 10: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 14, // 11: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 15, // 11: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest 2, // 12: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse 4, // 13: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse 9, // 14: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse @@ -1546,11 +1546,11 @@ func file_stovepipe_proto_init() { (*GetProjectStatusByURIResponse_RepositoryBreakageDegree)(nil), } file_stovepipe_proto_msgTypes[13].OneofWrappers = []any{ - (*ListRequest_AcceptedAtOrAfterMs)(nil), - (*ListRequest_AcceptedBeforeMs)(nil), + (*RequestSummary_AcceptedAtMs)(nil), } file_stovepipe_proto_msgTypes[14].OneofWrappers = []any{ - (*RequestSummary_AcceptedAtMs)(nil), + (*ListRequest_AcceptedAtOrAfterMs)(nil), + (*ListRequest_AcceptedBeforeMs)(nil), } file_stovepipe_proto_msgTypes[15].OneofWrappers = []any{ (*ListResponse_AcceptedAtOrAfterMs)(nil), diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index 5c80a74ae..e79a0bd81 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -476,79 +476,78 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xda, 0xb5, 0x63, 0xbf, 0x38, 0x4e, 0x3a, 0x29, 0xc1, 0x35, 0x4d, 0x15, 0x16, 0xa5, - 0x75, 0x23, 0xd5, 0x11, 0x41, 0xaa, 0x0a, 0x48, 0x88, 0x38, 0x31, 0xb5, 0x25, 0x42, 0xcd, 0x3a, - 0xe1, 0x00, 0x87, 0xd5, 0x7a, 0xf7, 0xd5, 0xd9, 0x36, 0xfb, 0x91, 0x9d, 0xd9, 0x40, 0x7b, 0xe7, - 0x8a, 0xc4, 0x85, 0x7f, 0x82, 0x2b, 0xdc, 0xf9, 0x37, 0xb8, 0xf0, 0xb7, 0xa0, 0xf9, 0xd8, 0xf5, - 0x47, 0xed, 0x75, 0x93, 0x03, 0xdc, 0x76, 0xde, 0xd7, 0xcc, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0x0b, - 0xeb, 0x94, 0x05, 0x57, 0x18, 0xba, 0x21, 0xb6, 0xc2, 0x28, 0x60, 0x01, 0x69, 0xc4, 0x43, 0x8c, - 0x5a, 0x34, 0x1e, 0x7a, 0x2e, 0xbb, 0x8c, 0x31, 0xc6, 0x56, 0x6a, 0xa1, 0x3f, 0x84, 0xd5, 0xbe, - 0xeb, 0x8f, 0x0c, 0xbc, 0x8c, 0x91, 0x32, 0x52, 0x87, 0x15, 0x0f, 0x29, 0xb5, 0x46, 0x58, 0xd7, - 0x76, 0xb4, 0x66, 0xc5, 0x48, 0x96, 0xfa, 0xcf, 0x1a, 0x54, 0xa5, 0x25, 0x0d, 0x03, 0x9f, 0xe2, - 0x62, 0x53, 0xf2, 0x21, 0x54, 0x29, 0x46, 0x57, 0xae, 0x8d, 0xa6, 0x6f, 0x79, 0x58, 0xcf, 0x0b, - 0xf5, 0xaa, 0x92, 0x7d, 0x63, 0x79, 0x48, 0xee, 0x41, 0x85, 0xb9, 0x1e, 0x52, 0x66, 0x79, 0x61, - 0xbd, 0xb0, 0xa3, 0x35, 0x0b, 0xc6, 0x58, 0x40, 0x1a, 0x50, 0x3e, 0x0f, 0x28, 0x13, 0xce, 0xb7, - 0x84, 0x73, 0xba, 0xd6, 0x77, 0x61, 0xad, 0xe7, 0x8f, 0x90, 0xb2, 0xe4, 0xc8, 0x77, 0xa0, 0x28, - 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x0e, 0xd4, 0x12, 0x33, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, - 0x19, 0xe5, 0x5d, 0x47, 0x1f, 0xc0, 0xbd, 0x67, 0x98, 0x44, 0xe9, 0xba, 0x94, 0x05, 0xd1, 0xeb, - 0xf6, 0xeb, 0xde, 0x71, 0x66, 0x5c, 0xb2, 0x0d, 0x10, 0x49, 0x03, 0xd3, 0x75, 0xd4, 0xcd, 0x2a, - 0x4a, 0xd2, 0x73, 0xf4, 0x67, 0xb0, 0x3d, 0x27, 0xe8, 0x99, 0xd1, 0xcb, 0x8e, 0xba, 0x01, 0x85, - 0x38, 0x72, 0x55, 0x38, 0xfe, 0xa9, 0xff, 0xa5, 0x41, 0x55, 0xf9, 0x77, 0xae, 0xd0, 0x67, 0xe4, - 0x2e, 0x94, 0x91, 0x7f, 0x98, 0xe9, 0x25, 0x56, 0xc4, 0xba, 0xe7, 0x70, 0xbc, 0x53, 0xec, 0x4c, - 0x8f, 0x8a, 0x30, 0x05, 0x63, 0x35, 0x95, 0x9d, 0x50, 0xb2, 0x0b, 0x6b, 0xc9, 0xb1, 0x29, 0xb3, - 0x18, 0x0a, 0xcc, 0x2b, 0xdd, 0x9c, 0x51, 0x55, 0xe2, 0x01, 0x97, 0x92, 0x2d, 0x28, 0x8a, 0xa0, - 0x12, 0xf5, 0x6e, 0xce, 0x90, 0x4b, 0xb2, 0x0b, 0xb5, 0x20, 0x66, 0x76, 0xe0, 0xa1, 0x19, 0xa1, - 0x45, 0x03, 0xbf, 0x5e, 0x14, 0x47, 0x58, 0x53, 0x52, 0x43, 0x08, 0xdb, 0x55, 0x80, 0xc0, 0xb6, - 0xe3, 0x28, 0x42, 0xdf, 0x46, 0xfd, 0x12, 0x6a, 0xd3, 0x40, 0xcc, 0x80, 0xa7, 0xcd, 0x80, 0x47, - 0xbe, 0x84, 0x92, 0xd8, 0x8e, 0xdf, 0xa0, 0xd0, 0x5c, 0x3d, 0x68, 0xb6, 0x16, 0x13, 0xb7, 0x35, - 0x09, 0x8e, 0xa1, 0xfc, 0x74, 0x6b, 0x2e, 0xfc, 0x3c, 0xa7, 0x8a, 0x04, 0xe3, 0x2d, 0xb4, 0x1b, - 0x6e, 0xf1, 0x12, 0xee, 0x2f, 0xca, 0xb0, 0xda, 0xa3, 0x0b, 0x95, 0x73, 0x21, 0x77, 0x31, 0xd9, - 0x66, 0x2f, 0x6b, 0x9b, 0xe9, 0x58, 0xc6, 0xd8, 0x59, 0xff, 0x5d, 0x13, 0x1c, 0xed, 0x47, 0xc1, - 0x4b, 0xb4, 0x45, 0x8a, 0x62, 0xfa, 0x0e, 0x6c, 0xda, 0x06, 0xb0, 0xcf, 0x2d, 0x7f, 0x84, 0xe6, - 0x98, 0x54, 0x15, 0x29, 0x39, 0x8b, 0x5c, 0x5e, 0x5d, 0xa1, 0x8c, 0x48, 0xeb, 0x85, 0x9d, 0x02, - 0xaf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x8d, 0xd0, 0xa4, 0xee, 0x1b, 0x59, 0x7a, 0x45, - 0xa3, 0xcc, 0x05, 0x03, 0xf7, 0x8d, 0x88, 0x2b, 0x94, 0x2c, 0x78, 0x85, 0x09, 0x03, 0x84, 0xf9, - 0x29, 0x17, 0xe8, 0x43, 0xb8, 0xad, 0x4e, 0xfa, 0x9d, 0x75, 0xe1, 0x3a, 0x16, 0x73, 0x03, 0x9f, - 0x77, 0x09, 0x15, 0x3c, 0x61, 0xad, 0x5a, 0x92, 0x47, 0xb0, 0x3e, 0x8c, 0xd0, 0x7a, 0xc5, 0x23, - 0x3a, 0x38, 0x8a, 0x50, 0x36, 0x0a, 0xad, 0x9b, 0x33, 0x6a, 0x89, 0xe2, 0x58, 0xc8, 0xdb, 0x65, - 0x28, 0x45, 0x48, 0xe3, 0x0b, 0xa6, 0xff, 0x5d, 0x10, 0x19, 0x9e, 0x87, 0x88, 0x42, 0x7f, 0x09, - 0xc7, 0x52, 0xc4, 0xf2, 0x8b, 0x11, 0x2b, 0xcc, 0x22, 0x76, 0x17, 0xca, 0x43, 0x8b, 0x4a, 0xa5, - 0xec, 0x47, 0x2b, 0x7c, 0xcd, 0x55, 0x1f, 0xcd, 0x16, 0x96, 0x84, 0x65, 0xba, 0xac, 0x74, 0x58, - 0x8b, 0x43, 0xc7, 0x62, 0xe8, 0x98, 0x16, 0xe3, 0x15, 0x0a, 0xb2, 0x42, 0x95, 0xf0, 0x90, 0x9d, - 0x50, 0xf2, 0x05, 0x34, 0x22, 0x0c, 0x03, 0xea, 0x72, 0x12, 0x98, 0xb3, 0xc8, 0x94, 0x14, 0x32, - 0xf5, 0xb1, 0x4d, 0x7b, 0x0a, 0x23, 0xf2, 0x14, 0xea, 0x0a, 0x59, 0x53, 0x62, 0x45, 0x4d, 0x3b, - 0xf0, 0xc2, 0x0b, 0x64, 0x58, 0x5f, 0xd9, 0xd1, 0x9a, 0x65, 0x63, 0x4b, 0xe9, 0x0d, 0xa9, 0x3e, - 0x52, 0x5a, 0xd2, 0x9b, 0xe0, 0x43, 0x59, 0xd0, 0xf5, 0x71, 0x16, 0x5d, 0xdf, 0xca, 0xf1, 0x04, - 0x7d, 0x1e, 0xc0, 0xba, 0x8f, 0x3f, 0x31, 0x73, 0x82, 0x26, 0x15, 0xd9, 0x28, 0xb8, 0xb8, 0x9f, - 0x50, 0xa5, 0xbd, 0x09, 0xb7, 0x27, 0x2e, 0xab, 0x72, 0xfb, 0x47, 0x1e, 0x56, 0xbf, 0x76, 0x97, - 0x34, 0x76, 0xf2, 0x39, 0x14, 0x83, 0xc8, 0xc1, 0x48, 0x24, 0xb0, 0x76, 0xb0, 0x9b, 0x75, 0x54, - 0x1e, 0xed, 0x39, 0x37, 0x36, 0xa4, 0x0f, 0x79, 0x02, 0xef, 0x5b, 0xb6, 0x8d, 0xa1, 0xca, 0x44, - 0x10, 0x99, 0xd6, 0x0b, 0x86, 0x11, 0x4f, 0x89, 0x78, 0x84, 0xba, 0x39, 0x63, 0x33, 0x31, 0x38, - 0x64, 0xcf, 0xa3, 0x43, 0xae, 0x3d, 0xa1, 0xa4, 0x05, 0x24, 0xf5, 0x1b, 0xe2, 0x8b, 0x20, 0x42, - 0xee, 0x72, 0x4b, 0xb8, 0x68, 0xc6, 0x46, 0xa2, 0x6b, 0x0b, 0xd5, 0xc9, 0x4c, 0x19, 0x15, 0x33, - 0xcb, 0xa8, 0x34, 0x53, 0x46, 0xed, 0x2d, 0xb8, 0x93, 0xee, 0x75, 0x11, 0xfc, 0x88, 0x91, 0x39, - 0x0c, 0x62, 0xdf, 0x99, 0x92, 0xc7, 0x61, 0x98, 0xc8, 0xf5, 0x3f, 0xf3, 0x69, 0x9f, 0x1d, 0xc4, - 0x9e, 0x67, 0x2d, 0xef, 0xb3, 0xff, 0x4b, 0x0d, 0x3c, 0x86, 0x4d, 0xa1, 0x34, 0xa7, 0x2b, 0xa1, - 0x24, 0x2a, 0x61, 0x43, 0xa8, 0xce, 0x26, 0xca, 0xe1, 0x01, 0xd4, 0x26, 0x33, 0xe5, 0x51, 0x41, - 0x62, 0x9e, 0xa0, 0xea, 0x38, 0x41, 0xe2, 0x61, 0x9b, 0x7d, 0x99, 0xca, 0xf3, 0x5e, 0xa6, 0xdb, - 0xb0, 0x2e, 0xdd, 0x2c, 0xdf, 0x46, 0x93, 0xbf, 0x8c, 0xfa, 0x6f, 0x79, 0xa8, 0x4a, 0xba, 0xa9, - 0xce, 0xf1, 0x15, 0x94, 0xd5, 0x89, 0xaf, 0xd3, 0xb6, 0x15, 0xe6, 0x46, 0xea, 0x3b, 0xaf, 0x08, - 0xf2, 0x73, 0x8a, 0xe0, 0xbf, 0x22, 0xe3, 0x75, 0x09, 0xb5, 0xf7, 0x04, 0x2a, 0x69, 0xe1, 0x90, - 0x4d, 0x58, 0x37, 0x3a, 0xdf, 0x9e, 0x75, 0x06, 0xa7, 0x66, 0xef, 0xd8, 0x3c, 0xee, 0x0c, 0x8e, - 0x36, 0x72, 0xe4, 0x0e, 0x6c, 0x1c, 0x1e, 0x1d, 0x75, 0xfa, 0xa7, 0x9d, 0x63, 0xf3, 0xf0, 0x54, - 0x4a, 0xb5, 0x83, 0x7f, 0x8a, 0x50, 0x19, 0x24, 0xf0, 0x90, 0x1f, 0xe0, 0x16, 0x1f, 0x17, 0xc9, - 0xc3, 0xcc, 0x5e, 0x32, 0x1e, 0x3d, 0x1b, 0xcd, 0xe5, 0x86, 0x32, 0x51, 0x7a, 0x8e, 0x58, 0x50, - 0x92, 0xd3, 0x1d, 0x79, 0x94, 0xe5, 0x35, 0x35, 0x28, 0x36, 0xf6, 0xde, 0xc5, 0x34, 0xdd, 0xe2, - 0x17, 0x0d, 0xde, 0x9b, 0x3b, 0x4b, 0x90, 0xa7, 0x59, 0x71, 0xb2, 0x46, 0xca, 0xc6, 0xa7, 0x37, - 0xf0, 0x4c, 0x0f, 0xf4, 0xab, 0x06, 0x5b, 0xf3, 0x27, 0x0f, 0x72, 0xdd, 0xb8, 0xe3, 0x09, 0xa2, - 0xf1, 0xd9, 0x4d, 0x5c, 0x67, 0x41, 0x7a, 0xfb, 0x39, 0x5e, 0x0a, 0xd2, 0xc2, 0x99, 0x66, 0x29, - 0x48, 0x8b, 0xdf, 0x7e, 0x3d, 0xc7, 0x59, 0xc7, 0xb9, 0x9b, 0xcd, 0xba, 0x89, 0x47, 0x26, 0x9b, - 0x75, 0x93, 0xed, 0x41, 0xcf, 0xb5, 0x11, 0xee, 0xdb, 0x81, 0x97, 0xe1, 0xd0, 0xae, 0xa5, 0xfc, - 0xef, 0xf3, 0x3f, 0xaf, 0xbe, 0xf6, 0xfd, 0xc7, 0x23, 0x97, 0x9d, 0xc7, 0xc3, 0x96, 0x1d, 0x78, - 0xfb, 0xdc, 0x71, 0x7f, 0xc2, 0x71, 0xdf, 0x0a, 0xdd, 0xfd, 0xd4, 0x79, 0x5f, 0xfc, 0xac, 0x85, - 0xc3, 0x61, 0x49, 0x7c, 0x7c, 0xf2, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x5a, 0x6e, 0x1c, - 0xc8, 0x0d, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4b, 0x6f, 0x1b, 0x55, + 0x14, 0xf6, 0xd8, 0xb5, 0x63, 0x9f, 0x38, 0x4e, 0x7a, 0x13, 0x82, 0x6b, 0x9a, 0x2a, 0x0c, 0x4a, + 0xeb, 0x46, 0xaa, 0x23, 0x82, 0x54, 0x15, 0x90, 0x10, 0x71, 0x62, 0x1a, 0x4b, 0x84, 0x9a, 0x71, + 0xc2, 0x02, 0x16, 0xa3, 0xf1, 0xcc, 0xa9, 0x33, 0x6d, 0xe6, 0x91, 0xb9, 0x77, 0x02, 0xed, 0x9e, + 0x2d, 0x12, 0x1b, 0xfe, 0x04, 0x5b, 0xd8, 0xf3, 0x37, 0xd8, 0xf0, 0x5b, 0xd0, 0x7d, 0xcc, 0xf8, + 0x11, 0x7b, 0xdc, 0x64, 0x01, 0x3b, 0xdf, 0xef, 0x3c, 0xee, 0xbd, 0xdf, 0xf9, 0xee, 0x99, 0x63, + 0x58, 0xa5, 0x2c, 0xb8, 0xc2, 0xd0, 0x0d, 0xb1, 0x15, 0x46, 0x01, 0x0b, 0x48, 0x23, 0x1e, 0x60, + 0xd4, 0xa2, 0xf1, 0xc0, 0x73, 0xd9, 0x65, 0x8c, 0x31, 0xb6, 0x52, 0x0f, 0xfd, 0x11, 0x2c, 0xf7, + 0x5c, 0x7f, 0x68, 0xe0, 0x65, 0x8c, 0x94, 0x91, 0x3a, 0x2c, 0x79, 0x48, 0xa9, 0x35, 0xc4, 0xba, + 0xb6, 0xad, 0x35, 0x2b, 0x46, 0xb2, 0xd4, 0x7f, 0xd6, 0xa0, 0x2a, 0x3d, 0x69, 0x18, 0xf8, 0x14, + 0xe7, 0xbb, 0x92, 0x0f, 0xa1, 0x4a, 0x31, 0xba, 0x72, 0x6d, 0x34, 0x7d, 0xcb, 0xc3, 0x7a, 0x5e, + 0x98, 0x97, 0x15, 0xf6, 0x8d, 0xe5, 0x21, 0xb9, 0x0f, 0x15, 0xe6, 0x7a, 0x48, 0x99, 0xe5, 0x85, + 0xf5, 0xc2, 0xb6, 0xd6, 0x2c, 0x18, 0x23, 0x80, 0x34, 0xa0, 0x7c, 0x1e, 0x50, 0x26, 0x82, 0xef, + 0x88, 0xe0, 0x74, 0xad, 0xef, 0xc0, 0x4a, 0xd7, 0x1f, 0x22, 0x65, 0xc9, 0x91, 0x37, 0xa0, 0x28, + 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x36, 0xd4, 0x12, 0x37, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, + 0x39, 0xe5, 0x5d, 0x47, 0xef, 0xc3, 0xfd, 0xe7, 0x98, 0x64, 0x39, 0x76, 0x29, 0x0b, 0xa2, 0x37, + 0xed, 0x37, 0xdd, 0xa3, 0xcc, 0xbc, 0x64, 0x0b, 0x20, 0x92, 0x0e, 0xa6, 0xeb, 0xa8, 0x9b, 0x55, + 0x14, 0xd2, 0x75, 0xf4, 0xe7, 0xb0, 0x35, 0x23, 0xe9, 0x99, 0xd1, 0xcd, 0xce, 0xba, 0x06, 0x85, + 0x38, 0x72, 0x55, 0x3a, 0xfe, 0x53, 0xff, 0x4b, 0x83, 0xaa, 0x8a, 0xef, 0x5c, 0xa1, 0xcf, 0xc8, + 0x3d, 0x28, 0x23, 0xff, 0x61, 0xa6, 0x97, 0x58, 0x12, 0xeb, 0xae, 0xc3, 0xf9, 0x4e, 0xb9, 0x33, + 0x3d, 0x2a, 0xd2, 0x14, 0x8c, 0xe5, 0x14, 0x3b, 0xa1, 0x64, 0x07, 0x56, 0x92, 0x63, 0x53, 0x66, + 0x31, 0x14, 0x9c, 0x57, 0x8e, 0x73, 0x46, 0x55, 0xc1, 0x7d, 0x8e, 0x92, 0x4d, 0x28, 0x8a, 0xa4, + 0x92, 0xf5, 0xe3, 0x9c, 0x21, 0x97, 0x64, 0x07, 0x6a, 0x41, 0xcc, 0xec, 0xc0, 0x43, 0x33, 0x42, + 0x8b, 0x06, 0x7e, 0xbd, 0x28, 0x8e, 0xb0, 0xa2, 0x50, 0x43, 0x80, 0xed, 0x2a, 0x40, 0x60, 0xdb, + 0x71, 0x14, 0xa1, 0x6f, 0xa3, 0x7e, 0x09, 0xb5, 0x49, 0x22, 0xa6, 0xc8, 0xd3, 0xa6, 0xc8, 0x23, + 0x5f, 0x42, 0x49, 0x6c, 0xc7, 0x6f, 0x50, 0x68, 0x2e, 0xef, 0x37, 0x5b, 0xf3, 0x85, 0xdb, 0x1a, + 0x27, 0xc7, 0x50, 0x71, 0xba, 0x35, 0x93, 0x7e, 0x5e, 0x53, 0x25, 0x82, 0xd1, 0x16, 0xda, 0x2d, + 0xb7, 0x78, 0x05, 0x0f, 0xe6, 0x55, 0x58, 0xed, 0x71, 0x0c, 0x95, 0x73, 0x81, 0xbb, 0x98, 0x6c, + 0xb3, 0x9b, 0xb5, 0xcd, 0x64, 0x2e, 0x63, 0x14, 0xac, 0xff, 0xae, 0x09, 0x8d, 0xf6, 0xa2, 0xe0, + 0x15, 0xda, 0xa2, 0x44, 0x31, 0x7d, 0x07, 0x35, 0x6d, 0x01, 0xd8, 0xe7, 0x96, 0x3f, 0x44, 0x73, + 0x24, 0xaa, 0x8a, 0x44, 0xce, 0x22, 0x97, 0xbf, 0xae, 0x50, 0x66, 0xa4, 0xf5, 0xc2, 0x76, 0x81, + 0xbf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x0d, 0xd1, 0xa4, 0xee, 0x5b, 0xf9, 0xf4, 0x8a, + 0x46, 0x99, 0x03, 0x7d, 0xf7, 0xad, 0xc8, 0x2b, 0x8c, 0x2c, 0x78, 0x8d, 0x89, 0x02, 0x84, 0xfb, + 0x29, 0x07, 0xf4, 0x01, 0xdc, 0x55, 0x27, 0xfd, 0xce, 0xba, 0x70, 0x1d, 0x8b, 0xb9, 0x81, 0xcf, + 0xbb, 0x84, 0x4a, 0x9e, 0xa8, 0x56, 0x2d, 0xc9, 0x63, 0x58, 0x1d, 0x44, 0x68, 0xbd, 0xe6, 0x19, + 0x1d, 0x1c, 0x46, 0x28, 0x1b, 0x85, 0x76, 0x9c, 0x33, 0x6a, 0x89, 0xe1, 0x48, 0xe0, 0xed, 0x32, + 0x94, 0x22, 0xa4, 0xf1, 0x05, 0xd3, 0xff, 0x2e, 0x88, 0x0a, 0xcf, 0x62, 0x44, 0xb1, 0xbf, 0x40, + 0x63, 0x29, 0x63, 0xf9, 0xf9, 0x8c, 0x15, 0xa6, 0x19, 0xbb, 0x07, 0xe5, 0x81, 0x45, 0xa5, 0x51, + 0xf6, 0xa3, 0x25, 0xbe, 0xe6, 0xa6, 0x8f, 0xa6, 0x1f, 0x96, 0xa4, 0x65, 0xf2, 0x59, 0xe9, 0xb0, + 0x12, 0x87, 0x8e, 0xc5, 0xd0, 0x31, 0x2d, 0xc6, 0x5f, 0x28, 0xc8, 0x17, 0xaa, 0xc0, 0x03, 0x76, + 0x42, 0xc9, 0x17, 0xd0, 0x88, 0x30, 0x0c, 0xa8, 0xcb, 0x45, 0x60, 0x4e, 0x33, 0x53, 0x52, 0xcc, + 0xd4, 0x47, 0x3e, 0xed, 0x09, 0x8e, 0xc8, 0x33, 0xa8, 0x2b, 0x66, 0x4d, 0xc9, 0x15, 0x35, 0xed, + 0xc0, 0x0b, 0x2f, 0x90, 0x61, 0x7d, 0x69, 0x5b, 0x6b, 0x96, 0x8d, 0x4d, 0x65, 0x37, 0xa4, 0xf9, + 0x50, 0x59, 0x49, 0x77, 0x4c, 0x0f, 0x65, 0x21, 0xd7, 0x27, 0x59, 0x72, 0xbd, 0x56, 0xe3, 0x31, + 0xf9, 0x3c, 0x84, 0x55, 0x1f, 0x7f, 0x62, 0xe6, 0x98, 0x4c, 0x2a, 0xb2, 0x51, 0x70, 0xb8, 0x97, + 0x48, 0xa5, 0xbd, 0x0e, 0x77, 0xc7, 0x2e, 0xab, 0x6a, 0xfb, 0x67, 0x3e, 0x6d, 0x18, 0xfd, 0xd8, + 0xf3, 0xac, 0xc5, 0x0d, 0xe3, 0x7f, 0x29, 0xe6, 0x13, 0x58, 0x17, 0x46, 0x73, 0xb2, 0xa4, 0x25, + 0x51, 0xd2, 0x35, 0x61, 0x3a, 0x1b, 0xab, 0xeb, 0x43, 0xa8, 0x59, 0xb6, 0x8d, 0xe1, 0xc8, 0x93, + 0x57, 0xa3, 0xc0, 0x5b, 0x6f, 0x82, 0x0b, 0xbf, 0xeb, 0x2d, 0xb6, 0x3c, 0xab, 0xc5, 0xde, 0x85, + 0x55, 0x19, 0x66, 0xf9, 0x36, 0x9a, 0xbc, 0xc5, 0xeb, 0x7f, 0xe4, 0x61, 0xf9, 0x6b, 0x77, 0xc1, + 0x07, 0x91, 0x7c, 0x0e, 0xc5, 0x20, 0x72, 0x30, 0x12, 0x5c, 0xd5, 0xf6, 0x77, 0xb2, 0x4a, 0xcc, + 0xb3, 0xbd, 0xe0, 0xce, 0x86, 0x8c, 0x21, 0x4f, 0xe1, 0xfd, 0xf1, 0x4b, 0x04, 0x91, 0x69, 0xbd, + 0x64, 0x18, 0xf1, 0xdb, 0x14, 0xd4, 0x6d, 0xd6, 0x47, 0xb7, 0x79, 0x11, 0x1d, 0x70, 0xeb, 0x09, + 0x25, 0x2d, 0x20, 0x69, 0xdc, 0x00, 0x5f, 0x06, 0x11, 0xf2, 0x90, 0x3b, 0x22, 0x44, 0x33, 0xd6, + 0x12, 0x5b, 0x5b, 0x98, 0x4e, 0xa6, 0xda, 0x4f, 0x31, 0xb3, 0xfd, 0x94, 0xa6, 0xda, 0x4f, 0x7b, + 0x13, 0x36, 0xd2, 0xbd, 0x2e, 0x82, 0x1f, 0x31, 0x32, 0x07, 0x41, 0xec, 0x3b, 0x13, 0x78, 0x1c, + 0x86, 0x09, 0xae, 0xff, 0x96, 0x87, 0xaa, 0xa4, 0x4d, 0x75, 0x8e, 0xaf, 0xa0, 0xac, 0x0a, 0x7d, + 0x93, 0xb6, 0xad, 0xa4, 0x6a, 0xa4, 0xb1, 0xb3, 0x1e, 0x41, 0x7e, 0xc6, 0x23, 0xf8, 0xaf, 0x48, + 0xbd, 0x29, 0x31, 0xbb, 0x4f, 0xa1, 0x92, 0x0a, 0x80, 0xac, 0xc3, 0xaa, 0xd1, 0xf9, 0xf6, 0xac, + 0xd3, 0x3f, 0x35, 0xbb, 0x47, 0xe6, 0x51, 0xa7, 0x7f, 0xb8, 0x96, 0x23, 0x1b, 0xb0, 0x76, 0x70, + 0x78, 0xd8, 0xe9, 0x9d, 0x76, 0x8e, 0xcc, 0x83, 0x53, 0x89, 0x6a, 0xfb, 0xff, 0x14, 0xa1, 0xd2, + 0x4f, 0xe8, 0x21, 0x3f, 0xc0, 0x1d, 0x3e, 0x2e, 0x92, 0x47, 0x99, 0xbd, 0x64, 0x34, 0x7a, 0x36, + 0x9a, 0x8b, 0x1d, 0x65, 0xa1, 0xf4, 0x1c, 0xb1, 0xa0, 0x24, 0xa7, 0x3b, 0xf2, 0x38, 0x2b, 0x6a, + 0x62, 0x50, 0x6c, 0xec, 0xbe, 0x8b, 0x6b, 0xba, 0xc5, 0x2f, 0x1a, 0xbc, 0x37, 0x73, 0x96, 0x20, + 0xcf, 0xb2, 0xf2, 0x64, 0x8d, 0x94, 0x8d, 0x4f, 0x6f, 0x11, 0x99, 0x1e, 0xe8, 0x57, 0x0d, 0x36, + 0x67, 0x4f, 0x1e, 0xe4, 0xa6, 0x79, 0x47, 0x13, 0x44, 0xe3, 0xb3, 0xdb, 0x84, 0x4e, 0x93, 0x74, + 0xfd, 0x73, 0xbc, 0x90, 0xa4, 0xb9, 0x33, 0xcd, 0x42, 0x92, 0xe6, 0x7f, 0xfb, 0xf5, 0x1c, 0x57, + 0x1d, 0xd7, 0x6e, 0xb6, 0xea, 0xc6, 0x9a, 0x65, 0xb6, 0xea, 0xc6, 0xdb, 0x83, 0x9e, 0x6b, 0x23, + 0x3c, 0xb0, 0x03, 0x2f, 0x23, 0xa0, 0x5d, 0x4b, 0xf5, 0xdf, 0xe3, 0xff, 0xbc, 0x7a, 0xda, 0xf7, + 0x1f, 0x0f, 0x5d, 0x76, 0x1e, 0x0f, 0x5a, 0x76, 0xe0, 0xed, 0xf1, 0xc0, 0xbd, 0xb1, 0xc0, 0x3d, + 0x2b, 0x74, 0xf7, 0xd2, 0xe0, 0x3d, 0xf1, 0x67, 0x2d, 0x1c, 0x0c, 0x4a, 0xe2, 0xc7, 0x27, 0xff, + 0x06, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x8e, 0xb7, 0x93, 0xc8, 0x0d, 0x00, 0x00, }, } From 36344c7fb5977151de198fd1f1d4524e9193beb1 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 18:48:30 +0000 Subject: [PATCH 7/9] feat(api): simplify Stovepipe List to acceptance-time order --- api/stovepipe/proto/stovepipe.proto | 41 ++-- api/stovepipe/protopb/stovepipe.pb.go | 249 ++++++-------------- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 141 ++++++----- doc/rfc/stovepipe/list-api.md | 21 +- 4 files changed, 158 insertions(+), 294 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 0a2f3dcdd..b0bd7cfea 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -179,48 +179,35 @@ message RequestSummary { string outcome_reason = 8; } -// ListOrder selects the immutable ordering key for request listing. -enum ListOrder { - // Descending numeric per-queue request sequence. - REQUEST_ID_DESC = 0; - // Descending acceptance time, then bytewise descending request ID. - ACCEPTED_AT_DESC = 1; -} - // ListRequest selects a page of retained request summaries for one queue. message ListRequest { // Required configured queue. string queue = 1; - // Ordering for every page. Defaults to request-ID order. - ListOrder order = 2; oneof accepted_lower_bound { - // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. - int64 accepted_at_or_after_ms = 3; + // Inclusive Unix millisecond bound; omitted defaults to zero. + int64 accepted_at_or_after_ms = 2; } oneof accepted_upper_bound { - // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. - int64 accepted_before_ms = 4; + // Exclusive Unix millisecond bound; omitted defaults to server now. + int64 accepted_before_ms = 3; } // Zero selects 50; nonzero values must be between 1 and 200. - int32 page_size = 5; - // Opaque continuation token bound to the queue, order, and resolved time bounds. - string page_token = 6; + int32 page_size = 4; + // Opaque continuation token bound to the queue and resolved time bounds. + string page_token = 5; } -// ListResponse contains a page in the requested order, not a snapshot across pages. +// ListResponse contains a page in acceptance-time order, not a snapshot across pages. message ListResponse { - // Current summaries in the selected order. + // Current summaries ordered by acceptance time descending, then bytewise request ID descending. + // Requests with unknown acceptance time are excluded. repeated RequestSummary requests = 1; // Opaque continuation token; empty when no further row was observed. string next_page_token = 2; - oneof accepted_lower_bound { - // Resolved inclusive Unix millisecond bound; absent in request-ID order. - int64 accepted_at_or_after_ms = 3; - } - oneof accepted_upper_bound { - // Resolved exclusive Unix millisecond bound, fixed across pages; absent in request-ID order. - int64 accepted_before_ms = 4; - } + // Resolved inclusive Unix millisecond bound. + int64 accepted_at_or_after_ms = 3; + // Resolved exclusive Unix millisecond bound, fixed across pages. + int64 accepted_before_ms = 4; } // Stovepipe provides the Stovepipe API. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 869e25448..3852fb4c1 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -36,55 +36,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// ListOrder selects the immutable ordering key for request listing. -type ListOrder int32 - -const ( - // Descending numeric per-queue request sequence. - ListOrder_REQUEST_ID_DESC ListOrder = 0 - // Descending acceptance time, then bytewise descending request ID. - ListOrder_ACCEPTED_AT_DESC ListOrder = 1 -) - -// Enum value maps for ListOrder. -var ( - ListOrder_name = map[int32]string{ - 0: "REQUEST_ID_DESC", - 1: "ACCEPTED_AT_DESC", - } - ListOrder_value = map[string]int32{ - "REQUEST_ID_DESC": 0, - "ACCEPTED_AT_DESC": 1, - } -) - -func (x ListOrder) Enum() *ListOrder { - p := new(ListOrder) - *p = x - return p -} - -func (x ListOrder) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ListOrder) Descriptor() protoreflect.EnumDescriptor { - return file_stovepipe_proto_enumTypes[0].Descriptor() -} - -func (ListOrder) Type() protoreflect.EnumType { - return &file_stovepipe_proto_enumTypes[0] -} - -func (x ListOrder) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ListOrder.Descriptor instead. -func (ListOrder) EnumDescriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{0} -} - // PingRequest is the request for the Ping method type PingRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1117,8 +1068,6 @@ type ListRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Required configured queue. Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` - // Ordering for every page. Defaults to request-ID order. - Order ListOrder `protobuf:"varint,2,opt,name=order,proto3,enum=uber.submitqueue.stovepipe.ListOrder" json:"order,omitempty"` // Types that are valid to be assigned to AcceptedLowerBound: // // *ListRequest_AcceptedAtOrAfterMs @@ -1128,9 +1077,9 @@ type ListRequest struct { // *ListRequest_AcceptedBeforeMs AcceptedUpperBound isListRequest_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` // Zero selects 50; nonzero values must be between 1 and 200. - PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Opaque continuation token bound to the queue, order, and resolved time bounds. - PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Opaque continuation token bound to the queue and resolved time bounds. + PageToken string `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1172,13 +1121,6 @@ func (x *ListRequest) GetQueue() string { return "" } -func (x *ListRequest) GetOrder() ListOrder { - if x != nil { - return x.Order - } - return ListOrder_REQUEST_ID_DESC -} - func (x *ListRequest) GetAcceptedLowerBound() isListRequest_AcceptedLowerBound { if x != nil { return x.AcceptedLowerBound @@ -1230,8 +1172,8 @@ type isListRequest_AcceptedLowerBound interface { } type ListRequest_AcceptedAtOrAfterMs struct { - // Inclusive Unix millisecond bound. Time order only; omitted defaults to zero. - AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` + // Inclusive Unix millisecond bound; omitted defaults to zero. + AcceptedAtOrAfterMs int64 `protobuf:"varint,2,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` } func (*ListRequest_AcceptedAtOrAfterMs) isListRequest_AcceptedLowerBound() {} @@ -1241,29 +1183,26 @@ type isListRequest_AcceptedUpperBound interface { } type ListRequest_AcceptedBeforeMs struct { - // Exclusive Unix millisecond bound. Time order only; omitted defaults to server now. - AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` + // Exclusive Unix millisecond bound; omitted defaults to server now. + AcceptedBeforeMs int64 `protobuf:"varint,3,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` } func (*ListRequest_AcceptedBeforeMs) isListRequest_AcceptedUpperBound() {} -// ListResponse contains a page in the requested order, not a snapshot across pages. +// ListResponse contains a page in acceptance-time order, not a snapshot across pages. type ListResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - // Current summaries in the selected order. + // Current summaries ordered by acceptance time descending, then bytewise request ID descending. + // Requests with unknown acceptance time are excluded. Requests []*RequestSummary `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` // Opaque continuation token; empty when no further row was observed. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - // Types that are valid to be assigned to AcceptedLowerBound: - // - // *ListResponse_AcceptedAtOrAfterMs - AcceptedLowerBound isListResponse_AcceptedLowerBound `protobuf_oneof:"accepted_lower_bound"` - // Types that are valid to be assigned to AcceptedUpperBound: - // - // *ListResponse_AcceptedBeforeMs - AcceptedUpperBound isListResponse_AcceptedUpperBound `protobuf_oneof:"accepted_upper_bound"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Resolved inclusive Unix millisecond bound. + AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3" json:"accepted_at_or_after_ms,omitempty"` + // Resolved exclusive Unix millisecond bound, fixed across pages. + AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3" json:"accepted_before_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListResponse) Reset() { @@ -1310,60 +1249,20 @@ func (x *ListResponse) GetNextPageToken() string { return "" } -func (x *ListResponse) GetAcceptedLowerBound() isListResponse_AcceptedLowerBound { - if x != nil { - return x.AcceptedLowerBound - } - return nil -} - func (x *ListResponse) GetAcceptedAtOrAfterMs() int64 { if x != nil { - if x, ok := x.AcceptedLowerBound.(*ListResponse_AcceptedAtOrAfterMs); ok { - return x.AcceptedAtOrAfterMs - } + return x.AcceptedAtOrAfterMs } return 0 } -func (x *ListResponse) GetAcceptedUpperBound() isListResponse_AcceptedUpperBound { - if x != nil { - return x.AcceptedUpperBound - } - return nil -} - func (x *ListResponse) GetAcceptedBeforeMs() int64 { if x != nil { - if x, ok := x.AcceptedUpperBound.(*ListResponse_AcceptedBeforeMs); ok { - return x.AcceptedBeforeMs - } + return x.AcceptedBeforeMs } return 0 } -type isListResponse_AcceptedLowerBound interface { - isListResponse_AcceptedLowerBound() -} - -type ListResponse_AcceptedAtOrAfterMs struct { - // Resolved inclusive Unix millisecond bound; absent in request-ID order. - AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3,oneof"` -} - -func (*ListResponse_AcceptedAtOrAfterMs) isListResponse_AcceptedLowerBound() {} - -type isListResponse_AcceptedUpperBound interface { - isListResponse_AcceptedUpperBound() -} - -type ListResponse_AcceptedBeforeMs struct { - // Resolved exclusive Unix millisecond bound, fixed across pages; absent in request-ID order. - AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3,oneof"` -} - -func (*ListResponse_AcceptedBeforeMs) isListResponse_AcceptedUpperBound() {} - var File_stovepipe_proto protoreflect.FileDescriptor const file_stovepipe_proto_rawDesc = "" + @@ -1441,27 +1340,21 @@ const file_stovepipe_proto_rawDesc = "" + "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + - "\x0facceptance_time\"\xb4\x02\n" + + "\x0facceptance_time\"\xf7\x01\n" + "\vListRequest\x12\x14\n" + - "\x05queue\x18\x01 \x01(\tR\x05queue\x12;\n" + - "\x05order\x18\x02 \x01(\x0e2%.uber.submitqueue.stovepipe.ListOrderR\x05order\x126\n" + - "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + - "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMs\x12\x1b\n" + - "\tpage_size\x18\x05 \x01(\x05R\bpageSize\x12\x1d\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x126\n" + + "\x17accepted_at_or_after_ms\x18\x02 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + + "\x12accepted_before_ms\x18\x03 \x01(\x03H\x01R\x10acceptedBeforeMs\x12\x1b\n" + + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x1d\n" + "\n" + - "page_token\x18\x06 \x01(\tR\tpageTokenB\x16\n" + + "page_token\x18\x05 \x01(\tR\tpageTokenB\x16\n" + "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound\"\x96\x02\n" + + "\x14accepted_upper_bound\"\xe2\x01\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + - "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x126\n" + - "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + - "\x12accepted_before_ms\x18\x04 \x01(\x03H\x01R\x10acceptedBeforeMsB\x16\n" + - "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound*6\n" + - "\tListOrder\x12\x13\n" + - "\x0fREQUEST_ID_DESC\x10\x00\x12\x14\n" + - "\x10ACCEPTED_AT_DESC\x10\x012\xde\x05\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x124\n" + + "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03R\x13acceptedAtOrAfterMs\x12,\n" + + "\x12accepted_before_ms\x18\x04 \x01(\x03R\x10acceptedBeforeMs2\xde\x05\n" + "\tStovepipe\x12[\n" + "\x04Ping\x12'.uber.submitqueue.stovepipe.PingRequest\x1a(.uber.submitqueue.stovepipe.PingResponse\"\x00\x12a\n" + "\x06Ingest\x12).uber.submitqueue.stovepipe.IngestRequest\x1a*.uber.submitqueue.stovepipe.IngestResponse\"\x00\x12\x8e\x01\n" + @@ -1483,51 +1376,48 @@ func file_stovepipe_proto_rawDescGZIP() []byte { return file_stovepipe_proto_rawDescData } -var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_stovepipe_proto_goTypes = []any{ - (ListOrder)(0), // 0: uber.submitqueue.stovepipe.ListOrder - (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest - (*PingResponse)(nil), // 2: uber.submitqueue.stovepipe.PingResponse - (*IngestRequest)(nil), // 3: uber.submitqueue.stovepipe.IngestRequest - (*IngestResponse)(nil), // 4: uber.submitqueue.stovepipe.IngestResponse - (*GetRequestHistoryByIDRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - (*GetRequestHistoryByURIRequest)(nil), // 6: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - (*HistoryEvent)(nil), // 7: uber.submitqueue.stovepipe.HistoryEvent - (*RequestHistory)(nil), // 8: uber.submitqueue.stovepipe.RequestHistory - (*GetRequestHistoryByIDResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - (*GetRequestHistoryByURIResponse)(nil), // 10: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - (*GetProjectStatusByURIRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - (*ProjectValidation)(nil), // 12: uber.submitqueue.stovepipe.ProjectValidation - (*GetProjectStatusByURIResponse)(nil), // 13: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - (*RequestSummary)(nil), // 14: uber.submitqueue.stovepipe.RequestSummary - (*ListRequest)(nil), // 15: uber.submitqueue.stovepipe.ListRequest - (*ListResponse)(nil), // 16: uber.submitqueue.stovepipe.ListResponse + (*PingRequest)(nil), // 0: uber.submitqueue.stovepipe.PingRequest + (*PingResponse)(nil), // 1: uber.submitqueue.stovepipe.PingResponse + (*IngestRequest)(nil), // 2: uber.submitqueue.stovepipe.IngestRequest + (*IngestResponse)(nil), // 3: uber.submitqueue.stovepipe.IngestResponse + (*GetRequestHistoryByIDRequest)(nil), // 4: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + (*GetRequestHistoryByURIRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + (*HistoryEvent)(nil), // 6: uber.submitqueue.stovepipe.HistoryEvent + (*RequestHistory)(nil), // 7: uber.submitqueue.stovepipe.RequestHistory + (*GetRequestHistoryByIDResponse)(nil), // 8: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + (*GetRequestHistoryByURIResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + (*GetProjectStatusByURIRequest)(nil), // 10: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + (*ProjectValidation)(nil), // 11: uber.submitqueue.stovepipe.ProjectValidation + (*GetProjectStatusByURIResponse)(nil), // 12: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + (*RequestSummary)(nil), // 13: uber.submitqueue.stovepipe.RequestSummary + (*ListRequest)(nil), // 14: uber.submitqueue.stovepipe.ListRequest + (*ListResponse)(nil), // 15: uber.submitqueue.stovepipe.ListResponse } var file_stovepipe_proto_depIdxs = []int32{ - 7, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 7, // 1: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 8, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory - 12, // 3: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 0, // 4: uber.submitqueue.stovepipe.ListRequest.order:type_name -> uber.submitqueue.stovepipe.ListOrder - 14, // 5: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary - 1, // 6: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 3, // 7: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 5, // 8: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 6, // 9: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 11, // 10: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 15, // 11: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest - 2, // 12: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 4, // 13: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 9, // 14: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 10, // 15: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 13, // 16: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 16, // 17: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse - 12, // [12:18] is the sub-list for method output_type - 6, // [6:12] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 6, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 6, // 1: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 7, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory + 11, // 3: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 13, // 4: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 0, // 5: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest + 2, // 6: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest + 4, // 7: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + 5, // 8: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + 10, // 9: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + 14, // 10: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 1, // 11: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse + 3, // 12: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse + 8, // 13: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + 9, // 14: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + 12, // 15: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + 15, // 16: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse + 11, // [11:17] is the sub-list for method output_type + 5, // [5:11] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_stovepipe_proto_init() } @@ -1552,23 +1442,18 @@ func file_stovepipe_proto_init() { (*ListRequest_AcceptedAtOrAfterMs)(nil), (*ListRequest_AcceptedBeforeMs)(nil), } - file_stovepipe_proto_msgTypes[15].OneofWrappers = []any{ - (*ListResponse_AcceptedAtOrAfterMs)(nil), - (*ListResponse_AcceptedBeforeMs)(nil), - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_stovepipe_proto_rawDesc), len(file_stovepipe_proto_rawDesc)), - NumEnums: 1, + NumEnums: 0, NumMessages: 16, NumExtensions: 0, NumServices: 1, }, GoTypes: file_stovepipe_proto_goTypes, DependencyIndexes: file_stovepipe_proto_depIdxs, - EnumInfos: file_stovepipe_proto_enumTypes, MessageInfos: file_stovepipe_proto_msgTypes, }.Build() File_stovepipe_proto = out.File diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index e79a0bd81..a984601b2 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -476,78 +476,75 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4b, 0x6f, 0x1b, 0x55, - 0x14, 0xf6, 0xd8, 0xb5, 0x63, 0x9f, 0x38, 0x4e, 0x7a, 0x13, 0x82, 0x6b, 0x9a, 0x2a, 0x0c, 0x4a, - 0xeb, 0x46, 0xaa, 0x23, 0x82, 0x54, 0x15, 0x90, 0x10, 0x71, 0x62, 0x1a, 0x4b, 0x84, 0x9a, 0x71, - 0xc2, 0x02, 0x16, 0xa3, 0xf1, 0xcc, 0xa9, 0x33, 0x6d, 0xe6, 0x91, 0xb9, 0x77, 0x02, 0xed, 0x9e, - 0x2d, 0x12, 0x1b, 0xfe, 0x04, 0x5b, 0xd8, 0xf3, 0x37, 0xd8, 0xf0, 0x5b, 0xd0, 0x7d, 0xcc, 0xf8, - 0x11, 0x7b, 0xdc, 0x64, 0x01, 0x3b, 0xdf, 0xef, 0x3c, 0xee, 0xbd, 0xdf, 0xf9, 0xee, 0x99, 0x63, - 0x58, 0xa5, 0x2c, 0xb8, 0xc2, 0xd0, 0x0d, 0xb1, 0x15, 0x46, 0x01, 0x0b, 0x48, 0x23, 0x1e, 0x60, - 0xd4, 0xa2, 0xf1, 0xc0, 0x73, 0xd9, 0x65, 0x8c, 0x31, 0xb6, 0x52, 0x0f, 0xfd, 0x11, 0x2c, 0xf7, - 0x5c, 0x7f, 0x68, 0xe0, 0x65, 0x8c, 0x94, 0x91, 0x3a, 0x2c, 0x79, 0x48, 0xa9, 0x35, 0xc4, 0xba, - 0xb6, 0xad, 0x35, 0x2b, 0x46, 0xb2, 0xd4, 0x7f, 0xd6, 0xa0, 0x2a, 0x3d, 0x69, 0x18, 0xf8, 0x14, - 0xe7, 0xbb, 0x92, 0x0f, 0xa1, 0x4a, 0x31, 0xba, 0x72, 0x6d, 0x34, 0x7d, 0xcb, 0xc3, 0x7a, 0x5e, - 0x98, 0x97, 0x15, 0xf6, 0x8d, 0xe5, 0x21, 0xb9, 0x0f, 0x15, 0xe6, 0x7a, 0x48, 0x99, 0xe5, 0x85, - 0xf5, 0xc2, 0xb6, 0xd6, 0x2c, 0x18, 0x23, 0x80, 0x34, 0xa0, 0x7c, 0x1e, 0x50, 0x26, 0x82, 0xef, - 0x88, 0xe0, 0x74, 0xad, 0xef, 0xc0, 0x4a, 0xd7, 0x1f, 0x22, 0x65, 0xc9, 0x91, 0x37, 0xa0, 0x28, - 0x2e, 0xa5, 0x4e, 0x21, 0x17, 0xfa, 0x36, 0xd4, 0x12, 0x37, 0x75, 0xde, 0x1a, 0xe4, 0x5d, 0x47, - 0x39, 0xe5, 0x5d, 0x47, 0xef, 0xc3, 0xfd, 0xe7, 0x98, 0x64, 0x39, 0x76, 0x29, 0x0b, 0xa2, 0x37, - 0xed, 0x37, 0xdd, 0xa3, 0xcc, 0xbc, 0x64, 0x0b, 0x20, 0x92, 0x0e, 0xa6, 0xeb, 0xa8, 0x9b, 0x55, - 0x14, 0xd2, 0x75, 0xf4, 0xe7, 0xb0, 0x35, 0x23, 0xe9, 0x99, 0xd1, 0xcd, 0xce, 0xba, 0x06, 0x85, - 0x38, 0x72, 0x55, 0x3a, 0xfe, 0x53, 0xff, 0x4b, 0x83, 0xaa, 0x8a, 0xef, 0x5c, 0xa1, 0xcf, 0xc8, - 0x3d, 0x28, 0x23, 0xff, 0x61, 0xa6, 0x97, 0x58, 0x12, 0xeb, 0xae, 0xc3, 0xf9, 0x4e, 0xb9, 0x33, - 0x3d, 0x2a, 0xd2, 0x14, 0x8c, 0xe5, 0x14, 0x3b, 0xa1, 0x64, 0x07, 0x56, 0x92, 0x63, 0x53, 0x66, - 0x31, 0x14, 0x9c, 0x57, 0x8e, 0x73, 0x46, 0x55, 0xc1, 0x7d, 0x8e, 0x92, 0x4d, 0x28, 0x8a, 0xa4, - 0x92, 0xf5, 0xe3, 0x9c, 0x21, 0x97, 0x64, 0x07, 0x6a, 0x41, 0xcc, 0xec, 0xc0, 0x43, 0x33, 0x42, - 0x8b, 0x06, 0x7e, 0xbd, 0x28, 0x8e, 0xb0, 0xa2, 0x50, 0x43, 0x80, 0xed, 0x2a, 0x40, 0x60, 0xdb, - 0x71, 0x14, 0xa1, 0x6f, 0xa3, 0x7e, 0x09, 0xb5, 0x49, 0x22, 0xa6, 0xc8, 0xd3, 0xa6, 0xc8, 0x23, - 0x5f, 0x42, 0x49, 0x6c, 0xc7, 0x6f, 0x50, 0x68, 0x2e, 0xef, 0x37, 0x5b, 0xf3, 0x85, 0xdb, 0x1a, - 0x27, 0xc7, 0x50, 0x71, 0xba, 0x35, 0x93, 0x7e, 0x5e, 0x53, 0x25, 0x82, 0xd1, 0x16, 0xda, 0x2d, - 0xb7, 0x78, 0x05, 0x0f, 0xe6, 0x55, 0x58, 0xed, 0x71, 0x0c, 0x95, 0x73, 0x81, 0xbb, 0x98, 0x6c, - 0xb3, 0x9b, 0xb5, 0xcd, 0x64, 0x2e, 0x63, 0x14, 0xac, 0xff, 0xae, 0x09, 0x8d, 0xf6, 0xa2, 0xe0, - 0x15, 0xda, 0xa2, 0x44, 0x31, 0x7d, 0x07, 0x35, 0x6d, 0x01, 0xd8, 0xe7, 0x96, 0x3f, 0x44, 0x73, - 0x24, 0xaa, 0x8a, 0x44, 0xce, 0x22, 0x97, 0xbf, 0xae, 0x50, 0x66, 0xa4, 0xf5, 0xc2, 0x76, 0x81, - 0xbf, 0xae, 0x64, 0x4d, 0x3e, 0x80, 0x4a, 0x68, 0x0d, 0xd1, 0xa4, 0xee, 0x5b, 0xf9, 0xf4, 0x8a, - 0x46, 0x99, 0x03, 0x7d, 0xf7, 0xad, 0xc8, 0x2b, 0x8c, 0x2c, 0x78, 0x8d, 0x89, 0x02, 0x84, 0xfb, - 0x29, 0x07, 0xf4, 0x01, 0xdc, 0x55, 0x27, 0xfd, 0xce, 0xba, 0x70, 0x1d, 0x8b, 0xb9, 0x81, 0xcf, - 0xbb, 0x84, 0x4a, 0x9e, 0xa8, 0x56, 0x2d, 0xc9, 0x63, 0x58, 0x1d, 0x44, 0x68, 0xbd, 0xe6, 0x19, - 0x1d, 0x1c, 0x46, 0x28, 0x1b, 0x85, 0x76, 0x9c, 0x33, 0x6a, 0x89, 0xe1, 0x48, 0xe0, 0xed, 0x32, - 0x94, 0x22, 0xa4, 0xf1, 0x05, 0xd3, 0xff, 0x2e, 0x88, 0x0a, 0xcf, 0x62, 0x44, 0xb1, 0xbf, 0x40, - 0x63, 0x29, 0x63, 0xf9, 0xf9, 0x8c, 0x15, 0xa6, 0x19, 0xbb, 0x07, 0xe5, 0x81, 0x45, 0xa5, 0x51, - 0xf6, 0xa3, 0x25, 0xbe, 0xe6, 0xa6, 0x8f, 0xa6, 0x1f, 0x96, 0xa4, 0x65, 0xf2, 0x59, 0xe9, 0xb0, - 0x12, 0x87, 0x8e, 0xc5, 0xd0, 0x31, 0x2d, 0xc6, 0x5f, 0x28, 0xc8, 0x17, 0xaa, 0xc0, 0x03, 0x76, - 0x42, 0xc9, 0x17, 0xd0, 0x88, 0x30, 0x0c, 0xa8, 0xcb, 0x45, 0x60, 0x4e, 0x33, 0x53, 0x52, 0xcc, - 0xd4, 0x47, 0x3e, 0xed, 0x09, 0x8e, 0xc8, 0x33, 0xa8, 0x2b, 0x66, 0x4d, 0xc9, 0x15, 0x35, 0xed, - 0xc0, 0x0b, 0x2f, 0x90, 0x61, 0x7d, 0x69, 0x5b, 0x6b, 0x96, 0x8d, 0x4d, 0x65, 0x37, 0xa4, 0xf9, - 0x50, 0x59, 0x49, 0x77, 0x4c, 0x0f, 0x65, 0x21, 0xd7, 0x27, 0x59, 0x72, 0xbd, 0x56, 0xe3, 0x31, - 0xf9, 0x3c, 0x84, 0x55, 0x1f, 0x7f, 0x62, 0xe6, 0x98, 0x4c, 0x2a, 0xb2, 0x51, 0x70, 0xb8, 0x97, - 0x48, 0xa5, 0xbd, 0x0e, 0x77, 0xc7, 0x2e, 0xab, 0x6a, 0xfb, 0x67, 0x3e, 0x6d, 0x18, 0xfd, 0xd8, - 0xf3, 0xac, 0xc5, 0x0d, 0xe3, 0x7f, 0x29, 0xe6, 0x13, 0x58, 0x17, 0x46, 0x73, 0xb2, 0xa4, 0x25, - 0x51, 0xd2, 0x35, 0x61, 0x3a, 0x1b, 0xab, 0xeb, 0x43, 0xa8, 0x59, 0xb6, 0x8d, 0xe1, 0xc8, 0x93, - 0x57, 0xa3, 0xc0, 0x5b, 0x6f, 0x82, 0x0b, 0xbf, 0xeb, 0x2d, 0xb6, 0x3c, 0xab, 0xc5, 0xde, 0x85, - 0x55, 0x19, 0x66, 0xf9, 0x36, 0x9a, 0xbc, 0xc5, 0xeb, 0x7f, 0xe4, 0x61, 0xf9, 0x6b, 0x77, 0xc1, - 0x07, 0x91, 0x7c, 0x0e, 0xc5, 0x20, 0x72, 0x30, 0x12, 0x5c, 0xd5, 0xf6, 0x77, 0xb2, 0x4a, 0xcc, - 0xb3, 0xbd, 0xe0, 0xce, 0x86, 0x8c, 0x21, 0x4f, 0xe1, 0xfd, 0xf1, 0x4b, 0x04, 0x91, 0x69, 0xbd, - 0x64, 0x18, 0xf1, 0xdb, 0x14, 0xd4, 0x6d, 0xd6, 0x47, 0xb7, 0x79, 0x11, 0x1d, 0x70, 0xeb, 0x09, - 0x25, 0x2d, 0x20, 0x69, 0xdc, 0x00, 0x5f, 0x06, 0x11, 0xf2, 0x90, 0x3b, 0x22, 0x44, 0x33, 0xd6, - 0x12, 0x5b, 0x5b, 0x98, 0x4e, 0xa6, 0xda, 0x4f, 0x31, 0xb3, 0xfd, 0x94, 0xa6, 0xda, 0x4f, 0x7b, - 0x13, 0x36, 0xd2, 0xbd, 0x2e, 0x82, 0x1f, 0x31, 0x32, 0x07, 0x41, 0xec, 0x3b, 0x13, 0x78, 0x1c, - 0x86, 0x09, 0xae, 0xff, 0x96, 0x87, 0xaa, 0xa4, 0x4d, 0x75, 0x8e, 0xaf, 0xa0, 0xac, 0x0a, 0x7d, - 0x93, 0xb6, 0xad, 0xa4, 0x6a, 0xa4, 0xb1, 0xb3, 0x1e, 0x41, 0x7e, 0xc6, 0x23, 0xf8, 0xaf, 0x48, - 0xbd, 0x29, 0x31, 0xbb, 0x4f, 0xa1, 0x92, 0x0a, 0x80, 0xac, 0xc3, 0xaa, 0xd1, 0xf9, 0xf6, 0xac, - 0xd3, 0x3f, 0x35, 0xbb, 0x47, 0xe6, 0x51, 0xa7, 0x7f, 0xb8, 0x96, 0x23, 0x1b, 0xb0, 0x76, 0x70, - 0x78, 0xd8, 0xe9, 0x9d, 0x76, 0x8e, 0xcc, 0x83, 0x53, 0x89, 0x6a, 0xfb, 0xff, 0x14, 0xa1, 0xd2, - 0x4f, 0xe8, 0x21, 0x3f, 0xc0, 0x1d, 0x3e, 0x2e, 0x92, 0x47, 0x99, 0xbd, 0x64, 0x34, 0x7a, 0x36, - 0x9a, 0x8b, 0x1d, 0x65, 0xa1, 0xf4, 0x1c, 0xb1, 0xa0, 0x24, 0xa7, 0x3b, 0xf2, 0x38, 0x2b, 0x6a, - 0x62, 0x50, 0x6c, 0xec, 0xbe, 0x8b, 0x6b, 0xba, 0xc5, 0x2f, 0x1a, 0xbc, 0x37, 0x73, 0x96, 0x20, - 0xcf, 0xb2, 0xf2, 0x64, 0x8d, 0x94, 0x8d, 0x4f, 0x6f, 0x11, 0x99, 0x1e, 0xe8, 0x57, 0x0d, 0x36, - 0x67, 0x4f, 0x1e, 0xe4, 0xa6, 0x79, 0x47, 0x13, 0x44, 0xe3, 0xb3, 0xdb, 0x84, 0x4e, 0x93, 0x74, - 0xfd, 0x73, 0xbc, 0x90, 0xa4, 0xb9, 0x33, 0xcd, 0x42, 0x92, 0xe6, 0x7f, 0xfb, 0xf5, 0x1c, 0x57, - 0x1d, 0xd7, 0x6e, 0xb6, 0xea, 0xc6, 0x9a, 0x65, 0xb6, 0xea, 0xc6, 0xdb, 0x83, 0x9e, 0x6b, 0x23, - 0x3c, 0xb0, 0x03, 0x2f, 0x23, 0xa0, 0x5d, 0x4b, 0xf5, 0xdf, 0xe3, 0xff, 0xbc, 0x7a, 0xda, 0xf7, - 0x1f, 0x0f, 0x5d, 0x76, 0x1e, 0x0f, 0x5a, 0x76, 0xe0, 0xed, 0xf1, 0xc0, 0xbd, 0xb1, 0xc0, 0x3d, - 0x2b, 0x74, 0xf7, 0xd2, 0xe0, 0x3d, 0xf1, 0x67, 0x2d, 0x1c, 0x0c, 0x4a, 0xe2, 0xc7, 0x27, 0xff, - 0x06, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x8e, 0xb7, 0x93, 0xc8, 0x0d, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcf, 0x73, 0xdb, 0xc4, + 0x17, 0xb7, 0xec, 0xc4, 0xb1, 0x5f, 0x1c, 0x27, 0xd9, 0xf4, 0x9b, 0xaf, 0x6b, 0x9a, 0x4e, 0x10, + 0x93, 0xd6, 0xed, 0x50, 0x67, 0x28, 0x0c, 0x53, 0x38, 0x30, 0xd4, 0x14, 0x6a, 0xcf, 0x10, 0xc8, + 0x28, 0x84, 0x03, 0x1c, 0x34, 0x6b, 0xf9, 0xd5, 0x51, 0x1b, 0x69, 0x15, 0xed, 0x2a, 0xd0, 0xde, + 0xb9, 0x32, 0xc3, 0xdf, 0xc1, 0x99, 0x3b, 0xff, 0x06, 0x17, 0x0e, 0xfc, 0x13, 0x5c, 0x99, 0xfd, + 0x21, 0xf9, 0x47, 0x64, 0xb9, 0x0d, 0x07, 0x6e, 0xda, 0xf7, 0x6b, 0xdf, 0x7e, 0xde, 0xe7, 0xbd, + 0x5d, 0xc1, 0x26, 0x17, 0xec, 0x12, 0x23, 0x3f, 0xc2, 0x6e, 0x14, 0x33, 0xc1, 0x48, 0x3b, 0x19, + 0x62, 0xdc, 0xe5, 0xc9, 0x30, 0xf0, 0xc5, 0x45, 0x82, 0x09, 0x76, 0x33, 0x0b, 0xfb, 0x2e, 0xac, + 0x1f, 0xfb, 0xe1, 0xd8, 0xc1, 0x8b, 0x04, 0xb9, 0x20, 0x2d, 0x58, 0x0b, 0x90, 0x73, 0x3a, 0xc6, + 0x96, 0xb5, 0x6f, 0x75, 0xea, 0x4e, 0xba, 0xb4, 0x7f, 0xb2, 0xa0, 0xa1, 0x2d, 0x79, 0xc4, 0x42, + 0x8e, 0x8b, 0x4d, 0xc9, 0xdb, 0xd0, 0xe0, 0x18, 0x5f, 0xfa, 0x1e, 0xba, 0x21, 0x0d, 0xb0, 0x55, + 0x56, 0xea, 0x75, 0x23, 0xfb, 0x8a, 0x06, 0x48, 0x6e, 0x41, 0x5d, 0xf8, 0x01, 0x72, 0x41, 0x83, + 0xa8, 0x55, 0xd9, 0xb7, 0x3a, 0x15, 0x67, 0x22, 0x20, 0x6d, 0xa8, 0x9d, 0x31, 0x2e, 0x94, 0xf3, + 0x8a, 0x72, 0xce, 0xd6, 0xf6, 0x01, 0x6c, 0x0c, 0xc2, 0x31, 0x72, 0x91, 0xa6, 0x7c, 0x03, 0x56, + 0xd5, 0xa1, 0x4c, 0x16, 0x7a, 0x61, 0xef, 0x43, 0x33, 0x35, 0x33, 0xf9, 0x36, 0xa1, 0xec, 0x8f, + 0x8c, 0x51, 0xd9, 0x1f, 0xd9, 0x27, 0x70, 0xeb, 0x29, 0xa6, 0x51, 0xfa, 0x3e, 0x17, 0x2c, 0x7e, + 0xd9, 0x7b, 0x39, 0x78, 0x52, 0x18, 0x97, 0xec, 0x01, 0xc4, 0xda, 0xc0, 0xf5, 0x47, 0xe6, 0x64, + 0x75, 0x23, 0x19, 0x8c, 0xec, 0xa7, 0xb0, 0x97, 0x13, 0xf4, 0xd4, 0x19, 0x14, 0x47, 0xdd, 0x82, + 0x4a, 0x12, 0xfb, 0x26, 0x9c, 0xfc, 0xb4, 0x7f, 0xb7, 0xa0, 0x61, 0xfc, 0x3f, 0xbf, 0xc4, 0x50, + 0x90, 0x9b, 0x50, 0x43, 0xf9, 0xe1, 0x66, 0x87, 0x58, 0x53, 0xeb, 0xc1, 0x48, 0xe2, 0x9d, 0x61, + 0xe7, 0x06, 0x5c, 0x85, 0xa9, 0x38, 0xeb, 0x99, 0xec, 0x88, 0x93, 0x03, 0xd8, 0x48, 0xd3, 0xe6, + 0x82, 0x0a, 0x54, 0x98, 0xd7, 0xfb, 0x25, 0xa7, 0x61, 0xc4, 0x27, 0x52, 0x4a, 0x76, 0x61, 0x55, + 0x05, 0xd5, 0xa8, 0xf7, 0x4b, 0x8e, 0x5e, 0x92, 0x03, 0x68, 0xb2, 0x44, 0x78, 0x2c, 0x40, 0x37, + 0x46, 0xca, 0x59, 0xd8, 0x5a, 0x55, 0x29, 0x6c, 0x18, 0xa9, 0xa3, 0x84, 0xbd, 0x06, 0x00, 0xf3, + 0xbc, 0x24, 0x8e, 0x31, 0xf4, 0xd0, 0xbe, 0x80, 0xe6, 0x2c, 0x10, 0x73, 0xe0, 0x59, 0x73, 0xe0, + 0x91, 0x4f, 0xa1, 0xaa, 0xb6, 0x93, 0x27, 0xa8, 0x74, 0xd6, 0x1f, 0x76, 0xba, 0x8b, 0x89, 0xdb, + 0x9d, 0x06, 0xc7, 0x31, 0x7e, 0x36, 0xcd, 0x85, 0x5f, 0xd6, 0xd4, 0x90, 0x60, 0xb2, 0x85, 0x75, + 0xcd, 0x2d, 0x9e, 0xc3, 0xed, 0x45, 0x15, 0x36, 0x7b, 0xf4, 0xa1, 0x7e, 0xa6, 0xe4, 0x3e, 0xa6, + 0xdb, 0xdc, 0x2f, 0xda, 0x66, 0x36, 0x96, 0x33, 0x71, 0xb6, 0x7f, 0xb5, 0x14, 0x47, 0x8f, 0x63, + 0xf6, 0x1c, 0x3d, 0x55, 0xa2, 0x84, 0xbf, 0x06, 0x9b, 0xf6, 0x00, 0xbc, 0x33, 0x1a, 0x8e, 0xd1, + 0x9d, 0x90, 0xaa, 0xae, 0x25, 0xa7, 0xb1, 0x2f, 0xbb, 0x2b, 0xd2, 0x11, 0x79, 0xab, 0xb2, 0x5f, + 0x91, 0xdd, 0x95, 0xae, 0xc9, 0x5b, 0x50, 0x8f, 0xe8, 0x18, 0x5d, 0xee, 0xbf, 0xd2, 0xad, 0xb7, + 0xea, 0xd4, 0xa4, 0xe0, 0xc4, 0x7f, 0xa5, 0xe2, 0x2a, 0xa5, 0x60, 0x2f, 0x30, 0x65, 0x80, 0x32, + 0xff, 0x46, 0x0a, 0xec, 0x21, 0x6c, 0x9b, 0x4c, 0xbf, 0xa5, 0xe7, 0xfe, 0x88, 0x0a, 0x9f, 0x85, + 0x72, 0x4a, 0x98, 0xe0, 0x29, 0x6b, 0xcd, 0x92, 0xdc, 0x83, 0xcd, 0x61, 0x8c, 0xf4, 0x85, 0x8c, + 0x38, 0xc2, 0x71, 0x8c, 0x7a, 0x50, 0x58, 0xfd, 0x92, 0xd3, 0x4c, 0x15, 0x4f, 0x94, 0xbc, 0x57, + 0x83, 0x6a, 0x8c, 0x3c, 0x39, 0x17, 0xf6, 0x1f, 0x15, 0x55, 0xe1, 0x3c, 0x44, 0x0c, 0xfa, 0x4b, + 0x38, 0x96, 0x21, 0x56, 0x5e, 0x8c, 0x58, 0x65, 0x1e, 0xb1, 0x9b, 0x50, 0x1b, 0x52, 0xae, 0x95, + 0x7a, 0x1e, 0xad, 0xc9, 0xb5, 0x54, 0xbd, 0x33, 0xdf, 0x58, 0x1a, 0x96, 0xd9, 0xb6, 0xb2, 0x61, + 0x23, 0x89, 0x46, 0x54, 0xe0, 0xc8, 0xa5, 0x42, 0x76, 0x28, 0xe8, 0x0e, 0x35, 0xc2, 0xc7, 0xe2, + 0x88, 0x93, 0x4f, 0xa0, 0x1d, 0x63, 0xc4, 0xb8, 0x2f, 0x49, 0xe0, 0xce, 0x23, 0x53, 0x35, 0xc8, + 0xb4, 0x26, 0x36, 0xbd, 0x19, 0x8c, 0xc8, 0x23, 0x68, 0x19, 0x64, 0x5d, 0x8d, 0x15, 0x77, 0x3d, + 0x16, 0x44, 0xe7, 0x28, 0xb0, 0xb5, 0xb6, 0x6f, 0x75, 0x6a, 0xce, 0xae, 0xd1, 0x3b, 0x5a, 0xfd, + 0x99, 0xd1, 0x92, 0xc1, 0x14, 0x1f, 0x6a, 0x8a, 0xae, 0x0f, 0x8a, 0xe8, 0x7a, 0xa5, 0xc6, 0x53, + 0xf4, 0xb9, 0x03, 0x9b, 0x21, 0xfe, 0x28, 0xdc, 0x29, 0x9a, 0xd4, 0xf5, 0xa0, 0x90, 0xe2, 0xe3, + 0x94, 0x2a, 0xbd, 0x1d, 0xd8, 0x9e, 0x3a, 0xac, 0xa9, 0xed, 0x6f, 0xe5, 0x6c, 0x60, 0x9c, 0x24, + 0x41, 0x40, 0x97, 0x0f, 0x8c, 0xff, 0xa4, 0x98, 0x0f, 0x60, 0x47, 0x29, 0xdd, 0xd9, 0x92, 0x56, + 0x55, 0x49, 0xb7, 0x94, 0xea, 0x74, 0xaa, 0xae, 0x77, 0xa0, 0x49, 0x3d, 0x0f, 0xa3, 0x89, 0xa5, + 0xac, 0x46, 0x45, 0x8e, 0xde, 0x54, 0xae, 0xec, 0xae, 0x8e, 0xd8, 0x5a, 0xde, 0x88, 0xdd, 0x86, + 0x4d, 0xed, 0x46, 0x43, 0x0f, 0x5d, 0x39, 0xe2, 0xed, 0xbf, 0x2d, 0x58, 0xff, 0xd2, 0x5f, 0x72, + 0x21, 0x92, 0x0f, 0xe1, 0xff, 0xd3, 0x79, 0xb0, 0xd8, 0xa5, 0xcf, 0x04, 0xc6, 0xd9, 0x7d, 0xd1, + 0x2f, 0x39, 0x3b, 0x93, 0x84, 0xbe, 0x8e, 0x1f, 0x4b, 0xed, 0x11, 0x27, 0x5d, 0x20, 0x99, 0xdf, + 0x10, 0x9f, 0xb1, 0x18, 0xa5, 0x8b, 0xba, 0xb2, 0xfb, 0x96, 0xb3, 0x95, 0xea, 0x7a, 0x4a, 0x75, + 0xf4, 0xaf, 0x26, 0x48, 0x6f, 0x17, 0x6e, 0x64, 0x7b, 0x9d, 0xb3, 0x1f, 0x30, 0x76, 0x87, 0x2c, + 0x09, 0x47, 0x33, 0xf2, 0x24, 0x8a, 0x52, 0xb9, 0xfd, 0x97, 0x05, 0x0d, 0x7d, 0x72, 0xd3, 0xfc, + 0x5f, 0x40, 0xcd, 0xd4, 0xea, 0x4d, 0x26, 0xaf, 0x61, 0x9b, 0x93, 0xf9, 0xe6, 0xf1, 0xb8, 0x9c, + 0xc3, 0x63, 0xf2, 0xc1, 0x62, 0x50, 0xf5, 0xa3, 0x26, 0x17, 0xd2, 0x77, 0x73, 0x21, 0x5d, 0xd1, + 0x04, 0x9a, 0x07, 0xf4, 0xe1, 0x9f, 0xab, 0x50, 0x3f, 0x49, 0x53, 0x26, 0xdf, 0xc3, 0x8a, 0x7c, + 0x85, 0x91, 0xbb, 0x85, 0x2d, 0x3a, 0x79, 0xd1, 0xb5, 0x3b, 0xcb, 0x0d, 0x35, 0x78, 0x76, 0x89, + 0x50, 0xa8, 0xea, 0x47, 0x13, 0xb9, 0x57, 0xe4, 0x35, 0xf3, 0xfe, 0x6a, 0xdf, 0x7f, 0x1d, 0xd3, + 0x6c, 0x8b, 0x9f, 0x2d, 0xf8, 0x5f, 0xee, 0x15, 0x4d, 0x1e, 0x15, 0xc5, 0x29, 0x7a, 0xa9, 0xb5, + 0x3f, 0xba, 0x86, 0x67, 0x96, 0xd0, 0x2f, 0x16, 0xec, 0xe6, 0x5f, 0xe8, 0xe4, 0x4d, 0xe3, 0x4e, + 0x2e, 0xe6, 0xf6, 0xc7, 0xd7, 0x71, 0x9d, 0x07, 0xe9, 0xea, 0x2d, 0xb7, 0x14, 0xa4, 0x85, 0x4f, + 0x85, 0xa5, 0x20, 0x2d, 0xbe, 0x52, 0xed, 0x92, 0x64, 0x9d, 0xec, 0xb3, 0x62, 0xd6, 0x4d, 0xcd, + 0xa0, 0x62, 0xd6, 0x4d, 0xb7, 0xac, 0x5d, 0xea, 0x21, 0xdc, 0xf6, 0x58, 0x50, 0xe0, 0xd0, 0x6b, + 0x66, 0xfc, 0x3f, 0x96, 0x3f, 0x34, 0xc7, 0xd6, 0x77, 0xef, 0x8d, 0x7d, 0x71, 0x96, 0x0c, 0xbb, + 0x1e, 0x0b, 0x0e, 0xa5, 0xe3, 0xe1, 0x94, 0xe3, 0x21, 0x8d, 0xfc, 0xc3, 0xcc, 0xf9, 0x50, 0xfd, + 0x03, 0x45, 0xc3, 0x61, 0x55, 0x7d, 0xbc, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x85, + 0x0e, 0x1f, 0x1f, 0x0d, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index fefb12de3..3c1e6208a 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -4,27 +4,25 @@ The [protobuf contract](../../../api/stovepipe/proto/stovepipe.proto) is include ## Proposal -`List(ListRequest) -> ListResponse` returns current request summaries for one queue. Default to newest request-ID order; offer acceptance-time order when callers want timestamp selection. This is a request listing, not scheduler position or historical state. +`List(ListRequest) -> ListResponse` returns current request summaries for one queue, newest acceptance time first. This is a request listing, not scheduler position or historical state. ## Contract | Request field | Type | Meaning | | --- | --- | --- | | `queue` | string | Required configured queue. | -| `order` | ListOrder | `REQUEST_ID_DESC = 0` (default) or `ACCEPTED_AT_DESC = 1`. | -| `accepted_at_or_after_ms` | optional int64 | Inclusive lower acceptance-time bound; time order only. | -| `accepted_before_ms` | optional int64 | Exclusive upper acceptance-time bound; time order only. | +| `accepted_at_or_after_ms` | optional int64 | Inclusive lower acceptance-time bound. | +| `accepted_before_ms` | optional int64 | Exclusive upper acceptance-time bound. | | `page_size` | int32 | Default 50; maximum 200. Zero means default. | | `page_token` | string | Empty for the first page; otherwise an opaque continuation. | -The response contains `requests`, `next_page_token`, and, in time mode, the two resolved time bounds. No matches returns an empty page; an empty continuation means no further row was observed. +The response contains `requests`, `next_page_token`, and the two resolved time bounds. No matches returns an empty page; an empty continuation means no further row was observed. -Continuations repeat the same queue and order. Time bounds may be omitted or must match the token; page size may change. Tokens preserve the query bounds and continue exclusively after the last returned ordering key. Invalid inputs and mismatched tokens fail the request. Every page follows the service's queue-access policy. +Continuations repeat the same queue. Time bounds may be omitted or must match the token; page size may change. Tokens preserve the query bounds and continue exclusively after the last returned ordering key. Invalid inputs and mismatched tokens fail the request. Every page follows the service's queue-access policy. ## Ordering and Time Defaults -- `REQUEST_ID_DESC`: descending numeric per-queue request sequence. Includes all retained summaries, even those with unknown acceptance time. No time cutoff; supplied time bounds are invalid. -- `ACCEPTED_AT_DESC`: descending `(accepted_at_ms, request_id)`, with bytewise request-ID ties. Includes only known acceptance times. Request-ID order cannot substitute for this: IDs are allocated before acceptance is recorded, so timestamp order can differ. +Order is descending `(accepted_at_ms, request_id)`, with bytewise descending request IDs only to break timestamp ties. Only requests with known acceptance times are included; numeric request-ID ordering is not offered. All timestamps are Unix milliseconds. Time selection is `lower <= accepted_at_ms < upper`. Omitted lower defaults to `0`; omitted upper defaults to server `now`, sampled once on the first page and retained in the token. Require `0 <= lower < upper`; explicit future bounds are allowed. There is no mandatory window, implicit 24-hour cutoff, or maximum window width. @@ -51,15 +49,12 @@ The domain already defines a typed [RequestState](../../../stovepipe/entity/requ The first six fields already exist in [RequestSummary](../../../stovepipe/entity/request_summary.go). Acceptance time and outcome reason already exist in retained logs but must be added to the summary. Acceptance time is acceptance-log time, not first RPC receipt time. No new producer signal or per-queue counter is needed. -Two bounded access paths are needed: - -- Request-ID listing reads summaries directly. The current string key sorts lexically, not numerically, so it needs an order-preserving primary-key representation and compatible migration. -- Time listing uses an immutable mapping keyed by `(queue, accepted_at_ms, request_id)`, then point-reads the corresponding summaries. This adds one small record per request and bounded extra reads, not another mutable status projection. +Listing uses an immutable mapping keyed by `(queue, accepted_at_ms, request_id)`, then point-reads the corresponding summaries. This adds one small record per request and bounded extra reads, not another mutable status projection. Existing summary keys and public request IDs remain unchanged; no numeric-key migration is needed. The mapping follows the repository's [storage contract](../../../submitqueue/extension/storage/README.md#key-value-contract): a needed alternate lookup is an explicit primary-key mapping, not a SQL secondary-index requirement. Maintain it idempotently after summary persistence and before dependent publication, using existing retries rather than cross-entity transactions. ## Coverage and Scope -Legacy summaries without a verified accepted log retain an absent acceptance time: request-ID mode includes them; time mode excludes them. Complete time-mode coverage begins after compatible writers are enabled; older requests need context and mapping repair. Automatic historical backfill is not part of this proposal. +Older requests without a known acceptance time or time mapping do not appear in List until repaired or backfilled. Compatible writers materialize both for newly accepted requests. Automatic historical backfill is not part of this proposal; incomplete older-history coverage is an accepted limitation. V1 has no fixed retention duration or automatic pruning. State/verdict filters, recently-updated order, totals, scheduler position, and snapshot exports are deferred. Validation details and histories remain separate APIs. From 972a53a8ccf2fe26c4041175a7105d21141927c6 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 19:00:47 +0000 Subject: [PATCH 8/9] refactor(api): use zero for unknown acceptance time --- api/stovepipe/proto/stovepipe.proto | 8 +- api/stovepipe/protopb/stovepipe.pb.go | 42 ++---- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 137 ++++++++++---------- doc/rfc/stovepipe/list-api.md | 8 +- 4 files changed, 83 insertions(+), 112 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index b0bd7cfea..2872a0e8d 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -171,10 +171,8 @@ message RequestSummary { string request_state = 5; // Unix millisecond timestamp of the represented state entry. int64 state_updated_at_ms = 6; - oneof acceptance_time { - // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - int64 accepted_at_ms = 7; - } + // Original retained accepted-log timestamp in Unix milliseconds; positive when known, zero if unknown. + int64 accepted_at_ms = 7; // Stable reason for the represented state. Empty when unavailable or inapplicable. string outcome_reason = 8; } @@ -200,7 +198,7 @@ message ListRequest { // ListResponse contains a page in acceptance-time order, not a snapshot across pages. message ListResponse { // Current summaries ordered by acceptance time descending, then bytewise request ID descending. - // Requests with unknown acceptance time are excluded. + // Requests with accepted_at_ms = 0 (unknown) are excluded. repeated RequestSummary requests = 1; // Opaque continuation token; empty when no further row was observed. string next_page_token = 2; diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 3852fb4c1..49d03363c 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -947,10 +947,8 @@ type RequestSummary struct { RequestState string `protobuf:"bytes,5,opt,name=request_state,json=requestState,proto3" json:"request_state,omitempty"` // Unix millisecond timestamp of the represented state entry. StateUpdatedAtMs int64 `protobuf:"varint,6,opt,name=state_updated_at_ms,json=stateUpdatedAtMs,proto3" json:"state_updated_at_ms,omitempty"` - // Types that are valid to be assigned to AcceptanceTime: - // - // *RequestSummary_AcceptedAtMs - AcceptanceTime isRequestSummary_AcceptanceTime `protobuf_oneof:"acceptance_time"` + // Original retained accepted-log timestamp in Unix milliseconds; positive when known, zero if unknown. + AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3" json:"accepted_at_ms,omitempty"` // Stable reason for the represented state. Empty when unavailable or inapplicable. OutcomeReason string `protobuf:"bytes,8,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` unknownFields protoimpl.UnknownFields @@ -1029,18 +1027,9 @@ func (x *RequestSummary) GetStateUpdatedAtMs() int64 { return 0 } -func (x *RequestSummary) GetAcceptanceTime() isRequestSummary_AcceptanceTime { - if x != nil { - return x.AcceptanceTime - } - return nil -} - func (x *RequestSummary) GetAcceptedAtMs() int64 { if x != nil { - if x, ok := x.AcceptanceTime.(*RequestSummary_AcceptedAtMs); ok { - return x.AcceptedAtMs - } + return x.AcceptedAtMs } return 0 } @@ -1052,17 +1041,6 @@ func (x *RequestSummary) GetOutcomeReason() string { return "" } -type isRequestSummary_AcceptanceTime interface { - isRequestSummary_AcceptanceTime() -} - -type RequestSummary_AcceptedAtMs struct { - // Immutable original accepted-log timestamp in Unix milliseconds; absent if unknown. - AcceptedAtMs int64 `protobuf:"varint,7,opt,name=accepted_at_ms,json=acceptedAtMs,proto3,oneof"` -} - -func (*RequestSummary_AcceptedAtMs) isRequestSummary_AcceptanceTime() {} - // ListRequest selects a page of retained request summaries for one queue. type ListRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1193,7 +1171,7 @@ func (*ListRequest_AcceptedBeforeMs) isListRequest_AcceptedUpperBound() {} type ListResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Current summaries ordered by acceptance time descending, then bytewise request ID descending. - // Requests with unknown acceptance time are excluded. + // Requests with accepted_at_ms = 0 (unknown) are excluded. Requests []*RequestSummary `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` // Opaque continuation token; empty when no further row was observed. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` @@ -1328,7 +1306,7 @@ const file_stovepipe_proto_rawDesc = "" + "\x18project_results_complete\x18\a \x01(\bR\x16projectResultsComplete\x12I\n" + "\bprojects\x18\b \x03(\v2-.uber.submitqueue.stovepipe.ProjectValidationR\bprojects\x12&\n" + "\x0fnext_page_token\x18\t \x01(\tR\rnextPageTokenB\x13\n" + - "\x11repository_result\"\xb5\x02\n" + + "\x11repository_result\"\xa0\x02\n" + "\x0eRequestSummary\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12\x14\n" + @@ -1337,10 +1315,9 @@ const file_stovepipe_proto_rawDesc = "" + "change_uri\x18\x03 \x01(\tR\tchangeUri\x12\x19\n" + "\bbase_uri\x18\x04 \x01(\tR\abaseUri\x12#\n" + "\rrequest_state\x18\x05 \x01(\tR\frequestState\x12-\n" + - "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12&\n" + - "\x0eaccepted_at_ms\x18\a \x01(\x03H\x00R\facceptedAtMs\x12%\n" + - "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReasonB\x11\n" + - "\x0facceptance_time\"\xf7\x01\n" + + "\x13state_updated_at_ms\x18\x06 \x01(\x03R\x10stateUpdatedAtMs\x12$\n" + + "\x0eaccepted_at_ms\x18\a \x01(\x03R\facceptedAtMs\x12%\n" + + "\x0eoutcome_reason\x18\b \x01(\tR\routcomeReason\"\xf7\x01\n" + "\vListRequest\x12\x14\n" + "\x05queue\x18\x01 \x01(\tR\x05queue\x126\n" + "\x17accepted_at_or_after_ms\x18\x02 \x01(\x03H\x00R\x13acceptedAtOrAfterMs\x12.\n" + @@ -1435,9 +1412,6 @@ func file_stovepipe_proto_init() { file_stovepipe_proto_msgTypes[12].OneofWrappers = []any{ (*GetProjectStatusByURIResponse_RepositoryBreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[13].OneofWrappers = []any{ - (*RequestSummary_AcceptedAtMs)(nil), - } file_stovepipe_proto_msgTypes[14].OneofWrappers = []any{ (*ListRequest_AcceptedAtOrAfterMs)(nil), (*ListRequest_AcceptedBeforeMs)(nil), diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index a984601b2..ac2ec5a00 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -476,75 +476,74 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcf, 0x73, 0xdb, 0xc4, - 0x17, 0xb7, 0xec, 0xc4, 0xb1, 0x5f, 0x1c, 0x27, 0xd9, 0xf4, 0x9b, 0xaf, 0x6b, 0x9a, 0x4e, 0x10, - 0x93, 0xd6, 0xed, 0x50, 0x67, 0x28, 0x0c, 0x53, 0x38, 0x30, 0xd4, 0x14, 0x6a, 0xcf, 0x10, 0xc8, - 0x28, 0x84, 0x03, 0x1c, 0x34, 0x6b, 0xf9, 0xd5, 0x51, 0x1b, 0x69, 0x15, 0xed, 0x2a, 0xd0, 0xde, - 0xb9, 0x32, 0xc3, 0xdf, 0xc1, 0x99, 0x3b, 0xff, 0x06, 0x17, 0x0e, 0xfc, 0x13, 0x5c, 0x99, 0xfd, - 0x21, 0xf9, 0x47, 0x64, 0xb9, 0x0d, 0x07, 0x6e, 0xda, 0xf7, 0x6b, 0xdf, 0x7e, 0xde, 0xe7, 0xbd, - 0x5d, 0xc1, 0x26, 0x17, 0xec, 0x12, 0x23, 0x3f, 0xc2, 0x6e, 0x14, 0x33, 0xc1, 0x48, 0x3b, 0x19, - 0x62, 0xdc, 0xe5, 0xc9, 0x30, 0xf0, 0xc5, 0x45, 0x82, 0x09, 0x76, 0x33, 0x0b, 0xfb, 0x2e, 0xac, - 0x1f, 0xfb, 0xe1, 0xd8, 0xc1, 0x8b, 0x04, 0xb9, 0x20, 0x2d, 0x58, 0x0b, 0x90, 0x73, 0x3a, 0xc6, - 0x96, 0xb5, 0x6f, 0x75, 0xea, 0x4e, 0xba, 0xb4, 0x7f, 0xb2, 0xa0, 0xa1, 0x2d, 0x79, 0xc4, 0x42, - 0x8e, 0x8b, 0x4d, 0xc9, 0xdb, 0xd0, 0xe0, 0x18, 0x5f, 0xfa, 0x1e, 0xba, 0x21, 0x0d, 0xb0, 0x55, - 0x56, 0xea, 0x75, 0x23, 0xfb, 0x8a, 0x06, 0x48, 0x6e, 0x41, 0x5d, 0xf8, 0x01, 0x72, 0x41, 0x83, - 0xa8, 0x55, 0xd9, 0xb7, 0x3a, 0x15, 0x67, 0x22, 0x20, 0x6d, 0xa8, 0x9d, 0x31, 0x2e, 0x94, 0xf3, - 0x8a, 0x72, 0xce, 0xd6, 0xf6, 0x01, 0x6c, 0x0c, 0xc2, 0x31, 0x72, 0x91, 0xa6, 0x7c, 0x03, 0x56, - 0xd5, 0xa1, 0x4c, 0x16, 0x7a, 0x61, 0xef, 0x43, 0x33, 0x35, 0x33, 0xf9, 0x36, 0xa1, 0xec, 0x8f, - 0x8c, 0x51, 0xd9, 0x1f, 0xd9, 0x27, 0x70, 0xeb, 0x29, 0xa6, 0x51, 0xfa, 0x3e, 0x17, 0x2c, 0x7e, - 0xd9, 0x7b, 0x39, 0x78, 0x52, 0x18, 0x97, 0xec, 0x01, 0xc4, 0xda, 0xc0, 0xf5, 0x47, 0xe6, 0x64, - 0x75, 0x23, 0x19, 0x8c, 0xec, 0xa7, 0xb0, 0x97, 0x13, 0xf4, 0xd4, 0x19, 0x14, 0x47, 0xdd, 0x82, - 0x4a, 0x12, 0xfb, 0x26, 0x9c, 0xfc, 0xb4, 0x7f, 0xb7, 0xa0, 0x61, 0xfc, 0x3f, 0xbf, 0xc4, 0x50, - 0x90, 0x9b, 0x50, 0x43, 0xf9, 0xe1, 0x66, 0x87, 0x58, 0x53, 0xeb, 0xc1, 0x48, 0xe2, 0x9d, 0x61, - 0xe7, 0x06, 0x5c, 0x85, 0xa9, 0x38, 0xeb, 0x99, 0xec, 0x88, 0x93, 0x03, 0xd8, 0x48, 0xd3, 0xe6, - 0x82, 0x0a, 0x54, 0x98, 0xd7, 0xfb, 0x25, 0xa7, 0x61, 0xc4, 0x27, 0x52, 0x4a, 0x76, 0x61, 0x55, - 0x05, 0xd5, 0xa8, 0xf7, 0x4b, 0x8e, 0x5e, 0x92, 0x03, 0x68, 0xb2, 0x44, 0x78, 0x2c, 0x40, 0x37, - 0x46, 0xca, 0x59, 0xd8, 0x5a, 0x55, 0x29, 0x6c, 0x18, 0xa9, 0xa3, 0x84, 0xbd, 0x06, 0x00, 0xf3, - 0xbc, 0x24, 0x8e, 0x31, 0xf4, 0xd0, 0xbe, 0x80, 0xe6, 0x2c, 0x10, 0x73, 0xe0, 0x59, 0x73, 0xe0, - 0x91, 0x4f, 0xa1, 0xaa, 0xb6, 0x93, 0x27, 0xa8, 0x74, 0xd6, 0x1f, 0x76, 0xba, 0x8b, 0x89, 0xdb, - 0x9d, 0x06, 0xc7, 0x31, 0x7e, 0x36, 0xcd, 0x85, 0x5f, 0xd6, 0xd4, 0x90, 0x60, 0xb2, 0x85, 0x75, - 0xcd, 0x2d, 0x9e, 0xc3, 0xed, 0x45, 0x15, 0x36, 0x7b, 0xf4, 0xa1, 0x7e, 0xa6, 0xe4, 0x3e, 0xa6, - 0xdb, 0xdc, 0x2f, 0xda, 0x66, 0x36, 0x96, 0x33, 0x71, 0xb6, 0x7f, 0xb5, 0x14, 0x47, 0x8f, 0x63, - 0xf6, 0x1c, 0x3d, 0x55, 0xa2, 0x84, 0xbf, 0x06, 0x9b, 0xf6, 0x00, 0xbc, 0x33, 0x1a, 0x8e, 0xd1, - 0x9d, 0x90, 0xaa, 0xae, 0x25, 0xa7, 0xb1, 0x2f, 0xbb, 0x2b, 0xd2, 0x11, 0x79, 0xab, 0xb2, 0x5f, - 0x91, 0xdd, 0x95, 0xae, 0xc9, 0x5b, 0x50, 0x8f, 0xe8, 0x18, 0x5d, 0xee, 0xbf, 0xd2, 0xad, 0xb7, - 0xea, 0xd4, 0xa4, 0xe0, 0xc4, 0x7f, 0xa5, 0xe2, 0x2a, 0xa5, 0x60, 0x2f, 0x30, 0x65, 0x80, 0x32, - 0xff, 0x46, 0x0a, 0xec, 0x21, 0x6c, 0x9b, 0x4c, 0xbf, 0xa5, 0xe7, 0xfe, 0x88, 0x0a, 0x9f, 0x85, - 0x72, 0x4a, 0x98, 0xe0, 0x29, 0x6b, 0xcd, 0x92, 0xdc, 0x83, 0xcd, 0x61, 0x8c, 0xf4, 0x85, 0x8c, - 0x38, 0xc2, 0x71, 0x8c, 0x7a, 0x50, 0x58, 0xfd, 0x92, 0xd3, 0x4c, 0x15, 0x4f, 0x94, 0xbc, 0x57, - 0x83, 0x6a, 0x8c, 0x3c, 0x39, 0x17, 0xf6, 0x1f, 0x15, 0x55, 0xe1, 0x3c, 0x44, 0x0c, 0xfa, 0x4b, - 0x38, 0x96, 0x21, 0x56, 0x5e, 0x8c, 0x58, 0x65, 0x1e, 0xb1, 0x9b, 0x50, 0x1b, 0x52, 0xae, 0x95, - 0x7a, 0x1e, 0xad, 0xc9, 0xb5, 0x54, 0xbd, 0x33, 0xdf, 0x58, 0x1a, 0x96, 0xd9, 0xb6, 0xb2, 0x61, - 0x23, 0x89, 0x46, 0x54, 0xe0, 0xc8, 0xa5, 0x42, 0x76, 0x28, 0xe8, 0x0e, 0x35, 0xc2, 0xc7, 0xe2, - 0x88, 0x93, 0x4f, 0xa0, 0x1d, 0x63, 0xc4, 0xb8, 0x2f, 0x49, 0xe0, 0xce, 0x23, 0x53, 0x35, 0xc8, - 0xb4, 0x26, 0x36, 0xbd, 0x19, 0x8c, 0xc8, 0x23, 0x68, 0x19, 0x64, 0x5d, 0x8d, 0x15, 0x77, 0x3d, - 0x16, 0x44, 0xe7, 0x28, 0xb0, 0xb5, 0xb6, 0x6f, 0x75, 0x6a, 0xce, 0xae, 0xd1, 0x3b, 0x5a, 0xfd, - 0x99, 0xd1, 0x92, 0xc1, 0x14, 0x1f, 0x6a, 0x8a, 0xae, 0x0f, 0x8a, 0xe8, 0x7a, 0xa5, 0xc6, 0x53, - 0xf4, 0xb9, 0x03, 0x9b, 0x21, 0xfe, 0x28, 0xdc, 0x29, 0x9a, 0xd4, 0xf5, 0xa0, 0x90, 0xe2, 0xe3, - 0x94, 0x2a, 0xbd, 0x1d, 0xd8, 0x9e, 0x3a, 0xac, 0xa9, 0xed, 0x6f, 0xe5, 0x6c, 0x60, 0x9c, 0x24, - 0x41, 0x40, 0x97, 0x0f, 0x8c, 0xff, 0xa4, 0x98, 0x0f, 0x60, 0x47, 0x29, 0xdd, 0xd9, 0x92, 0x56, - 0x55, 0x49, 0xb7, 0x94, 0xea, 0x74, 0xaa, 0xae, 0x77, 0xa0, 0x49, 0x3d, 0x0f, 0xa3, 0x89, 0xa5, - 0xac, 0x46, 0x45, 0x8e, 0xde, 0x54, 0xae, 0xec, 0xae, 0x8e, 0xd8, 0x5a, 0xde, 0x88, 0xdd, 0x86, - 0x4d, 0xed, 0x46, 0x43, 0x0f, 0x5d, 0x39, 0xe2, 0xed, 0xbf, 0x2d, 0x58, 0xff, 0xd2, 0x5f, 0x72, - 0x21, 0x92, 0x0f, 0xe1, 0xff, 0xd3, 0x79, 0xb0, 0xd8, 0xa5, 0xcf, 0x04, 0xc6, 0xd9, 0x7d, 0xd1, - 0x2f, 0x39, 0x3b, 0x93, 0x84, 0xbe, 0x8e, 0x1f, 0x4b, 0xed, 0x11, 0x27, 0x5d, 0x20, 0x99, 0xdf, - 0x10, 0x9f, 0xb1, 0x18, 0xa5, 0x8b, 0xba, 0xb2, 0xfb, 0x96, 0xb3, 0x95, 0xea, 0x7a, 0x4a, 0x75, - 0xf4, 0xaf, 0x26, 0x48, 0x6f, 0x17, 0x6e, 0x64, 0x7b, 0x9d, 0xb3, 0x1f, 0x30, 0x76, 0x87, 0x2c, - 0x09, 0x47, 0x33, 0xf2, 0x24, 0x8a, 0x52, 0xb9, 0xfd, 0x97, 0x05, 0x0d, 0x7d, 0x72, 0xd3, 0xfc, - 0x5f, 0x40, 0xcd, 0xd4, 0xea, 0x4d, 0x26, 0xaf, 0x61, 0x9b, 0x93, 0xf9, 0xe6, 0xf1, 0xb8, 0x9c, - 0xc3, 0x63, 0xf2, 0xc1, 0x62, 0x50, 0xf5, 0xa3, 0x26, 0x17, 0xd2, 0x77, 0x73, 0x21, 0x5d, 0xd1, - 0x04, 0x9a, 0x07, 0xf4, 0xe1, 0x9f, 0xab, 0x50, 0x3f, 0x49, 0x53, 0x26, 0xdf, 0xc3, 0x8a, 0x7c, - 0x85, 0x91, 0xbb, 0x85, 0x2d, 0x3a, 0x79, 0xd1, 0xb5, 0x3b, 0xcb, 0x0d, 0x35, 0x78, 0x76, 0x89, - 0x50, 0xa8, 0xea, 0x47, 0x13, 0xb9, 0x57, 0xe4, 0x35, 0xf3, 0xfe, 0x6a, 0xdf, 0x7f, 0x1d, 0xd3, - 0x6c, 0x8b, 0x9f, 0x2d, 0xf8, 0x5f, 0xee, 0x15, 0x4d, 0x1e, 0x15, 0xc5, 0x29, 0x7a, 0xa9, 0xb5, - 0x3f, 0xba, 0x86, 0x67, 0x96, 0xd0, 0x2f, 0x16, 0xec, 0xe6, 0x5f, 0xe8, 0xe4, 0x4d, 0xe3, 0x4e, - 0x2e, 0xe6, 0xf6, 0xc7, 0xd7, 0x71, 0x9d, 0x07, 0xe9, 0xea, 0x2d, 0xb7, 0x14, 0xa4, 0x85, 0x4f, - 0x85, 0xa5, 0x20, 0x2d, 0xbe, 0x52, 0xed, 0x92, 0x64, 0x9d, 0xec, 0xb3, 0x62, 0xd6, 0x4d, 0xcd, - 0xa0, 0x62, 0xd6, 0x4d, 0xb7, 0xac, 0x5d, 0xea, 0x21, 0xdc, 0xf6, 0x58, 0x50, 0xe0, 0xd0, 0x6b, - 0x66, 0xfc, 0x3f, 0x96, 0x3f, 0x34, 0xc7, 0xd6, 0x77, 0xef, 0x8d, 0x7d, 0x71, 0x96, 0x0c, 0xbb, - 0x1e, 0x0b, 0x0e, 0xa5, 0xe3, 0xe1, 0x94, 0xe3, 0x21, 0x8d, 0xfc, 0xc3, 0xcc, 0xf9, 0x50, 0xfd, - 0x03, 0x45, 0xc3, 0x61, 0x55, 0x7d, 0xbc, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x85, - 0x0e, 0x1f, 0x1f, 0x0d, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4f, 0x73, 0xdb, 0x44, + 0x14, 0xb7, 0xec, 0xc4, 0xb1, 0x5f, 0x1c, 0x27, 0xdd, 0x94, 0xe0, 0x9a, 0xa6, 0x13, 0x04, 0xa1, + 0x6e, 0x87, 0x3a, 0x43, 0x61, 0x98, 0xc2, 0x81, 0xa1, 0xa6, 0x50, 0x7b, 0x86, 0x40, 0x46, 0x21, + 0x1c, 0xe0, 0xa0, 0x91, 0xe5, 0x57, 0x47, 0x6d, 0xa4, 0x55, 0x76, 0x57, 0x81, 0xf6, 0xce, 0x95, + 0x19, 0xbe, 0x01, 0x77, 0xbe, 0x04, 0x5f, 0x83, 0x0b, 0x07, 0xbe, 0x04, 0x57, 0x66, 0xff, 0x48, + 0xfe, 0x13, 0x59, 0x6e, 0xc3, 0xa1, 0x37, 0xed, 0xfb, 0xbb, 0xfb, 0x7b, 0xbf, 0xf7, 0x76, 0x05, + 0x9b, 0x5c, 0xd0, 0x0b, 0x8c, 0x83, 0x18, 0xbb, 0x31, 0xa3, 0x82, 0x92, 0x76, 0x32, 0x44, 0xd6, + 0xe5, 0xc9, 0x30, 0x0c, 0xc4, 0x79, 0x82, 0x09, 0x76, 0x33, 0x0b, 0xfb, 0x36, 0xac, 0x1f, 0x05, + 0xd1, 0xd8, 0xc1, 0xf3, 0x04, 0xb9, 0x20, 0x2d, 0x58, 0x0b, 0x91, 0x73, 0x6f, 0x8c, 0x2d, 0x6b, + 0xcf, 0xea, 0xd4, 0x9d, 0x74, 0x69, 0xff, 0x62, 0x41, 0x43, 0x5b, 0xf2, 0x98, 0x46, 0x1c, 0x17, + 0x9b, 0x92, 0xb7, 0xa1, 0xc1, 0x91, 0x5d, 0x04, 0x3e, 0xba, 0x91, 0x17, 0x62, 0xab, 0xac, 0xd4, + 0xeb, 0x46, 0xf6, 0x8d, 0x17, 0x22, 0xb9, 0x09, 0x75, 0x11, 0x84, 0xc8, 0x85, 0x17, 0xc6, 0xad, + 0xca, 0x9e, 0xd5, 0xa9, 0x38, 0x13, 0x01, 0x69, 0x43, 0xed, 0x94, 0x72, 0xa1, 0x9c, 0x57, 0x94, + 0x73, 0xb6, 0xb6, 0xf7, 0x61, 0x63, 0x10, 0x8d, 0x91, 0x8b, 0x74, 0xcb, 0xd7, 0x61, 0x55, 0x1d, + 0xca, 0xec, 0x42, 0x2f, 0xec, 0x3d, 0x68, 0xa6, 0x66, 0x66, 0xbf, 0x4d, 0x28, 0x07, 0x23, 0x63, + 0x54, 0x0e, 0x46, 0xf6, 0x31, 0xdc, 0x7c, 0x8c, 0x69, 0x94, 0x7e, 0xc0, 0x05, 0x65, 0xcf, 0x7b, + 0xcf, 0x07, 0x8f, 0x0a, 0xe3, 0x92, 0x5d, 0x00, 0xa6, 0x0d, 0xdc, 0x60, 0x64, 0x4e, 0x56, 0x37, + 0x92, 0xc1, 0xc8, 0x7e, 0x0c, 0xbb, 0x39, 0x41, 0x4f, 0x9c, 0x41, 0x71, 0xd4, 0x2d, 0xa8, 0x24, + 0x2c, 0x30, 0xe1, 0xe4, 0xa7, 0xfd, 0xa7, 0x05, 0x0d, 0xe3, 0xff, 0xe5, 0x05, 0x46, 0x82, 0xdc, + 0x80, 0x1a, 0xca, 0x0f, 0x37, 0x3b, 0xc4, 0x9a, 0x5a, 0x0f, 0x46, 0x12, 0xef, 0x0c, 0x3b, 0x37, + 0xe4, 0x2a, 0x4c, 0xc5, 0x59, 0xcf, 0x64, 0x87, 0x9c, 0xec, 0xc3, 0x46, 0xba, 0x6d, 0x2e, 0x3c, + 0x81, 0x0a, 0xf3, 0x7a, 0xbf, 0xe4, 0x34, 0x8c, 0xf8, 0x58, 0x4a, 0xc9, 0x0e, 0xac, 0xaa, 0xa0, + 0x1a, 0xf5, 0x7e, 0xc9, 0xd1, 0x4b, 0xb2, 0x0f, 0x4d, 0x9a, 0x08, 0x9f, 0x86, 0xe8, 0x32, 0xf4, + 0x38, 0x8d, 0x5a, 0xab, 0x6a, 0x0b, 0x1b, 0x46, 0xea, 0x28, 0x61, 0xaf, 0x01, 0x40, 0x7d, 0x3f, + 0x61, 0x0c, 0x23, 0x1f, 0xed, 0x73, 0x68, 0xce, 0x02, 0x31, 0x07, 0x9e, 0x35, 0x07, 0x1e, 0xf9, + 0x1c, 0xaa, 0x2a, 0x9d, 0x3c, 0x41, 0xa5, 0xb3, 0x7e, 0xbf, 0xd3, 0x5d, 0x4c, 0xdc, 0xee, 0x34, + 0x38, 0x8e, 0xf1, 0xb3, 0xbd, 0x5c, 0xf8, 0x65, 0x4d, 0x0d, 0x09, 0x26, 0x29, 0xac, 0x2b, 0xa6, + 0x78, 0x0a, 0xb7, 0x16, 0x55, 0xd8, 0xe4, 0xe8, 0x43, 0xfd, 0x54, 0xc9, 0x03, 0x4c, 0xd3, 0xdc, + 0x2d, 0x4a, 0x33, 0x1b, 0xcb, 0x99, 0x38, 0xdb, 0x7f, 0x58, 0x8a, 0xa3, 0x47, 0x8c, 0x3e, 0x45, + 0x5f, 0x95, 0x28, 0xe1, 0x2f, 0xc1, 0xa6, 0x5d, 0x00, 0xff, 0xd4, 0x8b, 0xc6, 0xe8, 0x4e, 0x48, + 0x55, 0xd7, 0x92, 0x13, 0x16, 0xc8, 0xee, 0x8a, 0x75, 0x44, 0xde, 0xaa, 0xec, 0x55, 0x64, 0x77, + 0xa5, 0x6b, 0xf2, 0x16, 0xd4, 0x63, 0x6f, 0x8c, 0x2e, 0x0f, 0x5e, 0xe8, 0xd6, 0x5b, 0x75, 0x6a, + 0x52, 0x70, 0x1c, 0xbc, 0x50, 0x71, 0x95, 0x52, 0xd0, 0x67, 0x98, 0x32, 0x40, 0x99, 0x7f, 0x27, + 0x05, 0xf6, 0x10, 0xae, 0x99, 0x9d, 0x7e, 0xef, 0x9d, 0x05, 0x23, 0x4f, 0x04, 0x34, 0x92, 0x53, + 0xc2, 0x04, 0x4f, 0x59, 0x6b, 0x96, 0xe4, 0x0e, 0x6c, 0x0e, 0x19, 0x7a, 0xcf, 0x64, 0xc4, 0x11, + 0x8e, 0x19, 0xea, 0x41, 0x61, 0xf5, 0x4b, 0x4e, 0x33, 0x55, 0x3c, 0x52, 0xf2, 0x5e, 0x0d, 0xaa, + 0x0c, 0x79, 0x72, 0x26, 0xec, 0xbf, 0x2a, 0xaa, 0xc2, 0x79, 0x88, 0x18, 0xf4, 0x97, 0x70, 0x2c, + 0x43, 0xac, 0xbc, 0x18, 0xb1, 0xca, 0x3c, 0x62, 0x37, 0xa0, 0x36, 0xf4, 0xb8, 0x56, 0xea, 0x79, + 0xb4, 0x26, 0xd7, 0x52, 0xf5, 0xce, 0x7c, 0x63, 0x69, 0x58, 0x66, 0xdb, 0xca, 0x86, 0x8d, 0x24, + 0x1e, 0x79, 0x02, 0x47, 0xae, 0x27, 0x64, 0x87, 0x82, 0xee, 0x50, 0x23, 0x7c, 0x28, 0x0e, 0x39, + 0xf9, 0x0c, 0xda, 0x0c, 0x63, 0xca, 0x03, 0x49, 0x02, 0x77, 0x1e, 0x99, 0xaa, 0x41, 0xa6, 0x35, + 0xb1, 0xe9, 0xcd, 0x60, 0x44, 0x1e, 0x40, 0xcb, 0x20, 0xeb, 0x6a, 0xac, 0xb8, 0xeb, 0xd3, 0x30, + 0x3e, 0x43, 0x81, 0xad, 0xb5, 0x3d, 0xab, 0x53, 0x73, 0x76, 0x8c, 0xde, 0xd1, 0xea, 0x2f, 0x8c, + 0x96, 0x0c, 0xa6, 0xf8, 0x50, 0x53, 0x74, 0xbd, 0x57, 0x44, 0xd7, 0x4b, 0x35, 0x9e, 0xa2, 0xcf, + 0x7b, 0xb0, 0x19, 0xe1, 0xcf, 0xc2, 0x9d, 0xa2, 0x49, 0x5d, 0x0f, 0x0a, 0x29, 0x3e, 0x4a, 0xa9, + 0xd2, 0xdb, 0x86, 0x6b, 0x53, 0x87, 0x35, 0xb5, 0xfd, 0xbd, 0x9c, 0x0d, 0x8c, 0xe3, 0x24, 0x0c, + 0xbd, 0xe5, 0x03, 0xe3, 0xb5, 0x14, 0xf3, 0x1e, 0x6c, 0x2b, 0xa5, 0x3b, 0x5b, 0xd2, 0xaa, 0x2a, + 0xe9, 0x96, 0x52, 0x9d, 0x4c, 0xd5, 0xf5, 0x5d, 0x68, 0x7a, 0xbe, 0x8f, 0xf1, 0xc4, 0x72, 0x4d, + 0x59, 0x36, 0x52, 0xa9, 0xb2, 0xba, 0x3c, 0x60, 0x6b, 0x39, 0x03, 0xd6, 0xfe, 0xd7, 0x82, 0xf5, + 0xaf, 0x83, 0x25, 0x77, 0x1f, 0xf9, 0x18, 0xde, 0x9c, 0x4e, 0x49, 0x99, 0xeb, 0x3d, 0x11, 0xc8, + 0xb2, 0xab, 0xa1, 0x5f, 0x72, 0xb6, 0x27, 0xd9, 0xbf, 0x65, 0x0f, 0xa5, 0xf6, 0x90, 0x93, 0x2e, + 0x90, 0xcc, 0x6f, 0x88, 0x4f, 0x28, 0x43, 0xe9, 0xa2, 0x6e, 0xe7, 0xbe, 0xe5, 0x6c, 0xa5, 0xba, + 0x9e, 0x52, 0x1d, 0xfe, 0xaf, 0x61, 0xd1, 0xdb, 0x81, 0xeb, 0x59, 0xae, 0x33, 0xfa, 0x13, 0x32, + 0x77, 0x48, 0x93, 0x68, 0x34, 0x23, 0x4f, 0xe2, 0x38, 0x95, 0xdb, 0xff, 0x58, 0xd0, 0xd0, 0x27, + 0x37, 0x7d, 0xfe, 0x15, 0xd4, 0x4c, 0x59, 0x5e, 0x65, 0xc8, 0x1a, 0x62, 0x39, 0x99, 0x6f, 0x1e, + 0x65, 0xcb, 0x39, 0x94, 0x25, 0x1f, 0x2d, 0x06, 0x55, 0xbf, 0x5f, 0x72, 0x21, 0x7d, 0x3f, 0x17, + 0xd2, 0x15, 0xcd, 0x95, 0x79, 0x40, 0xef, 0xff, 0xbd, 0x0a, 0xf5, 0xe3, 0x74, 0xcb, 0xe4, 0x47, + 0x58, 0x91, 0x0f, 0x2e, 0x72, 0xbb, 0xb0, 0x1b, 0x27, 0x8f, 0xb7, 0x76, 0x67, 0xb9, 0xa1, 0x06, + 0xcf, 0x2e, 0x11, 0x0f, 0xaa, 0xfa, 0x7d, 0x44, 0xee, 0x14, 0x79, 0xcd, 0x3c, 0xb5, 0xda, 0x77, + 0x5f, 0xc6, 0x34, 0x4b, 0xf1, 0xab, 0x05, 0x6f, 0xe4, 0xde, 0xc6, 0xe4, 0x41, 0x51, 0x9c, 0xa2, + 0x47, 0x59, 0xfb, 0x93, 0x2b, 0x78, 0x66, 0x1b, 0xfa, 0xcd, 0x82, 0x9d, 0xfc, 0xbb, 0x9b, 0xbc, + 0x6a, 0xdc, 0xc9, 0x1d, 0xdc, 0xfe, 0xf4, 0x2a, 0xae, 0xf3, 0x20, 0x5d, 0xbe, 0xd0, 0x96, 0x82, + 0xb4, 0xf0, 0x55, 0xb0, 0x14, 0xa4, 0xc5, 0xb7, 0xa7, 0x5d, 0x92, 0xac, 0x93, 0x7d, 0x56, 0xcc, + 0xba, 0xa9, 0x19, 0x54, 0xcc, 0xba, 0xe9, 0x96, 0xb5, 0x4b, 0x3d, 0x84, 0x5b, 0x3e, 0x0d, 0x0b, + 0x1c, 0x7a, 0xcd, 0x8c, 0xff, 0x47, 0xf2, 0xdf, 0xe5, 0xc8, 0xfa, 0xe1, 0x83, 0x71, 0x20, 0x4e, + 0x93, 0x61, 0xd7, 0xa7, 0xe1, 0x81, 0x74, 0x3c, 0x98, 0x72, 0x3c, 0xf0, 0xe2, 0xe0, 0x20, 0x73, + 0x3e, 0x50, 0xbf, 0x3b, 0xf1, 0x70, 0x58, 0x55, 0x1f, 0x1f, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, + 0x09, 0x10, 0x5e, 0x89, 0x0a, 0x0d, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index 3c1e6208a..d2fa4269e 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -22,7 +22,7 @@ Continuations repeat the same queue. Time bounds may be omitted or must match th ## Ordering and Time Defaults -Order is descending `(accepted_at_ms, request_id)`, with bytewise descending request IDs only to break timestamp ties. Only requests with known acceptance times are included; numeric request-ID ordering is not offered. +Order is descending `(accepted_at_ms, request_id)`, with bytewise descending request IDs only to break timestamp ties. Only requests with `accepted_at_ms > 0` are included; `0` means unknown. Numeric request-ID ordering is not offered. All timestamps are Unix milliseconds. Time selection is `lower <= accepted_at_ms < upper`. Omitted lower defaults to `0`; omitted upper defaults to server `now`, sampled once on the first page and retained in the token. Require `0 <= lower < upper`; explicit future bounds are allowed. There is no mandatory window, implicit 24-hour cutoff, or maximum window width. @@ -40,7 +40,7 @@ This is the wire representation of the existing domain `RequestSummary`, not ano | `base_uri` | string | Selected baseline; empty before selection or for a full build. | | `request_state` | string | Current lifecycle state: `accepted`, `processing`, `superseded`, `succeeded`, `failed`, or `cancelled`. | | `state_updated_at_ms` | int64 | Timestamp of the represented state entry. | -| `accepted_at_ms` | optional int64 | Immutable timestamp of the original retained accepted entry. | +| `accepted_at_ms` | int64 | Timestamp of the original retained accepted entry; `0` means unknown, otherwise positive and immutable. | | `outcome_reason` | string | Reason for the represented state; empty when unavailable or inapplicable. | The domain already defines a typed [RequestState](../../../stovepipe/entity/request.go). The wire field remains a string to match existing status/history APIs. States and reasons use the existing [public vocabulary](request-log.md#outcome-reasons); clients tolerate future values. Duplicate Ingest calls resolving to the same request produce one row. @@ -49,12 +49,12 @@ The domain already defines a typed [RequestState](../../../stovepipe/entity/requ The first six fields already exist in [RequestSummary](../../../stovepipe/entity/request_summary.go). Acceptance time and outcome reason already exist in retained logs but must be added to the summary. Acceptance time is acceptance-log time, not first RPC receipt time. No new producer signal or per-queue counter is needed. -Listing uses an immutable mapping keyed by `(queue, accepted_at_ms, request_id)`, then point-reads the corresponding summaries. This adds one small record per request and bounded extra reads, not another mutable status projection. Existing summary keys and public request IDs remain unchanged; no numeric-key migration is needed. +Listing uses an immutable mapping keyed by `(queue, accepted_at_ms, request_id)` for known positive acceptance times, then point-reads the corresponding summaries. This adds one small record per request and bounded extra reads, not another mutable status projection. Existing summary keys and public request IDs remain unchanged; no numeric-key migration is needed. The mapping follows the repository's [storage contract](../../../submitqueue/extension/storage/README.md#key-value-contract): a needed alternate lookup is an explicit primary-key mapping, not a SQL secondary-index requirement. Maintain it idempotently after summary persistence and before dependent publication, using existing retries rather than cross-entity transactions. ## Coverage and Scope -Older requests without a known acceptance time or time mapping do not appear in List until repaired or backfilled. Compatible writers materialize both for newly accepted requests. Automatic historical backfill is not part of this proposal; incomplete older-history coverage is an accepted limitation. +Older requests with `accepted_at_ms = 0` or without a time mapping do not appear in List until repaired or backfilled. Compatible writers materialize both for newly accepted requests. Automatic historical backfill is not part of this proposal; incomplete older-history coverage is an accepted limitation. V1 has no fixed retention duration or automatic pruning. State/verdict filters, recently-updated order, totals, scheduler position, and snapshot exports are deferred. Validation details and histories remain separate APIs. From 20ef0aa2c016aa7e16a7db3e20d0bdcc921224cc Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Mon, 5 Oct 2026 19:10:07 +0000 Subject: [PATCH 9/9] refactor(api): omit resolved bounds from List response --- api/stovepipe/proto/stovepipe.proto | 4 - api/stovepipe/protopb/stovepipe.pb.go | 28 +---- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 133 ++++++++++---------- doc/rfc/stovepipe/list-api.md | 2 +- 4 files changed, 71 insertions(+), 96 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 2872a0e8d..6c6ca2b73 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -202,10 +202,6 @@ message ListResponse { repeated RequestSummary requests = 1; // Opaque continuation token; empty when no further row was observed. string next_page_token = 2; - // Resolved inclusive Unix millisecond bound. - int64 accepted_at_or_after_ms = 3; - // Resolved exclusive Unix millisecond bound, fixed across pages. - int64 accepted_before_ms = 4; } // Stovepipe provides the Stovepipe API. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 49d03363c..5ff9013ce 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1175,12 +1175,8 @@ type ListResponse struct { Requests []*RequestSummary `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` // Opaque continuation token; empty when no further row was observed. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - // Resolved inclusive Unix millisecond bound. - AcceptedAtOrAfterMs int64 `protobuf:"varint,3,opt,name=accepted_at_or_after_ms,json=acceptedAtOrAfterMs,proto3" json:"accepted_at_or_after_ms,omitempty"` - // Resolved exclusive Unix millisecond bound, fixed across pages. - AcceptedBeforeMs int64 `protobuf:"varint,4,opt,name=accepted_before_ms,json=acceptedBeforeMs,proto3" json:"accepted_before_ms,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListResponse) Reset() { @@ -1227,20 +1223,6 @@ func (x *ListResponse) GetNextPageToken() string { return "" } -func (x *ListResponse) GetAcceptedAtOrAfterMs() int64 { - if x != nil { - return x.AcceptedAtOrAfterMs - } - return 0 -} - -func (x *ListResponse) GetAcceptedBeforeMs() int64 { - if x != nil { - return x.AcceptedBeforeMs - } - return 0 -} - var File_stovepipe_proto protoreflect.FileDescriptor const file_stovepipe_proto_rawDesc = "" + @@ -1326,12 +1308,10 @@ const file_stovepipe_proto_rawDesc = "" + "\n" + "page_token\x18\x05 \x01(\tR\tpageTokenB\x16\n" + "\x14accepted_lower_boundB\x16\n" + - "\x14accepted_upper_bound\"\xe2\x01\n" + + "\x14accepted_upper_bound\"~\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + - "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x124\n" + - "\x17accepted_at_or_after_ms\x18\x03 \x01(\x03R\x13acceptedAtOrAfterMs\x12,\n" + - "\x12accepted_before_ms\x18\x04 \x01(\x03R\x10acceptedBeforeMs2\xde\x05\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken2\xde\x05\n" + "\tStovepipe\x12[\n" + "\x04Ping\x12'.uber.submitqueue.stovepipe.PingRequest\x1a(.uber.submitqueue.stovepipe.PingResponse\"\x00\x12a\n" + "\x06Ingest\x12).uber.submitqueue.stovepipe.IngestRequest\x1a*.uber.submitqueue.stovepipe.IngestResponse\"\x00\x12\x8e\x01\n" + diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index ac2ec5a00..b55bcac99 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -477,73 +477,72 @@ var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x4f, 0x73, 0xdb, 0x44, - 0x14, 0xb7, 0xec, 0xc4, 0xb1, 0x5f, 0x1c, 0x27, 0xdd, 0x94, 0xe0, 0x9a, 0xa6, 0x13, 0x04, 0xa1, - 0x6e, 0x87, 0x3a, 0x43, 0x61, 0x98, 0xc2, 0x81, 0xa1, 0xa6, 0x50, 0x7b, 0x86, 0x40, 0x46, 0x21, - 0x1c, 0xe0, 0xa0, 0x91, 0xe5, 0x57, 0x47, 0x6d, 0xa4, 0x55, 0x76, 0x57, 0x81, 0xf6, 0xce, 0x95, - 0x19, 0xbe, 0x01, 0x77, 0xbe, 0x04, 0x5f, 0x83, 0x0b, 0x07, 0xbe, 0x04, 0x57, 0x66, 0xff, 0x48, - 0xfe, 0x13, 0x59, 0x6e, 0xc3, 0xa1, 0x37, 0xed, 0xfb, 0xbb, 0xfb, 0x7b, 0xbf, 0xf7, 0x76, 0x05, - 0x9b, 0x5c, 0xd0, 0x0b, 0x8c, 0x83, 0x18, 0xbb, 0x31, 0xa3, 0x82, 0x92, 0x76, 0x32, 0x44, 0xd6, - 0xe5, 0xc9, 0x30, 0x0c, 0xc4, 0x79, 0x82, 0x09, 0x76, 0x33, 0x0b, 0xfb, 0x36, 0xac, 0x1f, 0x05, - 0xd1, 0xd8, 0xc1, 0xf3, 0x04, 0xb9, 0x20, 0x2d, 0x58, 0x0b, 0x91, 0x73, 0x6f, 0x8c, 0x2d, 0x6b, - 0xcf, 0xea, 0xd4, 0x9d, 0x74, 0x69, 0xff, 0x62, 0x41, 0x43, 0x5b, 0xf2, 0x98, 0x46, 0x1c, 0x17, - 0x9b, 0x92, 0xb7, 0xa1, 0xc1, 0x91, 0x5d, 0x04, 0x3e, 0xba, 0x91, 0x17, 0x62, 0xab, 0xac, 0xd4, - 0xeb, 0x46, 0xf6, 0x8d, 0x17, 0x22, 0xb9, 0x09, 0x75, 0x11, 0x84, 0xc8, 0x85, 0x17, 0xc6, 0xad, - 0xca, 0x9e, 0xd5, 0xa9, 0x38, 0x13, 0x01, 0x69, 0x43, 0xed, 0x94, 0x72, 0xa1, 0x9c, 0x57, 0x94, - 0x73, 0xb6, 0xb6, 0xf7, 0x61, 0x63, 0x10, 0x8d, 0x91, 0x8b, 0x74, 0xcb, 0xd7, 0x61, 0x55, 0x1d, - 0xca, 0xec, 0x42, 0x2f, 0xec, 0x3d, 0x68, 0xa6, 0x66, 0x66, 0xbf, 0x4d, 0x28, 0x07, 0x23, 0x63, - 0x54, 0x0e, 0x46, 0xf6, 0x31, 0xdc, 0x7c, 0x8c, 0x69, 0x94, 0x7e, 0xc0, 0x05, 0x65, 0xcf, 0x7b, - 0xcf, 0x07, 0x8f, 0x0a, 0xe3, 0x92, 0x5d, 0x00, 0xa6, 0x0d, 0xdc, 0x60, 0x64, 0x4e, 0x56, 0x37, - 0x92, 0xc1, 0xc8, 0x7e, 0x0c, 0xbb, 0x39, 0x41, 0x4f, 0x9c, 0x41, 0x71, 0xd4, 0x2d, 0xa8, 0x24, - 0x2c, 0x30, 0xe1, 0xe4, 0xa7, 0xfd, 0xa7, 0x05, 0x0d, 0xe3, 0xff, 0xe5, 0x05, 0x46, 0x82, 0xdc, - 0x80, 0x1a, 0xca, 0x0f, 0x37, 0x3b, 0xc4, 0x9a, 0x5a, 0x0f, 0x46, 0x12, 0xef, 0x0c, 0x3b, 0x37, - 0xe4, 0x2a, 0x4c, 0xc5, 0x59, 0xcf, 0x64, 0x87, 0x9c, 0xec, 0xc3, 0x46, 0xba, 0x6d, 0x2e, 0x3c, - 0x81, 0x0a, 0xf3, 0x7a, 0xbf, 0xe4, 0x34, 0x8c, 0xf8, 0x58, 0x4a, 0xc9, 0x0e, 0xac, 0xaa, 0xa0, - 0x1a, 0xf5, 0x7e, 0xc9, 0xd1, 0x4b, 0xb2, 0x0f, 0x4d, 0x9a, 0x08, 0x9f, 0x86, 0xe8, 0x32, 0xf4, - 0x38, 0x8d, 0x5a, 0xab, 0x6a, 0x0b, 0x1b, 0x46, 0xea, 0x28, 0x61, 0xaf, 0x01, 0x40, 0x7d, 0x3f, - 0x61, 0x0c, 0x23, 0x1f, 0xed, 0x73, 0x68, 0xce, 0x02, 0x31, 0x07, 0x9e, 0x35, 0x07, 0x1e, 0xf9, - 0x1c, 0xaa, 0x2a, 0x9d, 0x3c, 0x41, 0xa5, 0xb3, 0x7e, 0xbf, 0xd3, 0x5d, 0x4c, 0xdc, 0xee, 0x34, - 0x38, 0x8e, 0xf1, 0xb3, 0xbd, 0x5c, 0xf8, 0x65, 0x4d, 0x0d, 0x09, 0x26, 0x29, 0xac, 0x2b, 0xa6, - 0x78, 0x0a, 0xb7, 0x16, 0x55, 0xd8, 0xe4, 0xe8, 0x43, 0xfd, 0x54, 0xc9, 0x03, 0x4c, 0xd3, 0xdc, - 0x2d, 0x4a, 0x33, 0x1b, 0xcb, 0x99, 0x38, 0xdb, 0x7f, 0x58, 0x8a, 0xa3, 0x47, 0x8c, 0x3e, 0x45, - 0x5f, 0x95, 0x28, 0xe1, 0x2f, 0xc1, 0xa6, 0x5d, 0x00, 0xff, 0xd4, 0x8b, 0xc6, 0xe8, 0x4e, 0x48, - 0x55, 0xd7, 0x92, 0x13, 0x16, 0xc8, 0xee, 0x8a, 0x75, 0x44, 0xde, 0xaa, 0xec, 0x55, 0x64, 0x77, - 0xa5, 0x6b, 0xf2, 0x16, 0xd4, 0x63, 0x6f, 0x8c, 0x2e, 0x0f, 0x5e, 0xe8, 0xd6, 0x5b, 0x75, 0x6a, - 0x52, 0x70, 0x1c, 0xbc, 0x50, 0x71, 0x95, 0x52, 0xd0, 0x67, 0x98, 0x32, 0x40, 0x99, 0x7f, 0x27, - 0x05, 0xf6, 0x10, 0xae, 0x99, 0x9d, 0x7e, 0xef, 0x9d, 0x05, 0x23, 0x4f, 0x04, 0x34, 0x92, 0x53, - 0xc2, 0x04, 0x4f, 0x59, 0x6b, 0x96, 0xe4, 0x0e, 0x6c, 0x0e, 0x19, 0x7a, 0xcf, 0x64, 0xc4, 0x11, - 0x8e, 0x19, 0xea, 0x41, 0x61, 0xf5, 0x4b, 0x4e, 0x33, 0x55, 0x3c, 0x52, 0xf2, 0x5e, 0x0d, 0xaa, - 0x0c, 0x79, 0x72, 0x26, 0xec, 0xbf, 0x2a, 0xaa, 0xc2, 0x79, 0x88, 0x18, 0xf4, 0x97, 0x70, 0x2c, - 0x43, 0xac, 0xbc, 0x18, 0xb1, 0xca, 0x3c, 0x62, 0x37, 0xa0, 0x36, 0xf4, 0xb8, 0x56, 0xea, 0x79, - 0xb4, 0x26, 0xd7, 0x52, 0xf5, 0xce, 0x7c, 0x63, 0x69, 0x58, 0x66, 0xdb, 0xca, 0x86, 0x8d, 0x24, - 0x1e, 0x79, 0x02, 0x47, 0xae, 0x27, 0x64, 0x87, 0x82, 0xee, 0x50, 0x23, 0x7c, 0x28, 0x0e, 0x39, - 0xf9, 0x0c, 0xda, 0x0c, 0x63, 0xca, 0x03, 0x49, 0x02, 0x77, 0x1e, 0x99, 0xaa, 0x41, 0xa6, 0x35, - 0xb1, 0xe9, 0xcd, 0x60, 0x44, 0x1e, 0x40, 0xcb, 0x20, 0xeb, 0x6a, 0xac, 0xb8, 0xeb, 0xd3, 0x30, - 0x3e, 0x43, 0x81, 0xad, 0xb5, 0x3d, 0xab, 0x53, 0x73, 0x76, 0x8c, 0xde, 0xd1, 0xea, 0x2f, 0x8c, - 0x96, 0x0c, 0xa6, 0xf8, 0x50, 0x53, 0x74, 0xbd, 0x57, 0x44, 0xd7, 0x4b, 0x35, 0x9e, 0xa2, 0xcf, - 0x7b, 0xb0, 0x19, 0xe1, 0xcf, 0xc2, 0x9d, 0xa2, 0x49, 0x5d, 0x0f, 0x0a, 0x29, 0x3e, 0x4a, 0xa9, - 0xd2, 0xdb, 0x86, 0x6b, 0x53, 0x87, 0x35, 0xb5, 0xfd, 0xbd, 0x9c, 0x0d, 0x8c, 0xe3, 0x24, 0x0c, - 0xbd, 0xe5, 0x03, 0xe3, 0xb5, 0x14, 0xf3, 0x1e, 0x6c, 0x2b, 0xa5, 0x3b, 0x5b, 0xd2, 0xaa, 0x2a, - 0xe9, 0x96, 0x52, 0x9d, 0x4c, 0xd5, 0xf5, 0x5d, 0x68, 0x7a, 0xbe, 0x8f, 0xf1, 0xc4, 0x72, 0x4d, - 0x59, 0x36, 0x52, 0xa9, 0xb2, 0xba, 0x3c, 0x60, 0x6b, 0x39, 0x03, 0xd6, 0xfe, 0xd7, 0x82, 0xf5, - 0xaf, 0x83, 0x25, 0x77, 0x1f, 0xf9, 0x18, 0xde, 0x9c, 0x4e, 0x49, 0x99, 0xeb, 0x3d, 0x11, 0xc8, - 0xb2, 0xab, 0xa1, 0x5f, 0x72, 0xb6, 0x27, 0xd9, 0xbf, 0x65, 0x0f, 0xa5, 0xf6, 0x90, 0x93, 0x2e, - 0x90, 0xcc, 0x6f, 0x88, 0x4f, 0x28, 0x43, 0xe9, 0xa2, 0x6e, 0xe7, 0xbe, 0xe5, 0x6c, 0xa5, 0xba, - 0x9e, 0x52, 0x1d, 0xfe, 0xaf, 0x61, 0xd1, 0xdb, 0x81, 0xeb, 0x59, 0xae, 0x33, 0xfa, 0x13, 0x32, - 0x77, 0x48, 0x93, 0x68, 0x34, 0x23, 0x4f, 0xe2, 0x38, 0x95, 0xdb, 0xff, 0x58, 0xd0, 0xd0, 0x27, - 0x37, 0x7d, 0xfe, 0x15, 0xd4, 0x4c, 0x59, 0x5e, 0x65, 0xc8, 0x1a, 0x62, 0x39, 0x99, 0x6f, 0x1e, - 0x65, 0xcb, 0x39, 0x94, 0x25, 0x1f, 0x2d, 0x06, 0x55, 0xbf, 0x5f, 0x72, 0x21, 0x7d, 0x3f, 0x17, - 0xd2, 0x15, 0xcd, 0x95, 0x79, 0x40, 0xef, 0xff, 0xbd, 0x0a, 0xf5, 0xe3, 0x74, 0xcb, 0xe4, 0x47, - 0x58, 0x91, 0x0f, 0x2e, 0x72, 0xbb, 0xb0, 0x1b, 0x27, 0x8f, 0xb7, 0x76, 0x67, 0xb9, 0xa1, 0x06, - 0xcf, 0x2e, 0x11, 0x0f, 0xaa, 0xfa, 0x7d, 0x44, 0xee, 0x14, 0x79, 0xcd, 0x3c, 0xb5, 0xda, 0x77, - 0x5f, 0xc6, 0x34, 0x4b, 0xf1, 0xab, 0x05, 0x6f, 0xe4, 0xde, 0xc6, 0xe4, 0x41, 0x51, 0x9c, 0xa2, - 0x47, 0x59, 0xfb, 0x93, 0x2b, 0x78, 0x66, 0x1b, 0xfa, 0xcd, 0x82, 0x9d, 0xfc, 0xbb, 0x9b, 0xbc, - 0x6a, 0xdc, 0xc9, 0x1d, 0xdc, 0xfe, 0xf4, 0x2a, 0xae, 0xf3, 0x20, 0x5d, 0xbe, 0xd0, 0x96, 0x82, - 0xb4, 0xf0, 0x55, 0xb0, 0x14, 0xa4, 0xc5, 0xb7, 0xa7, 0x5d, 0x92, 0xac, 0x93, 0x7d, 0x56, 0xcc, - 0xba, 0xa9, 0x19, 0x54, 0xcc, 0xba, 0xe9, 0x96, 0xb5, 0x4b, 0x3d, 0x84, 0x5b, 0x3e, 0x0d, 0x0b, - 0x1c, 0x7a, 0xcd, 0x8c, 0xff, 0x47, 0xf2, 0xdf, 0xe5, 0xc8, 0xfa, 0xe1, 0x83, 0x71, 0x20, 0x4e, - 0x93, 0x61, 0xd7, 0xa7, 0xe1, 0x81, 0x74, 0x3c, 0x98, 0x72, 0x3c, 0xf0, 0xe2, 0xe0, 0x20, 0x73, - 0x3e, 0x50, 0xbf, 0x3b, 0xf1, 0x70, 0x58, 0x55, 0x1f, 0x1f, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, - 0x09, 0x10, 0x5e, 0x89, 0x0a, 0x0d, 0x00, 0x00, + 0x14, 0xb7, 0xec, 0xc6, 0xb1, 0x5f, 0x1c, 0x27, 0xdd, 0x94, 0xe0, 0x9a, 0xa6, 0x13, 0x04, 0xa1, + 0x6e, 0x67, 0xea, 0x0c, 0x65, 0x86, 0x29, 0x1c, 0x18, 0x6a, 0x0a, 0xb5, 0x67, 0x08, 0x64, 0x64, + 0xc2, 0x01, 0x0e, 0x1a, 0x59, 0x7e, 0x75, 0xb6, 0x8d, 0xb4, 0xca, 0xee, 0x2a, 0xd0, 0x1e, 0xb8, + 0x71, 0x65, 0x86, 0x6f, 0xc0, 0x9d, 0x2f, 0xc1, 0xd7, 0xe0, 0xc2, 0xd7, 0xe0, 0xca, 0xec, 0x6a, + 0x25, 0xcb, 0x8e, 0x2d, 0xb7, 0xe1, 0xd0, 0x9b, 0xf6, 0xfd, 0xdd, 0xfd, 0xbd, 0xdf, 0x7b, 0xbb, + 0x82, 0x2d, 0x21, 0xd9, 0x05, 0x46, 0x34, 0xc2, 0x6e, 0xc4, 0x99, 0x64, 0xa4, 0x1d, 0x8f, 0x90, + 0x77, 0x45, 0x3c, 0x0a, 0xa8, 0x3c, 0x8f, 0x31, 0xc6, 0x6e, 0x66, 0x61, 0xdf, 0x81, 0x8d, 0x63, + 0x1a, 0x4e, 0x1c, 0x3c, 0x8f, 0x51, 0x48, 0xd2, 0x82, 0xf5, 0x00, 0x85, 0xf0, 0x26, 0xd8, 0xb2, + 0xf6, 0xad, 0x4e, 0xdd, 0x49, 0x97, 0xf6, 0xaf, 0x16, 0x34, 0x12, 0x4b, 0x11, 0xb1, 0x50, 0xe0, + 0x72, 0x53, 0xf2, 0x2e, 0x34, 0x04, 0xf2, 0x0b, 0xea, 0xa3, 0x1b, 0x7a, 0x01, 0xb6, 0xca, 0x5a, + 0xbd, 0x61, 0x64, 0xdf, 0x78, 0x01, 0x92, 0x5b, 0x50, 0x97, 0x34, 0x40, 0x21, 0xbd, 0x20, 0x6a, + 0x55, 0xf6, 0xad, 0x4e, 0xc5, 0x99, 0x0a, 0x48, 0x1b, 0x6a, 0xa7, 0x4c, 0x48, 0xed, 0x7c, 0x4d, + 0x3b, 0x67, 0x6b, 0xfb, 0x00, 0x36, 0x07, 0xe1, 0x04, 0x85, 0x4c, 0xb7, 0x7c, 0x03, 0xd6, 0xf4, + 0xa1, 0xcc, 0x2e, 0x92, 0x85, 0xbd, 0x0f, 0xcd, 0xd4, 0xcc, 0xec, 0xb7, 0x09, 0x65, 0x3a, 0x36, + 0x46, 0x65, 0x3a, 0xb6, 0x87, 0x70, 0xeb, 0x09, 0xa6, 0x51, 0xfa, 0x54, 0x48, 0xc6, 0x5f, 0xf4, + 0x5e, 0x0c, 0x1e, 0x17, 0xc6, 0x25, 0x7b, 0x00, 0x3c, 0x31, 0x70, 0xe9, 0xd8, 0x9c, 0xac, 0x6e, + 0x24, 0x83, 0xb1, 0xfd, 0x04, 0xf6, 0x16, 0x04, 0x3d, 0x71, 0x06, 0xc5, 0x51, 0xb7, 0xa1, 0x12, + 0x73, 0x6a, 0xc2, 0xa9, 0x4f, 0xfb, 0x2f, 0x0b, 0x1a, 0xc6, 0xff, 0xcb, 0x0b, 0x0c, 0x25, 0xb9, + 0x09, 0x35, 0x54, 0x1f, 0x6e, 0x76, 0x88, 0x75, 0xbd, 0x1e, 0x8c, 0x15, 0xde, 0x19, 0x76, 0x6e, + 0x20, 0x74, 0x98, 0x8a, 0xb3, 0x91, 0xc9, 0x8e, 0x04, 0x39, 0x80, 0xcd, 0x74, 0xdb, 0x42, 0x7a, + 0x12, 0x35, 0xe6, 0xf5, 0x7e, 0xc9, 0x69, 0x18, 0xf1, 0x50, 0x49, 0xc9, 0x2e, 0xac, 0xe9, 0xa0, + 0x09, 0xea, 0xfd, 0x92, 0x93, 0x2c, 0xc9, 0x01, 0x34, 0x59, 0x2c, 0x7d, 0x16, 0xa0, 0xcb, 0xd1, + 0x13, 0x2c, 0x6c, 0xad, 0xe9, 0x2d, 0x6c, 0x1a, 0xa9, 0xa3, 0x85, 0xbd, 0x06, 0x00, 0xf3, 0xfd, + 0x98, 0x73, 0x0c, 0x7d, 0xb4, 0xcf, 0xa1, 0x39, 0x0b, 0xc4, 0x1c, 0x78, 0xd6, 0x1c, 0x78, 0xe4, + 0x73, 0xa8, 0xea, 0x74, 0xea, 0x04, 0x95, 0xce, 0xc6, 0x83, 0x4e, 0x77, 0x39, 0x71, 0xbb, 0x79, + 0x70, 0x1c, 0xe3, 0x67, 0x7b, 0x0b, 0xe1, 0x57, 0x35, 0x35, 0x24, 0x98, 0xa6, 0xb0, 0xae, 0x98, + 0xe2, 0x19, 0xdc, 0x5e, 0x56, 0x61, 0x93, 0xa3, 0x0f, 0xf5, 0x53, 0x2d, 0xa7, 0x98, 0xa6, 0xb9, + 0x57, 0x94, 0x66, 0x36, 0x96, 0x33, 0x75, 0xb6, 0xff, 0xb4, 0x34, 0x47, 0x8f, 0x39, 0x7b, 0x86, + 0xbe, 0x2e, 0x51, 0x2c, 0x5e, 0x81, 0x4d, 0x7b, 0x00, 0xfe, 0xa9, 0x17, 0x4e, 0xd0, 0x9d, 0x92, + 0xaa, 0x9e, 0x48, 0x4e, 0x38, 0x55, 0xdd, 0x15, 0x25, 0x11, 0x45, 0xab, 0xb2, 0x5f, 0x51, 0xdd, + 0x95, 0xae, 0xc9, 0x3b, 0x50, 0x8f, 0xbc, 0x09, 0xba, 0x82, 0xbe, 0x4c, 0x5a, 0x6f, 0xcd, 0xa9, + 0x29, 0xc1, 0x90, 0xbe, 0xd4, 0x71, 0xb5, 0x52, 0xb2, 0xe7, 0x98, 0x32, 0x40, 0x9b, 0x7f, 0xa7, + 0x04, 0xf6, 0x08, 0xae, 0x9b, 0x9d, 0x7e, 0xef, 0x9d, 0xd1, 0xb1, 0x27, 0x29, 0x0b, 0xd5, 0x94, + 0x30, 0xc1, 0x53, 0xd6, 0x9a, 0x25, 0xb9, 0x0b, 0x5b, 0x23, 0x8e, 0xde, 0x73, 0x15, 0x71, 0x8c, + 0x13, 0x8e, 0xc9, 0xa0, 0xb0, 0xfa, 0x25, 0xa7, 0x99, 0x2a, 0x1e, 0x6b, 0x79, 0xaf, 0x06, 0x55, + 0x8e, 0x22, 0x3e, 0x93, 0xf6, 0xdf, 0x15, 0x5d, 0xe1, 0x45, 0x88, 0x18, 0xf4, 0x57, 0x70, 0x2c, + 0x43, 0xac, 0xbc, 0x1c, 0xb1, 0xca, 0x3c, 0x62, 0x37, 0xa1, 0x36, 0xf2, 0x44, 0xa2, 0x4c, 0xe6, + 0xd1, 0xba, 0x5a, 0x2b, 0xd5, 0x7b, 0xf3, 0x8d, 0x95, 0xc0, 0x32, 0xdb, 0x56, 0x36, 0x6c, 0xc6, + 0xd1, 0xd8, 0x93, 0x38, 0x76, 0x3d, 0xa9, 0x3a, 0x14, 0x92, 0x0e, 0x35, 0xc2, 0x47, 0xf2, 0x48, + 0x90, 0xcf, 0xa0, 0xcd, 0x31, 0x62, 0x82, 0x2a, 0x12, 0xb8, 0xf3, 0xc8, 0x54, 0x0d, 0x32, 0xad, + 0xa9, 0x4d, 0x6f, 0x06, 0x23, 0xf2, 0x10, 0x5a, 0x06, 0x59, 0x37, 0xc1, 0x4a, 0xb8, 0x3e, 0x0b, + 0xa2, 0x33, 0x94, 0xd8, 0x5a, 0xdf, 0xb7, 0x3a, 0x35, 0x67, 0xd7, 0xe8, 0x9d, 0x44, 0xfd, 0x85, + 0xd1, 0x92, 0x41, 0x8e, 0x0f, 0x35, 0x4d, 0xd7, 0xfb, 0x45, 0x74, 0xbd, 0x54, 0xe3, 0x1c, 0x7d, + 0x3e, 0x80, 0xad, 0x10, 0x7f, 0x96, 0x6e, 0x8e, 0x26, 0xf5, 0x64, 0x50, 0x28, 0xf1, 0x71, 0x4a, + 0x95, 0xde, 0x0e, 0x5c, 0xcf, 0x1d, 0xd6, 0xd4, 0xf6, 0x8f, 0x72, 0x36, 0x30, 0x86, 0x71, 0x10, + 0x78, 0xab, 0x07, 0xc6, 0x1b, 0x29, 0xe6, 0x7d, 0xd8, 0xd1, 0x4a, 0x77, 0xb6, 0xa4, 0x55, 0x5d, + 0xd2, 0x6d, 0xad, 0x3a, 0xc9, 0xd5, 0xf5, 0x7d, 0x68, 0x7a, 0xbe, 0x8f, 0xd1, 0xd4, 0x72, 0x5d, + 0x5b, 0x36, 0x52, 0xa9, 0xb6, 0xba, 0x3c, 0x60, 0x6b, 0x0b, 0x06, 0xac, 0xfd, 0xaf, 0x05, 0x1b, + 0x5f, 0xd3, 0x15, 0x77, 0x1f, 0xf9, 0x18, 0xde, 0xce, 0xa7, 0x64, 0xdc, 0xf5, 0x9e, 0x4a, 0xe4, + 0xd9, 0xd5, 0xd0, 0x2f, 0x39, 0x3b, 0xd3, 0xec, 0xdf, 0xf2, 0x47, 0x4a, 0x7b, 0x24, 0x48, 0x17, + 0x48, 0xe6, 0x37, 0xc2, 0xa7, 0x8c, 0xa3, 0x72, 0xd1, 0xb7, 0x73, 0xdf, 0x72, 0xb6, 0x53, 0x5d, + 0x4f, 0xab, 0x8e, 0xfe, 0xd7, 0xb0, 0xe8, 0xed, 0xc2, 0x8d, 0x2c, 0xd7, 0x19, 0xfb, 0x09, 0xb9, + 0x3b, 0x62, 0x71, 0x38, 0x9e, 0x91, 0xc7, 0x51, 0x94, 0xca, 0xed, 0x5f, 0xa0, 0x91, 0x1c, 0xdc, + 0xb4, 0xf9, 0x57, 0x50, 0x33, 0x55, 0x79, 0x9d, 0x19, 0x6b, 0x78, 0xe5, 0x64, 0xbe, 0x8b, 0x18, + 0x5b, 0x5e, 0xc0, 0xd8, 0x07, 0xff, 0xac, 0x41, 0x7d, 0x98, 0x86, 0x23, 0x3f, 0xc2, 0x35, 0xf5, + 0x16, 0x22, 0x77, 0x0a, 0x1b, 0x65, 0xfa, 0xae, 0x6a, 0x77, 0x56, 0x1b, 0x26, 0x07, 0xb3, 0x4b, + 0xc4, 0x83, 0x6a, 0xf2, 0x74, 0x21, 0x77, 0x8b, 0xbc, 0x66, 0x5e, 0x41, 0xed, 0x7b, 0xaf, 0x62, + 0x9a, 0xa5, 0xf8, 0xcd, 0x82, 0xb7, 0x16, 0x5e, 0x94, 0xe4, 0x61, 0x51, 0x9c, 0xa2, 0xf7, 0x52, + 0xfb, 0x93, 0x2b, 0x78, 0x66, 0x1b, 0xfa, 0xdd, 0x82, 0xdd, 0xc5, 0xd7, 0x2a, 0x79, 0xdd, 0xb8, + 0xd3, 0xeb, 0xb1, 0xfd, 0xe9, 0x55, 0x5c, 0xe7, 0x41, 0xba, 0x7c, 0xd7, 0xac, 0x04, 0x69, 0xe9, + 0x85, 0xbd, 0x12, 0xa4, 0xe5, 0x17, 0x9b, 0x5d, 0x52, 0xac, 0x53, 0x3d, 0x50, 0xcc, 0xba, 0xdc, + 0x78, 0x28, 0x66, 0x5d, 0xbe, 0x9d, 0xec, 0x52, 0x0f, 0xe1, 0xb6, 0xcf, 0x82, 0x02, 0x87, 0x5e, + 0x33, 0xe3, 0xff, 0xb1, 0xfa, 0xad, 0x38, 0xb6, 0x7e, 0xf8, 0x70, 0x42, 0xe5, 0x69, 0x3c, 0xea, + 0xfa, 0x2c, 0x38, 0x54, 0x8e, 0x87, 0x39, 0xc7, 0x43, 0x2f, 0xa2, 0x87, 0x99, 0xf3, 0xa1, 0xfe, + 0x13, 0x89, 0x46, 0xa3, 0xaa, 0xfe, 0xf8, 0xe8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa6, 0xd3, + 0x4f, 0x39, 0xa5, 0x0c, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/list-api.md b/doc/rfc/stovepipe/list-api.md index d2fa4269e..ef83d1a0d 100644 --- a/doc/rfc/stovepipe/list-api.md +++ b/doc/rfc/stovepipe/list-api.md @@ -16,7 +16,7 @@ The [protobuf contract](../../../api/stovepipe/proto/stovepipe.proto) is include | `page_size` | int32 | Default 50; maximum 200. Zero means default. | | `page_token` | string | Empty for the first page; otherwise an opaque continuation. | -The response contains `requests`, `next_page_token`, and the two resolved time bounds. No matches returns an empty page; an empty continuation means no further row was observed. +The response contains only `requests` and `next_page_token`. No matches returns an empty page; an empty continuation means no further row was observed. Continuations repeat the same queue. Time bounds may be omitted or must match the token; page size may change. Tokens preserve the query bounds and continue exclusively after the last returned ordering key. Invalid inputs and mismatched tokens fail the request. Every page follows the service's queue-access policy.