QueryProperties
The query plane's configuration, wow.query.*, read by QueryAutoConfiguration: the query routes and gateways, the budgets they run under, who may query what, and how many queries each store runs at once.
Types
How a store's query bound adapts to its write pressure, when neither wow.query.max-concurrent nor wow.stores.<name>.query.max-concurrent fixes it: pressing periods in a row halve it, down to floor; a calm period in which a query waited or was refused raises it by one, up to ceiling. wow.stores.<name>.query.adaptive.* overrides floor and ceiling for one store.
A query entry's budget (QueryBudget) and the limit of a list that names none, from its defaults. A limit of 0 is off.
The budget of each query entry.
The cache of the snapshot counts, valid while the type's snapshot write checkpoint holds and for at most ttl.
The datasets, and the bound of their queries.
The events model's queries.
The budget of the query routes, wow.query.budgets.http.*.
The budget of the in-process me.ahoo.wow.api.read.QueryApi, wow.query.budgets.in-process.*.
Queries of the snapshots and logs kept in memory.
What the queries may do with sensitive fields.
The reads of an aggregate's state at a version or a point in time.
How a list streamed as server-sent events reads its chunks and how long it runs. Neither budgets.http.max-list-size nor budgets.http.default-list-size bounds such a stream. A list whose sort cannot order a cursor streams without positions, under those bounds, and cannot be resumed.
Properties
How the bound of a store adapts to its write pressure, when neither wow.query.max-concurrent nor wow.stores.<name>.query.max-concurrent fixes it.
Whether a caller that may act across scopes may query across tenants on the query routes (Wow-Scope: tenant=* or tenant=("t1" "t2")); 403 wow.auth.forbidden while not. A type whose tenant is fixed is still read in that tenant alone, and each such query is logged at INFO (me.ahoo.wow.query.CrossTenantAudit). The commands and the state reads never cross tenants.
The budget (QueryBudget) each query entry runs under: the query routes' and the in-process queries'.
The cache of the snapshot counts.
The datasets, and the bound of their queries.
The events model, served from each aggregate's log store, or the store its wow.aggregates.[<context>.<aggregate>].query.events.store names.
How many snapshot and events queries each store runs at once, whichever entry asks; beyond it a query waits, then is wow.query.busy (429, with Retry-After). Not set, each store derives one from the pool it reports: a quarter of a pool its queries share with the appends, at least 2 (MongoDB's, and PostgreSQL's or Elasticsearch's own pool), or the whole of a pool of their own (PostgreSQL's query-data-source, Elasticsearch's query-client); 16 for a store that reports none. That bound then adapts to the store's write pressure (adaptive). 0 for no bound; wow.stores.<name>.query.max-concurrent overrides it for one store.
Queries of the snapshots and logs kept in memory.
Whether an HTTP query of a built-in model is refused unless the caller's authenticated scope pins its tenant; off, a declared scope, such as a tenant header, is trusted.
Whether a query must say whether it comes over HTTP or in process; off, a query that does not say is taken as in-process.
What the queries may do with sensitive fields.
The reads of an aggregate's state at a version or a point in time.
How a list streamed as server-sent events reads its chunks and how long it runs.
The timeout of a trusted in-process query that dropped its budget (NodeQueryApi.trusted().unbounded()); 0 for none.