Scheduler database
The scheduler service holds everything about jobs, slices, Compute Groups and workers. Connect with jnu.connect('scheduler', keystore). Every table below is listed with the policy name you pass as table, who can read it, which columns can be changed, and what each column means.
Column types are the ormdb types from the schema. In JavaScript they arrive as:
Schema type |
JavaScript value |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
the parsed value, or |
|
|
“Owner” in the access column means the identity that signs the query, after proxy-key resolution (see Identity and access). “Via job” means the row is reachable only through a job whose owner is you; “via Compute Group” and “via credentials list” work the same way through computeGroups.owner and credsList.owner.
Jobs
jobs
One row per job. Read by the job owner; the owner can change name, description and link and nothing else. Rows can’t be added or deleted through Jnu.
Column |
Type |
Meaning |
|---|---|---|
|
|
Primary key. The other job tables refer to this number as |
|
|
Public job id, the value of |
|
|
|
|
|
Identity that owns the job, that is, the root identity behind the key that deployed it. |
|
|
The job’s escrow account. |
|
|
Bank account the escrow is funded from. |
|
|
When the job was created. |
|
|
When the job was finalized, or |
|
|
Last change to this row. |
|
|
Index of the last slice. For a job with a fixed input set this is the slice count. |
|
|
Next slice to hand out. |
|
|
Hard cap on slices per task. |
|
|
Fixed offer per slice, in DCC. |
|
|
Market-value multiplier. A job deployed with |
|
|
|
|
|
How duplicates are resolved: |
|
|
Bit flags: 1 |
|
|
Worker capabilities the job needs. Bit flags: 1 |
|
|
Deprecated. Use |
|
|
How to read |
|
|
Range object, URL pattern or values describing the input set. |
|
|
How to read |
|
|
Where results go. |
|
|
POST parameters used with |
|
|
Public name, from |
|
|
Public description. Changeable. |
|
|
Public URL. Changeable. |
|
|
The runtime environment ( |
|
|
Semver range for that environment. |
jobs_public
The same table, readable by anyone with any identity. Only opaqueId, name, description and link are returned, and opaqueId is the only column a prototype may filter on.
Warning
As of 2026-10-03 an empty prototype is accepted and returns the public fields of every job on the scheduler. This is expected to change; until it does, don’t put anything in a job’s name, description or link that shouldn’t be world-readable.
jobPerfData
One row per job, keyed by id = jobs.id. Read by the job owner. Written by the scheduler on every result, without locking, so values can be slightly off after a crash. Query it with prototype: { id: job.id }; it has no jobId column.
Column |
Type |
Meaning |
|---|---|---|
|
|
|
|
|
Last change. |
|
|
Estimation slices not yet handed out. The job leaves |
|
|
Results that have contributed to the averages, including duplicates. |
|
|
Tasks that included at least one slice of this job. |
|
|
Slices given back by workers without being worked on. |
|
|
Slices re-issued by the watchdog. |
|
|
Worker-reported failure counts. |
|
|
Exponential moving average per slice, in milliseconds. |
|
|
Moving average of bytes to and from the worker per slice. |
|
|
Moving average of the fraction of wall-clock time spent on the CPU or GPU. Wall time per slice is |
|
|
Moving average of the fraction of a task’s nominal duration this job’s slices took, on requests where the job was eligible. Long slices can exceed |
|
|
Exponential moving variance of each average above. The square root is a usable standard deviation. |
|
|
Running totals, in milliseconds. |
|
|
Running totals, in bytes. |
The moving averages use alpha = min(0.5, unreported ÷ total), so a small job’s averages move quickly and a large job’s settle.
jobFinData
One row per job, keyed by id = jobs.id. Read by the job owner. sliceWorkPaymentTotal is DCC paid out so far; sliceWorkPaymentPending is DCC held in escrow for distributed, unfinished slices. The row is recalculated when the job is paused or finished.
Note
Known issue as of 2026-10-03, expected to change: this table returned no row for finished, paid jobs in testing. Treat it as advisory and fall back to offer × completed slices when it’s empty.
activeSlices
Slices that have been handed out and have no result yet. Read by the job owner. Not authoritative for payment; the worker columns record the most recent assignment and aren’t guaranteed.
Column |
Type |
Meaning |
|---|---|---|
|
|
Which slice. |
|
|
|
|
|
When the last assigned worker started it. |
|
|
Activation time or the last |
|
|
How many times the slice has been marked overdue. |
|
|
Worker id most recently given the slice. |
|
|
That worker’s identity. |
jobResults
One row per completed slice. Read by the job owner; value can be changed (for example to move a result to new storage). value is a URI: a data: URI holding the result for small results, or a URL into the result store on the scheduler for large ones. As of 2026-10-03 the table has no timestamp column, so completion over time has to be sampled by the caller.
Column |
Type |
Meaning |
|---|---|---|
|
|
|
|
|
Slice index, from 1. |
|
|
The result, see above. |
count({ table: 'jobResults', prototype: { jobId } }) is the number of finished slices.
jobData, jobArguments, workFunctions
The job’s inputs. All read by the job owner; value is changeable on jobData and jobArguments (for example to point a slice that hasn’t started at a new remote URI). workFunctions is read-only.
Table |
Columns |
|---|---|
|
|
|
|
|
|
workRejectHistory
One row each time a worker rejected the job outright, for example by calling work.reject() or because a requirement couldn’t be met. Read by the job owner.
Column |
Type |
Meaning |
|---|---|---|
|
|
|
|
|
The slice that triggered the rejection. |
|
|
Which worker. |
|
|
When. |
|
|
Short reason, for example |
|
|
The message or the top of the stack. |
|
|
Retries the worker allowed before rejecting. |
computeGroupsJobs_byJob
The computeGroupJobs membership table seen from the job side: jobId, computeGroupId, lastUpdate. Read by the job owner. It gives the numeric ids of the groups the job is in; resolving them to names needs the group’s opaqueId, which this view doesn’t carry.
Compute Groups
All of these are read by the Compute Group owner, through computeGroups.owner.
computeGroups
Column |
Type |
Meaning |
|---|---|---|
|
|
Public group id. |
|
|
Group owner; has elevated permissions. |
|
|
Changeable by the owner. |
|
|
Join credentials: a login, a seeded hash of the secret, and an address whose signature is an alternative. Changeable by the owner. |
|
|
Fraction of each slice payment taken as commission, and where it goes. |
|
|
DCC charged per deployment and per job added. |
|
|
|
|
|
Administrative limits; |
|
|
When the group was created and last changed. |
computeGroups_public
Readable by anyone: opaqueId, name and description, filterable only on opaqueId. As with jobs_public, an empty prototype lists every group as of 2026-10-03.
computeGroupJobs
Membership: computeGroupId, jobId, lastUpdate. Read by the group owner.
computeGroupAccountingData
Remaining budgets per group: remainingCPUTime, remainingGPUTime, remainingJobs, remainingInDataSize, remainingOutDataSize.
computeGroupWorkerOrigins
URL origins that workers in the group may contact, with type one of any, fetchWorkFunctions, fetchArguments, fetchData, sendResults. The owner can add, change and delete rows.
computeGroupJobPeriodStats
Per group, per job, per period. This is the only table that records what actually happened in a group over time, and the basis for any market-rate figure.
Column |
Type |
Meaning |
|---|---|---|
|
|
Which group and which job. |
|
|
Period start in seconds since the epoch, and its length in seconds. |
|
|
Task requests from eligible workers. |
|
|
Of those, requests that got no slice of this job. |
|
|
Slices handed out. |
|
|
DCC earned by the group’s workers on this job in the period. |
|
|
Totals for the period (milliseconds, bytes). |
|
|
Per-slice moving averages and variances, as in |
totalEarnings ÷ totalCPUTime is the realised rate per CPU-millisecond for that job in that group and period. The cgstat tool on the scheduler host dumps, summarizes and compacts these rows.
computeGroupWorkerPeriodStats
Reserved. As of 2026-10-03 only computeGroupId, workerOpaqueId, periodStart and periodLength exist; per-worker supply statistics are planned here.
Workers
Read and changed by the worker’s registered owner. The tables prefixed w$ and cc$ in the policy are the restricted views a worker’s own proxy key uses; an owner’s key uses the names without the prefix.
worker
Registration: opaqueId (public worker id), owner, identity (the worker’s local key), label (usually the host name), transferLock (true means it can’t be re-registered to another owner), flags (bit 0 marks a Portal worker). The owner has full access.
workerRunInfo
Written at every worker start and on config changes. One row per worker.
Column |
Type |
Meaning |
|---|---|---|
|
|
Which worker and whose it is. |
|
|
What’s running: |
|
|
Host identification. |
|
|
Hardware. |
|
|
How much of the machine the worker will use. |
|
|
Where it’s paid and what it has earned since the last reset. |
|
|
|
|
|
When it last started, last changed, and its last error. |
workerTaskInfo
Written on every task fetch: taskTime (last fetch), currentTask (json), serial (ring-buffer position). The averageBusySandboxes* and averageIdleSandboxes* columns exist but are marked as not to be used in the schema as of 2026-10-03.
workerSnapshot
A read-only view joining worker, workerRunInfo, workerTaskInfo and dcpWorkerAppConfig, plus a virtual running column. One query for everything about the owner’s workers.
dcpWorkerAppConfig, workerConfigValue
Worker configuration pushed from the database: application settings (syslogUrl, enableSyslog, enableEventLog, startupDelay, startupDelayType) and individual dcpConfig.worker values (keyPath, value). type is active or template; a null workerOpaqueId means the row applies to all of the owner’s workers. Owner has full access.
workerCreds, credsList, credential
Credential storage for workers, currently compute-group join credentials (type cg-join on the list, cg on the credential, with identifier holding the joinKey and secret the joinHash). Owner has full access. Workers read them through a credCookie.
workerNotifications, registerWorkerDirective
Notifications queued for a worker (event, signature) and instructions for worker registration keys. Owner has full access.
Not exposed
consensusResults, reliableEvents, the vw_* views and the check test table have no policy and can’t be queried: the error is Invalid operation scheduler.jnu.<table>.query.