diff --git a/sds/sds_utils.nim b/sds/sds_utils.nim index 87fb50a..445dd35 100644 --- a/sds/sds_utils.nim +++ b/sds/sds_utils.nim @@ -328,15 +328,6 @@ proc getRecentHistoryEntries*( if not rm.onRetrievalHint.isNil(): {.cast(raises: []).}: entry.retrievalHint = rm.onRetrievalHint(msgId) - if entry.retrievalHint.len > 0: - # Phase 2B: best-effort hint persistence via V2. Non-fatal — - # hints are an optimisation; a missing hint just means the - # peer falls back to slower retrieval. - let hintRes = - await rm.persistence.setRetrievalHint(msgId, entry.retrievalHint) - if hintRes.isErr(): - warn "retrieval hint save failed; continuing", - msgId = msgId, detail = hintRes.error entry.senderId = channel.messageHistory[msgId].senderId entries.add(entry) ok(entries) diff --git a/sds/types/persistence.nim b/sds/types/persistence.nim index 6f5e459..b077e3f 100644 --- a/sds/types/persistence.nim +++ b/sds/types/persistence.nim @@ -27,7 +27,6 @@ export results, sds_message_id, channel_meta, history_update type Persistence* = object ## Pluggable durability backend. Supplied at `newReliabilityManager` ## construction time; defaults to `noOpPersistence()` when not given. - saveChannelMeta*: proc( channelId: SdsChannelID, meta: ChannelMeta ): Future[Result[void, string]] {.async: (raises: []), gcsafe.} @@ -42,30 +41,21 @@ type Persistence* = object ## maxMessageHistory cap. Callers SHOULD skip this call entirely when ## `update.isEmpty`. - loadChannel*: proc( - channelId: SdsChannelID - ): Future[Result[ChannelData, string]] {.async: (raises: []), gcsafe.} + loadChannel*: proc(channelId: SdsChannelID): Future[Result[ChannelData, string]] {. + async: (raises: []), gcsafe + .} ## Bootstrap on `getOrCreateChannel`. Returns the full prior state, or ## an empty `ChannelData` if the channel is new on disk. Failure ## propagates to the caller — bootstrap is a durability-intent op. - dropChannel*: proc( - channelId: SdsChannelID - ): Future[Result[void, string]] {.async: (raises: []), gcsafe.} + dropChannel*: proc(channelId: SdsChannelID): Future[Result[void, string]] {. + async: (raises: []), gcsafe + .} ## Wipe all persisted state for a channel. Called by `removeChannel` / ## `resetReliabilityManager`. Backends SHOULD execute atomically. ## Failure propagates to the caller — the caller asked us to confirm a ## disk wipe and we cannot silently lie. - setRetrievalHint*: proc( - msgId: SdsMessageID, hint: seq[byte] - ): Future[Result[void, string]] {.async: (raises: []), gcsafe.} - ## Record a retrieval hint for a message id. Called from - ## `getRecentHistoryEntries` when an application-supplied hint - ## provider returns a non-empty hint. Out-of-band from the - ## snapshot/history write path because hints are populated lazily - ## during read. Non-fatal on failure. - proc noOpPersistence*(): Persistence = ## Default backend: discards all writes, returns an empty snapshot on ## load. Used when no real backend is supplied (existing tests and @@ -87,8 +77,4 @@ proc noOpPersistence*(): Persistence = channelId: SdsChannelID ): Future[Result[void, string]] {.async: (raises: []).} = ok(), - setRetrievalHint: proc( - msgId: SdsMessageID, hint: seq[byte] - ): Future[Result[void, string]] {.async: (raises: []).} = - ok(), ) diff --git a/tests/in_memory_persistence.nim b/tests/in_memory_persistence.nim index 087545e..17a4775 100644 --- a/tests/in_memory_persistence.nim +++ b/tests/in_memory_persistence.nim @@ -6,7 +6,7 @@ ## ## `failingOps` injects backend failures. Op names match the `Persistence` ## field names: "saveChannelMeta", "updateHistory", "loadChannel", -## "dropChannel", "setRetrievalHint". +## "dropChannel". import std/[tables, sets] import chronos @@ -15,7 +15,6 @@ import sds type InMemoryStore* = ref object lamports*: Table[SdsChannelID, int64] log*: Table[SdsChannelID, OrderedTable[SdsMessageID, SdsMessage]] - hints*: Table[SdsMessageID, seq[byte]] outgoing*: Table[SdsChannelID, OrderedTable[SdsMessageID, UnacknowledgedMessage]] incoming*: Table[SdsChannelID, OrderedTable[SdsMessageID, IncomingMessage]] outgoingRepair*: Table[SdsChannelID, OrderedTable[SdsMessageID, OutgoingRepairEntry]] @@ -23,8 +22,7 @@ type InMemoryStore* = ref object dropChannelCalls*: Table[SdsChannelID, int] ## Per-channel counter; lets tests assert dropChannel is invoked ## exactly once per logical drop. - failingOps*: HashSet[string] - ## Op names that should return an injected backend error. + failingOps*: HashSet[string] ## Op names that should return an injected backend error. proc newInMemoryStore*(): InMemoryStore = InMemoryStore(failingOps: initHashSet[string]()) @@ -48,8 +46,7 @@ proc newInMemoryPersistence*(store: InMemoryStore): Persistence = store.outgoing[channelId][u.message.messageId] = u # Incoming buffer. - store.incoming[channelId] = - initOrderedTable[SdsMessageID, IncomingMessage]() + store.incoming[channelId] = initOrderedTable[SdsMessageID, IncomingMessage]() for m in meta.incomingBuffer: store.incoming[channelId][m.message.messageId] = m @@ -120,11 +117,4 @@ proc newInMemoryPersistence*(store: InMemoryStore): Persistence = store.dropChannelCalls[channelId] = store.dropChannelCalls.getOrDefault(channelId) + 1 ok(), - setRetrievalHint: proc( - msgId: SdsMessageID, hint: seq[byte] - ): Future[Result[void, string]] {.async: (raises: []).} = - if "setRetrievalHint" in store.failingOps: - return err("injected backend failure: setRetrievalHint") - store.hints[msgId] = hint - ok(), )