Job handles
A job handle lets you track an operation, such as an index build or a computed column refresh. Use it to check progress, wait for completion and inspect failures. Methods such as Python’screate_index_async and TypeScript’s
createIndexAsync return job handles. In LanceDB Embedded, the work runs in your application
process; in Enterprise, it runs on server workers or through the SQL query
backend. A returned handle can represent an operation that has already finished,
so check its status before
waiting or requesting cancellation. See the operation’s API reference for when
the method returns.
Submit and wait for a job
- Submit the operation. Keep the returned job handle. For an Enterprise registry job, also keep its ID if another process needs to look it up later.
- Check progress. Read the current status while the operation runs.
- Wait for completion. Check that the job succeeded before using its result. If it failed or was cancelled, inspect the failure details and any results it committed before stopping.
job.status() reports the current state and job.wait() waits for
completion, raising if the job fails or is cancelled. Both Job.wait() and
AsyncJob.wait() retry transient connection and read errors with capped
exponential backoff within the caller’s timeout. Without a timeout, retries
continue indefinitely.
If the timeout expires while disconnected, the wait raises ConnectionError
with the job ID and instructions to resume waiting. A timeout while connected
raises TimeoutError. The job may still be running; timing out does not cancel it.
wait() again on the original handle. These jobs
cannot be reopened with db.open_job(); see SQL-backed job handles.
Inspect and cancel jobs
Reopening a job retrieves the existing operation; it does not restart failed
work. Treat the ID as an opaque identifier and pass it unchanged to the jobs API.
Embedded and Enterprise execution
The following table describes LanceDB Embedded operations and registry jobs on LanceDB Enterprise. SQL-backed job handles follow the query lifecycle described below.SQL-backed job handles
On Enterprise, several catalog operations return a job handle backed by the SQL query engine rather than the job registry:
All of these report
job.job_type as "query", with job.id holding the
connection-scoped SQL query UUID — use describe_query(job.id) to inspect
one. Unlike registry handles, they don’t expose event history, can’t be
reopened through open_job() or reattached after a client restart, and
cancellation depends on the SQL server’s support for it.
Object teardown
The “physical cleanup continues in the background” behavior above, for a dropped table, view, materialized view, Secret or Function, is a job type of its own:drop_object deletes the dropped object’s content, then clears it
from the database’s cleanup backlog. You trigger it indirectly, by dropping
one of those objects or a namespace — it runs as
this job rather than inline with the call. Whether a dropped table runs as
drop_object or as drop_table, which fences the
table’s directory with its own marker instead, depends on how the deployment
stores its catalog.
Learn more
- Incremental Indexing: submit index work.
- Refresh a computed column: populate derived values.
- SQL job commands: list jobs and inspect errors.
- SDKs: find the job API for your client.