Skip to content

feat: tiered data storage#7

Open
enigbe wants to merge 10 commits intomainfrom
2025-10-tiered-data-storage
Open

feat: tiered data storage#7
enigbe wants to merge 10 commits intomainfrom
2025-10-tiered-data-storage

Conversation

@enigbe
Copy link
Copy Markdown
Owner

@enigbe enigbe commented Oct 21, 2025

What this PR does:

We introduce TierStore, a KVStore implementation that manages data across
three distinct storage layers.

The layers are:

  1. Primary: The main/remote data store.
  2. Ephemeral: A secondary store for non-critical, easily-rebuildable data
    (e.g., network graph). This tier aims to improve latency by leveraging a
    local KVStore designed for fast/local access.
  3. Backup: A tertiary store for disaster recovery. Backup operations are sent
    asynchronously/lazily to avoid blocking primary store operations.

We also permit the configuration of Node with these stores allowing
callers to set exponential back-off parameters, as well as backup and ephemeral
stores, and to build the Node with TierStore's primary store. These configuration
options also extend to our foreign interface, allowing bindings target to build the
Node with their own ffi::KVStore implementations.

A sample Python implementation is added and tested.

Additionally, we add comprehensive testing for TierStore by introducing

  1. Unit tests for TierStore core functionality.
  2. Integration tests for Node built with tiered storage.
  3. Python FFI tests for foreign ffi::KVStore implementations.

Concerns

It is worth considering the way retry logic is handled, especially because of nested
retries. TierStore comes with a basic one by default but there are KVStore implementations
that come with them baked-in (e.g. VssStore), and thus would have no need for
the wrapper-store's own logic.

@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 9 times, most recently from 29f47f3 to 264aa7f Compare November 4, 2025 22:07
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 3 times, most recently from a30cbfb to 1e7bdbc Compare December 4, 2025 23:30
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 5 times, most recently from b5e980f to 67d47c2 Compare February 4, 2026 16:28
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 2 times, most recently from 95285b0 to 4b2d345 Compare February 18, 2026 11:23
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 2 times, most recently from cba29a3 to db1fe83 Compare February 24, 2026 23:03
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch from db1fe83 to 35f9ec2 Compare March 9, 2026 15:47
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 3 times, most recently from e89ada5 to 3abd0a5 Compare April 1, 2026 21:44
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch from 3abd0a5 to 4a75d67 Compare April 2, 2026 09:55
Resolve Node.js 20 deprecation warnings by updating all GitHub Actions
to their latest major versions supporting Node.js 24.

Co-Authored-By: HAL 9000
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 3 times, most recently from 5647237 to 04855d7 Compare April 6, 2026 06:05
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch 2 times, most recently from 1cd58c0 to 342f8e6 Compare April 6, 2026 19:31
f3r10 and others added 3 commits April 6, 2026 17:53
Add a `ChannelShutdownState` enum mirroring LDK's own type, and expose
it as an `Option<ChannelShutdownState>` field on `ChannelDetails`.
…_shutdown_state

Expose `ChannelDetails::channel_shutdown_state`
LSPs can now allow their clients to spend their entire channel balance.
Note that LSPs will still be required to maintain a reserve on their
side of the channel.
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch from 342f8e6 to 19a6c09 Compare April 7, 2026 21:35
Bump CI action dependencies to latest major versions
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch from 19a6c09 to 7720935 Compare April 8, 2026 07:12
tnull and others added 5 commits April 8, 2026 09:50
…erve

Enable 0conf and 0reserve on channels with trusted peers
The upstream LDK API moved the min/max feerate parameters from
`ChannelManager::splice_channel` to `FundingTemplate::splice_in` and
`FundingTemplate::splice_out`. This associates the feerate range with
the funding contribution rather than the splice initiation, allowing
different feerates per contribution (e.g., for RBF bumps). Update
the splice_in_inner and splice_out call sites accordingly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…bf-refactor

Bump LDK dependency for splice feerate API refactor
This commit:

Adds `TierStore`, a tiered `KVStore`/`KVStoreSync` implementation that
routes node persistence across three storage roles:

- a primary store for durable, authoritative data
- an optional backup store for a second durable copy of primary-backed data
- an optional ephemeral store for rebuildable cached data such as the
  network graph and scorer

TierStore routes ephemeral cache data to the ephemeral store when
configured, while durable data remains primary+backup. Reads and lists
do not consult the backup store during normal operation.

For primary+backup writes and removals, this implementation treats the
backup store as part of the persistence success path rather than as a
best-effort background mirror. Earlier designs used asynchronous backup
queueing to avoid blocking the primary path, but that weakens the
durability contract by allowing primary success to be reported before
backup persistence has completed. TierStore now issues primary and backup
operations together and only returns success once both complete.

This gives callers a clearer persistence guarantee when a backup store is
configured: acknowledged primary+backup mutations have been attempted
against both durable stores. The tradeoff is that dual-store operations
are not atomic across stores, so an error may still be returned after one
store has already been updated.

TierStore also implements `KVStoreSync` in terms of dedicated synchronous
helpers that call the wrapped stores' sync interfaces directly. This
preserves the inner stores' synchronous semantics instead of routing sync
operations through a previously held async runtime.

Additionally, adds unit coverage for the current contract, including:
- basic read/write/remove/list persistence
- routing of ephemeral data away from the primary store
- backup participation in the foreground success path for writes and removals
Add native builder support for tiered storage by introducing
`TierStoreConfig`, backup and ephemeral store configuration methods,
and a `build_with_dynstore` path that wraps the provided store as the
primary tier and applies any configured secondary tiers.

This makes tiered storage a builder concern while keeping the Rust
`build_with_store` API ergonomic for native callers.

Note: The temporary `dead_code` allowance will be removed in a
follow-up commit once the new tier-store builder APIs are exercised.
@enigbe enigbe force-pushed the 2025-10-tiered-data-storage branch from 7720935 to 181db03 Compare April 9, 2026 07:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants