Simplify turbo-tasks-backend: collapse single-impl traits and remove redundant Arc layers (#93983)
### What?
Simplifies `turbo-tasks-backend` by removing abstraction layers that
each had a
single implementation, plus several redundant `Arc` indirections that
were no
longer load-bearing.
**Traits removed / collapsed (each had exactly one implementor):**
- **`KeyValueDatabase`** — folded into inherent methods on its only
impl,
`TurboKeyValueDatabase`.
- **`BackingStorage` + `BackingStorageSealed`** — folded into inherent
methods on
the renamed concrete type `TurboBackingStorage` (was the
`KeyValueDatabaseBackingStorage<T>` generic + a type alias).
- **`ConcurrentWriteBatch`** — folded into inherent methods on
`TurboWriteBatch`
(it existed to support an old backend implementation that's gone).
- The **`B: BackingStorage` generic parameter** is dropped from
`TurboTasksBackend`, `TurboTasksBackendInner`, `ExecuteContextImpl`, and
`ChildExecuteContextImpl`. Every instantiation in the workspace already
resolved to one concrete type.
The only remaining trait in the crate's public role is `Backend`
(defined in
`turbo-tasks`), which stays — removing it would invert the
`turbo-tasks` → backend dependency.
**`Arc` indirections removed:**
- `TurboKeyValueDatabase.db: Arc<TurboPersistence>` → `TurboPersistence`
(the write batch only borrowed it; the clone in `new` was gratuitous).
- The `self: &Arc<Self>` receivers and `self.clone()` calls in
`run_backend_job`,
`idle_start`, and `try_read_task_output` — the deferred/background work
reaches
the backend through the pinned `turbo_tasks` handle instead, whose `Arc`
already
keeps the backend alive.
- With no remaining sharer, the backend's own
`Arc<TurboTasksBackendInner>` and
the `TurboTasksBackend` newtype were collapsed: the inner fields now
live
directly in `TurboTasksBackend`, stored inline in `TurboTasks` (which
already
shares it via its own `Arc<TurboTasks>`).
**Other cleanups surfaced by the above:**
- `noop_backing_storage()` is now an empty, read-only instance of the
real
`TurboPersistence` instead of a separate `NoopKvDb` impl — same concrete
type as
`turbo_backing_storage()`, so the `Either<…>` wrappers in napi and
turbopack-cli
go away.
- `TurboTasksBackend::backing_storage()` accessor replaced with a
focused
`invalidate_storage(reason_code)` method, so the backend no longer leaks
its
storage object.
- Dead code removed (`CellDependency::key`, `ExecuteContext::schedule` /
`suspending_requested`, the non-stats `execute_with_stats` variant) and
feature/test-only items gated behind their corresponding `cfg`.
### Why?
The no-op storage work removed the last thing forcing these abstractions
to be
generic/dynamic, so the single-impl traits and the extra `Arc` layers
were pure
indirection. This is a self-contained simplification: behavior is
unchanged.
### Tradeoff
- One `Either`/match in every backing-storage method becomes one
`is_empty`
atomic load (`Relaxed` `AtomicBool`) in `should_restore` — essentially
equivalent.
- The backend is now stored inline in `TurboTasks` rather than behind a
pointer:
one fewer indirection on every backend access, at the cost of a larger
`TurboTasks` struct.
<!-- NEXT_JS_LLM_PR -->