From 2e00fb7c642d042e853c3acb16f8348a2a62a971 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Mon, 6 Apr 2026 12:54:22 +0530 Subject: [PATCH 1/5] feat: initial implementation of SDS-Repair --- library/libsds.nim | 8 +- .../requests/sds_lifecycle_request.nim | 2 +- sds.nim | 109 ++++++- sds/message.nim | 2 + sds/protobuf.nim | 43 ++- sds/sds_utils.nim | 68 ++++- sds/types.nim | 2 + sds/types/app_callbacks.nim | 3 + sds/types/callbacks.nim | 2 + sds/types/channel_context.nim | 13 +- sds/types/history_entry.nim | 10 +- sds/types/reliability_config.nim | 21 ++ sds/types/reliability_manager.nim | 9 +- sds/types/repair_entry.nim | 28 ++ sds/types/sds_message.nim | 6 +- sds/types/sds_message_id.nim | 1 + tests/test_reliability.nim | 274 ++++++++++++++++++ 17 files changed, 577 insertions(+), 24 deletions(-) create mode 100644 sds/types/repair_entry.nim diff --git a/library/libsds.nim b/library/libsds.nim index 4ae285f..af05857 100644 --- a/library/libsds.nim +++ b/library/libsds.nim @@ -16,7 +16,7 @@ import sds, ./events/[ json_message_ready_event, json_message_sent_event, json_missing_dependencies_event, - json_periodic_sync_event, + json_periodic_sync_event, json_repair_ready_event, ] ################################################################################ @@ -114,6 +114,11 @@ proc onPeriodicSync(ctx: ptr SdsContext): PeriodicSyncCallback = callEventCallback(ctx, "onPeriodicSync"): $JsonPeriodicSyncEvent.new() +proc onRepairReady(ctx: ptr SdsContext): RepairReadyCallback = + return proc(message: seq[byte], channelId: SdsChannelID) {.gcsafe.} = + callEventCallback(ctx, "onRepairReady"): + $JsonRepairReadyEvent.new(message, channelId) + proc onRetrievalHint(ctx: ptr SdsContext): RetrievalHintProvider = return proc(messageId: SdsMessageID): seq[byte] {.gcsafe.} = if isNil(ctx.retrievalHintProvider): @@ -196,6 +201,7 @@ proc SdsNewReliabilityManager( missingDependenciesCb: onMissingDependencies(ctx), periodicSyncCb: onPeriodicSync(ctx), retrievalHintProvider: onRetrievalHint(ctx), + repairReadyCb: onRepairReady(ctx), ) let retCode = handleRequest( diff --git a/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim b/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim index 8d2e9bc..a0f3adb 100644 --- a/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim +++ b/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim @@ -40,7 +40,7 @@ proc createReliabilityManager( rm.setCallbacks( appCallbacks.messageReadyCb, appCallbacks.messageSentCb, appCallbacks.missingDependenciesCb, appCallbacks.periodicSyncCb, - appCallbacks.retrievalHintProvider, + appCallbacks.retrievalHintProvider, appCallbacks.repairReadyCb, ) return ok(rm) diff --git a/sds.nim b/sds.nim index 58d1893..d9c4b82 100644 --- a/sds.nim +++ b/sds.nim @@ -5,11 +5,12 @@ import sds/[types, protobuf, sds_utils, rolling_bloom_filter] export types, protobuf, sds_utils, rolling_bloom_filter proc newReliabilityManager*( - config: ReliabilityConfig = defaultConfig() + config: ReliabilityConfig = defaultConfig(), + participantId: SdsParticipantID = "", ): Result[ReliabilityManager, ReliabilityError] = ## Creates a new multi-channel ReliabilityManager. try: - let rm = ReliabilityManager.new(config) + let rm = ReliabilityManager.new(config, participantId) return ok(rm) except Exception: error "Failed to create ReliabilityManager", msg = getCurrentExceptionMsg() @@ -88,6 +89,17 @@ proc wrapOutgoingMessage*( error "Failed to serialize bloom filter", channelId = channelId return err(ReliabilityError.reSerializationError) + # SDS-R: collect eligible expired repair requests to attach + var repairReqs: seq[HistoryEntry] = @[] + let now = getTime() + var expiredKeys: seq[SdsMessageID] = @[] + for msgId, repairEntry in channel.outgoingRepairBuffer: + if now >= repairEntry.tReq and repairReqs.len < rm.config.maxRepairRequests: + repairReqs.add(repairEntry.entry) + expiredKeys.add(msgId) + for key in expiredKeys: + channel.outgoingRepairBuffer.del(key) + let msg = SdsMessage.init( messageId = messageId, lamportTimestamp = channel.lamportTimestamp, @@ -95,6 +107,7 @@ proc wrapOutgoingMessage*( channelId = channelId, content = message, bloomFilter = bfResult.get(), + repairRequest = repairReqs, ) channel.outgoingBuffer.add( @@ -172,6 +185,36 @@ proc unwrapReceivedMessage*( rm.updateLamportTimestamp(msg.lamportTimestamp, channelId) rm.reviewAckStatus(msg) + # SDS-R: remove this message from repair buffers (dependency now met) + channel.outgoingRepairBuffer.del(msg.messageId) + channel.incomingRepairBuffer.del(msg.messageId) + + # SDS-R: cache the raw message for potential repair responses + if channel.messageCache.len < rm.config.maxMessageHistory: + channel.messageCache[msg.messageId] = message + + # SDS-R: process incoming repair requests from this message + let now = getTime() + for repairEntry in msg.repairRequest: + # Remove from our own outgoing repair buffer (someone else is also requesting) + channel.outgoingRepairBuffer.del(repairEntry.messageId) + # Check if we can respond to this repair request + if repairEntry.messageId in channel.messageCache and + rm.participantId.len > 0 and repairEntry.senderId.len > 0: + if isInResponseGroup( + rm.participantId, repairEntry.senderId, + repairEntry.messageId, rm.config.numResponseGroups + ): + let tResp = computeTResp( + rm.participantId, repairEntry.senderId, + repairEntry.messageId, rm.config.repairTMax + ) + channel.incomingRepairBuffer[repairEntry.messageId] = IncomingRepairEntry( + entry: repairEntry, + cachedMessage: channel.messageCache[repairEntry.messageId], + tResp: now + tResp, + ) + var missingDeps = rm.checkDependencies(msg.causalHistory, channelId) if missingDeps.len == 0: @@ -197,6 +240,19 @@ proc unwrapReceivedMessage*( if not rm.onMissingDependencies.isNil(): rm.onMissingDependencies(msg.messageId, missingDeps, channelId) + # SDS-R: add missing deps to outgoing repair buffer + if rm.participantId.len > 0: + for dep in missingDeps: + if dep.messageId notin channel.outgoingRepairBuffer: + let tReq = computeTReq( + rm.participantId, dep.messageId, + rm.config.repairTMin, rm.config.repairTMax + ) + channel.outgoingRepairBuffer[dep.messageId] = OutgoingRepairEntry( + entry: dep, + tReq: now + tReq, + ) + return ok((msg.content, missingDeps, channelId)) except Exception: error "Failed to unwrap message", msg = getCurrentExceptionMsg() @@ -220,6 +276,10 @@ proc markDependenciesMet*( if msgId in entry.missingDeps: channel.incomingBuffer[pendingId].missingDeps.excl(msgId) + # SDS-R: clear from repair buffers (dependency now met) + channel.outgoingRepairBuffer.del(msgId) + channel.incomingRepairBuffer.del(msgId) + rm.processIncomingBuffer(channelId) return ok() except Exception: @@ -234,6 +294,7 @@ proc setCallbacks*( onMissingDependencies: MissingDependenciesCallback, onPeriodicSync: PeriodicSyncCallback = nil, onRetrievalHint: RetrievalHintProvider = nil, + onRepairReady: RepairReadyCallback = nil, ) = ## Sets the callback functions for various events in the ReliabilityManager. withLock rm.lock: @@ -242,6 +303,7 @@ proc setCallbacks*( rm.onMissingDependencies = onMissingDependencies rm.onPeriodicSync = onPeriodicSync rm.onRetrievalHint = onRetrievalHint + rm.onRepairReady = onRepairReady proc checkUnacknowledgedMessages( rm: ReliabilityManager, channelId: SdsChannelID @@ -299,10 +361,50 @@ proc periodicSyncMessage( error "Error in periodic sync", msg = getCurrentExceptionMsg() await sleepAsync(chronos.seconds(rm.config.syncMessageInterval.inSeconds)) +proc periodicRepairSweep( + rm: ReliabilityManager +) {.async: (raises: [CancelledError]), gcsafe.} = + ## SDS-R: Periodically checks repair buffers for expired entries. + ## - Incoming: fires onRepairReady for expired T_resp entries + ## - Outgoing: drops entries past T_max + while true: + try: + let now = getTime() + for channelId, channel in rm.channels: + try: + # Check incoming repair buffer for expired T_resp (time to rebroadcast) + var toRebroadcast: seq[SdsMessageID] = @[] + for msgId, entry in channel.incomingRepairBuffer: + if now >= entry.tResp: + toRebroadcast.add(msgId) + + for msgId in toRebroadcast: + let entry = channel.incomingRepairBuffer[msgId] + channel.incomingRepairBuffer.del(msgId) + if not rm.onRepairReady.isNil(): + rm.onRepairReady(entry.cachedMessage, channelId) + + # Drop expired outgoing repair entries past T_max + var toRemove: seq[SdsMessageID] = @[] + let tMaxDuration = rm.config.repairTMax + for msgId, entry in channel.outgoingRepairBuffer: + if now - entry.tReq > tMaxDuration: + toRemove.add(msgId) + for msgId in toRemove: + channel.outgoingRepairBuffer.del(msgId) + except Exception: + error "Error in repair sweep for channel", + channelId = channelId, msg = getCurrentExceptionMsg() + except Exception: + error "Error in periodic repair sweep", msg = getCurrentExceptionMsg() + + await sleepAsync(chronos.milliseconds(rm.config.repairSweepInterval.inMilliseconds)) + proc startPeriodicTasks*(rm: ReliabilityManager) = ## Starts the periodic tasks for buffer sweeping and sync message sending. asyncSpawn rm.periodicBufferSweep() asyncSpawn rm.periodicSyncMessage() + asyncSpawn rm.periodicRepairSweep() proc resetReliabilityManager*(rm: ReliabilityManager): Result[void, ReliabilityError] = ## Resets the ReliabilityManager to its initial state. @@ -313,6 +415,9 @@ proc resetReliabilityManager*(rm: ReliabilityManager): Result[void, ReliabilityE channel.messageHistory.setLen(0) channel.outgoingBuffer.setLen(0) channel.incomingBuffer.clear() + channel.outgoingRepairBuffer.clear() + channel.incomingRepairBuffer.clear() + channel.messageCache.clear() channel.bloomFilter = RollingBloomFilter.init(rm.config.bloomFilterCapacity, rm.config.bloomFilterErrorRate) rm.channels.clear() diff --git a/sds/message.nim b/sds/message.nim index ddf5e5f..410fc43 100644 --- a/sds/message.nim +++ b/sds/message.nim @@ -3,6 +3,7 @@ import ./types/history_entry import ./types/sds_message import ./types/unacknowledged_message import ./types/incoming_message +import ./types/repair_entry import ./types/reliability_config export @@ -11,4 +12,5 @@ export sds_message, unacknowledged_message, incoming_message, + repair_entry, reliability_config diff --git a/sds/protobuf.nim b/sds/protobuf.nim index ba1b7ff..63830c7 100644 --- a/sds/protobuf.nim +++ b/sds/protobuf.nim @@ -5,6 +5,24 @@ import ./protobufutil import ./bloom import ./sds_utils +proc encodeHistoryEntry*(entry: HistoryEntry): ProtoBuffer = + var entryPb = initProtoBuffer() + entryPb.write(1, entry.messageId) + if entry.retrievalHint.len > 0: + entryPb.write(2, entry.retrievalHint) + if entry.senderId.len > 0: + entryPb.write(3, entry.senderId) + entryPb.finish() + entryPb + +proc decodeHistoryEntry*(entryPb: ProtoBuffer): ProtobufResult[HistoryEntry] = + var entry = HistoryEntry.init("") + if not ?entryPb.getField(1, entry.messageId): + return err(ProtobufError.missingRequiredField("HistoryEntry.messageId")) + discard entryPb.getField(2, entry.retrievalHint) + discard entryPb.getField(3, entry.senderId) + ok(entry) + proc encode*(msg: SdsMessage): ProtoBuffer = var pb = initProtoBuffer() @@ -12,16 +30,17 @@ proc encode*(msg: SdsMessage): ProtoBuffer = pb.write(2, uint64(msg.lamportTimestamp)) for entry in msg.causalHistory: - var entryPb = initProtoBuffer() - entryPb.write(1, entry.messageId) - if entry.retrievalHint.len > 0: - entryPb.write(2, entry.retrievalHint) - entryPb.finish() + let entryPb = encodeHistoryEntry(entry) pb.write(3, entryPb.buffer) pb.write(4, msg.channelId) pb.write(5, msg.content) pb.write(6, msg.bloomFilter) + + for entry in msg.repairRequest: + let entryPb = encodeHistoryEntry(entry) + pb.write(13, entryPb.buffer) + pb.finish() return pb @@ -44,11 +63,7 @@ proc decode*(T: type SdsMessage, buffer: seq[byte]): ProtobufResult[T] = # New format: repeated HistoryEntry for histBuffer in historyBuffers: let entryPb = initProtoBuffer(histBuffer) - var entry = HistoryEntry.init("") - if not ?entryPb.getField(1, entry.messageId): - return err(ProtobufError.missingRequiredField("HistoryEntry.messageId")) - # retrievalHint is optional - discard entryPb.getField(2, entry.retrievalHint) + let entry = ?decodeHistoryEntry(entryPb) msg.causalHistory.add(entry) else: # Try old format: repeated string @@ -66,6 +81,14 @@ proc decode*(T: type SdsMessage, buffer: seq[byte]): ProtobufResult[T] = if not ?pb.getField(6, msg.bloomFilter): msg.bloomFilter = @[] # Empty if not present + # SDS-R: decode repair request (field 13, optional) + var repairBuffers: seq[seq[byte]] + if pb.getRepeatedField(13, repairBuffers).isOk(): + for repairBuffer in repairBuffers: + let entryPb = initProtoBuffer(repairBuffer) + let entry = ?decodeHistoryEntry(entryPb) + msg.repairRequest.add(entry) + return ok(msg) proc extractChannelId*(data: seq[byte]): Result[SdsChannelID, ReliabilityError] = diff --git a/sds/sds_utils.nim b/sds/sds_utils.nim index f1a68ca..f979b3e 100644 --- a/sds/sds_utils.nim +++ b/sds/sds_utils.nim @@ -1,15 +1,15 @@ -import std/[locks, tables, sequtils] +import std/[times, locks, tables, sequtils, hashes] import chronicles, results import ./rolling_bloom_filter import ./types/[ sds_message_id, history_entry, sds_message, unacknowledged_message, incoming_message, - reliability_error, callbacks, app_callbacks, reliability_config, channel_context, - reliability_manager, + reliability_error, callbacks, app_callbacks, reliability_config, repair_entry, + channel_context, reliability_manager, ] export sds_message_id, history_entry, sds_message, unacknowledged_message, incoming_message, - reliability_error, callbacks, app_callbacks, reliability_config, channel_context, - reliability_manager + reliability_error, callbacks, app_callbacks, reliability_config, repair_entry, + channel_context, reliability_manager proc defaultConfig*(): ReliabilityConfig = return ReliabilityConfig.init() @@ -22,6 +22,9 @@ proc cleanup*(rm: ReliabilityManager) {.raises: [].} = channel.outgoingBuffer.setLen(0) channel.incomingBuffer.clear() channel.messageHistory.setLen(0) + channel.outgoingRepairBuffer.clear() + channel.incomingRepairBuffer.clear() + channel.messageCache.clear() rm.channels.clear() except Exception: error "Error during cleanup", error = getCurrentExceptionMsg() @@ -70,6 +73,58 @@ proc toCausalHistory*(messageIds: seq[SdsMessageID]): seq[HistoryEntry] = proc getMessageIds*(causalHistory: seq[HistoryEntry]): seq[SdsMessageID] = return causalHistory.mapIt(it.messageId) +## SDS-R: Repair computation functions + +proc computeTReq*( + participantId: SdsParticipantID, + messageId: SdsMessageID, + tMin: Duration, + tMax: Duration, +): Duration = + ## Computes the repair request backoff duration per SDS-R spec: + ## T_req = hash(participant_id, message_id) % (T_max - T_min) + T_min + let h = abs(hash(participantId & messageId)) + let rangeMs = tMax.inMilliseconds - tMin.inMilliseconds + if rangeMs <= 0: + return tMin + let offsetMs = h mod rangeMs + initDuration(milliseconds = tMin.inMilliseconds + offsetMs) + +proc computeTResp*( + participantId: SdsParticipantID, + senderId: SdsParticipantID, + messageId: SdsMessageID, + tMax: Duration, +): Duration = + ## Computes the repair response backoff duration per SDS-R spec: + ## distance = hash(participant_id) XOR hash(sender_id) + ## T_resp = distance * hash(message_id) % T_max + ## Original sender has distance=0, so T_resp=0 (responds immediately). + let distance = abs(hash(participantId) xor hash(senderId)) + let msgHash = abs(hash(messageId)) + let tMaxMs = tMax.inMilliseconds + if tMaxMs <= 0 or distance == 0: + return initDuration(milliseconds = 0) + # Use uint64 to avoid overflow on multiplication + let d = uint64(distance mod tMaxMs) + let m = uint64(msgHash mod tMaxMs) + let offsetMs = int64((d * m) mod uint64(tMaxMs)) + initDuration(milliseconds = offsetMs) + +proc isInResponseGroup*( + participantId: SdsParticipantID, + senderId: SdsParticipantID, + messageId: SdsMessageID, + numResponseGroups: int, +): bool = + ## Determines if this participant is in the response group for a given message per SDS-R spec: + ## hash(participant_id, message_id) % num_groups == hash(sender_id, message_id) % num_groups + if numResponseGroups <= 1: + return true # All participants in the same group + let myGroup = abs(hash(participantId & messageId)) mod numResponseGroups + let senderGroup = abs(hash(senderId & messageId)) mod numResponseGroups + myGroup == senderGroup + proc getRecentHistoryEntries*( rm: ReliabilityManager, n: int, channelId: SdsChannelID ): seq[HistoryEntry] = @@ -188,6 +243,9 @@ proc removeChannel*( channel.outgoingBuffer.setLen(0) channel.incomingBuffer.clear() channel.messageHistory.setLen(0) + channel.outgoingRepairBuffer.clear() + channel.incomingRepairBuffer.clear() + channel.messageCache.clear() rm.channels.del(channelId) return ok() except Exception: diff --git a/sds/types.nim b/sds/types.nim index f37518a..637ec54 100644 --- a/sds/types.nim +++ b/sds/types.nim @@ -9,6 +9,7 @@ import sds/types/reliability_error import sds/types/callbacks import sds/types/app_callbacks import sds/types/reliability_config +import sds/types/repair_entry import sds/types/channel_context import sds/types/reliability_manager import sds/types/protobuf_error @@ -25,6 +26,7 @@ export callbacks, app_callbacks, reliability_config, + repair_entry, channel_context, reliability_manager, protobuf_error diff --git a/sds/types/app_callbacks.nim b/sds/types/app_callbacks.nim index 985a97f..84873a6 100644 --- a/sds/types/app_callbacks.nim +++ b/sds/types/app_callbacks.nim @@ -7,6 +7,7 @@ type AppCallbacks* = ref object missingDependenciesCb*: MissingDependenciesCallback periodicSyncCb*: PeriodicSyncCallback retrievalHintProvider*: RetrievalHintProvider + repairReadyCb*: RepairReadyCallback proc new*( T: type AppCallbacks, @@ -15,6 +16,7 @@ proc new*( missingDependenciesCb: MissingDependenciesCallback = nil, periodicSyncCb: PeriodicSyncCallback = nil, retrievalHintProvider: RetrievalHintProvider = nil, + repairReadyCb: RepairReadyCallback = nil, ): T = return T( messageReadyCb: messageReadyCb, @@ -22,4 +24,5 @@ proc new*( missingDependenciesCb: missingDependenciesCb, periodicSyncCb: periodicSyncCb, retrievalHintProvider: retrievalHintProvider, + repairReadyCb: repairReadyCb, ) diff --git a/sds/types/callbacks.nim b/sds/types/callbacks.nim index f1fc4b3..1894f14 100644 --- a/sds/types/callbacks.nim +++ b/sds/types/callbacks.nim @@ -16,3 +16,5 @@ type RetrievalHintProvider* = proc(messageId: SdsMessageID): seq[byte] {.gcsafe.} PeriodicSyncCallback* = proc() {.gcsafe, raises: [].} + + RepairReadyCallback* = proc(message: seq[byte], channelId: SdsChannelID) {.gcsafe.} diff --git a/sds/types/channel_context.nim b/sds/types/channel_context.nim index 0346d18..cec11dc 100644 --- a/sds/types/channel_context.nim +++ b/sds/types/channel_context.nim @@ -3,7 +3,10 @@ import ./sds_message_id import ./rolling_bloom_filter import ./unacknowledged_message import ./incoming_message -export sds_message_id, rolling_bloom_filter, unacknowledged_message, incoming_message +import ./repair_entry +export + sds_message_id, rolling_bloom_filter, unacknowledged_message, incoming_message, + repair_entry type ChannelContext* = ref object lamportTimestamp*: int64 @@ -11,6 +14,11 @@ type ChannelContext* = ref object bloomFilter*: RollingBloomFilter outgoingBuffer*: seq[UnacknowledgedMessage] incomingBuffer*: Table[SdsMessageID, IncomingMessage] + ## SDS-R buffers + outgoingRepairBuffer*: Table[SdsMessageID, OutgoingRepairEntry] + incomingRepairBuffer*: Table[SdsMessageID, IncomingRepairEntry] + messageCache*: Table[SdsMessageID, seq[byte]] + ## Cached serialized messages for repair responses proc new*(T: type ChannelContext, bloomFilter: RollingBloomFilter): T = return T( @@ -19,4 +27,7 @@ proc new*(T: type ChannelContext, bloomFilter: RollingBloomFilter): T = bloomFilter: bloomFilter, outgoingBuffer: @[], incomingBuffer: initTable[SdsMessageID, IncomingMessage](), + outgoingRepairBuffer: initTable[SdsMessageID, OutgoingRepairEntry](), + incomingRepairBuffer: initTable[SdsMessageID, IncomingRepairEntry](), + messageCache: initTable[SdsMessageID, seq[byte]](), ) diff --git a/sds/types/history_entry.nim b/sds/types/history_entry.nim index 2435e6f..b55fc20 100644 --- a/sds/types/history_entry.nim +++ b/sds/types/history_entry.nim @@ -3,6 +3,12 @@ import ./sds_message_id type HistoryEntry* = object messageId*: SdsMessageID retrievalHint*: seq[byte] ## Optional hint for efficient retrieval (e.g., Waku message hash) + senderId*: string ## Original message sender's participant ID (SDS-R) -proc init*(T: type HistoryEntry, messageId: SdsMessageID, retrievalHint: seq[byte] = @[]): T = - return T(messageId: messageId, retrievalHint: retrievalHint) +proc init*( + T: type HistoryEntry, + messageId: SdsMessageID, + retrievalHint: seq[byte] = @[], + senderId: string = "", +): T = + return T(messageId: messageId, retrievalHint: retrievalHint, senderId: senderId) diff --git a/sds/types/reliability_config.nim b/sds/types/reliability_config.nim index f4e4e78..7cd20f2 100644 --- a/sds/types/reliability_config.nim +++ b/sds/types/reliability_config.nim @@ -7,6 +7,11 @@ const DefaultMaxResendAttempts* = 5 DefaultSyncMessageInterval* = initDuration(seconds = 30) DefaultBufferSweepInterval* = initDuration(seconds = 60) + DefaultRepairTMin* = initDuration(seconds = 30) + DefaultRepairTMax* = initDuration(seconds = 300) + DefaultNumResponseGroups* = 1 + DefaultMaxRepairRequests* = 3 + DefaultRepairSweepInterval* = initDuration(seconds = 5) MaxMessageSize* = 1024 * 1024 # 1 MB import ./rolling_bloom_filter @@ -21,6 +26,12 @@ type ReliabilityConfig* {.requiresInit.} = object maxResendAttempts*: int syncMessageInterval*: Duration bufferSweepInterval*: Duration + ## SDS-R config + repairTMin*: Duration + repairTMax*: Duration + numResponseGroups*: int + maxRepairRequests*: int + repairSweepInterval*: Duration proc init*( T: type ReliabilityConfig, @@ -32,6 +43,11 @@ proc init*( maxResendAttempts: int = DefaultMaxResendAttempts, syncMessageInterval: Duration = DefaultSyncMessageInterval, bufferSweepInterval: Duration = DefaultBufferSweepInterval, + repairTMin: Duration = DefaultRepairTMin, + repairTMax: Duration = DefaultRepairTMax, + numResponseGroups: int = DefaultNumResponseGroups, + maxRepairRequests: int = DefaultMaxRepairRequests, + repairSweepInterval: Duration = DefaultRepairSweepInterval, ): T = return T( bloomFilterCapacity: bloomFilterCapacity, @@ -42,4 +58,9 @@ proc init*( maxResendAttempts: maxResendAttempts, syncMessageInterval: syncMessageInterval, bufferSweepInterval: bufferSweepInterval, + repairTMin: repairTMin, + repairTMax: repairTMax, + numResponseGroups: numResponseGroups, + maxRepairRequests: maxRepairRequests, + repairSweepInterval: repairSweepInterval, ) diff --git a/sds/types/reliability_manager.nim b/sds/types/reliability_manager.nim index 9bfc244..5545859 100644 --- a/sds/types/reliability_manager.nim +++ b/sds/types/reliability_manager.nim @@ -9,6 +9,7 @@ export sds_message_id, history_entry, callbacks, reliability_config, channel_con type ReliabilityManager* = ref object channels*: Table[SdsChannelID, ChannelContext] config*: ReliabilityConfig + participantId*: SdsParticipantID lock*: Lock onMessageReady*: proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} onMessageSent*: proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} @@ -17,11 +18,17 @@ type ReliabilityManager* = ref object ) {.gcsafe.} onPeriodicSync*: PeriodicSyncCallback onRetrievalHint*: RetrievalHintProvider + onRepairReady*: RepairReadyCallback -proc new*(T: type ReliabilityManager, config: ReliabilityConfig): T = +proc new*( + T: type ReliabilityManager, + config: ReliabilityConfig, + participantId: SdsParticipantID = "", +): T = let rm = T( channels: initTable[SdsChannelID, ChannelContext](), config: config, + participantId: participantId, ) rm.lock.initLock() return rm diff --git a/sds/types/repair_entry.nim b/sds/types/repair_entry.nim new file mode 100644 index 0000000..01f0fd5 --- /dev/null +++ b/sds/types/repair_entry.nim @@ -0,0 +1,28 @@ +import std/times +import ./history_entry +export history_entry + +type + OutgoingRepairEntry* = object + ## Entry in the outgoing repair request buffer (SDS-R). + ## Tracks a missing message we want to request repair for. + entry*: HistoryEntry ## The missing history entry + tReq*: Time ## Timestamp after which we will include this in a repair request + + IncomingRepairEntry* = object + ## Entry in the incoming repair request buffer (SDS-R). + ## Tracks a repair request from a remote peer that we might respond to. + entry*: HistoryEntry ## The requested history entry + cachedMessage*: seq[byte] ## Full serialized SDS message for rebroadcast + tResp*: Time ## Timestamp after which we will rebroadcast + +proc init*(T: type OutgoingRepairEntry, entry: HistoryEntry, tReq: Time): T = + return T(entry: entry, tReq: tReq) + +proc init*( + T: type IncomingRepairEntry, + entry: HistoryEntry, + cachedMessage: seq[byte], + tResp: Time, +): T = + return T(entry: entry, cachedMessage: cachedMessage, tResp: tResp) diff --git a/sds/types/sds_message.nim b/sds/types/sds_message.nim index 12f7add..b50380c 100644 --- a/sds/types/sds_message.nim +++ b/sds/types/sds_message.nim @@ -2,13 +2,15 @@ import ./sds_message_id import ./history_entry export sds_message_id, history_entry -type SdsMessage* {.requiresInit.} = object +type SdsMessage* = object messageId*: SdsMessageID lamportTimestamp*: int64 causalHistory*: seq[HistoryEntry] channelId*: SdsChannelID content*: seq[byte] bloomFilter*: seq[byte] + repairRequest*: seq[HistoryEntry] + ## Capped list of missing entries requesting repair (SDS-R) proc init*( T: type SdsMessage, @@ -18,6 +20,7 @@ proc init*( channelId: SdsChannelID, content: seq[byte], bloomFilter: seq[byte], + repairRequest: seq[HistoryEntry] = @[], ): T = return T( messageId: messageId, @@ -26,4 +29,5 @@ proc init*( channelId: channelId, content: content, bloomFilter: bloomFilter, + repairRequest: repairRequest, ) diff --git a/sds/types/sds_message_id.nim b/sds/types/sds_message_id.nim index 3e8b7c7..dfeb025 100644 --- a/sds/types/sds_message_id.nim +++ b/sds/types/sds_message_id.nim @@ -1,3 +1,4 @@ type SdsMessageID* = string SdsChannelID* = string + SdsParticipantID* = string diff --git a/tests/test_reliability.nim b/tests/test_reliability.nim index 7100606..aa0eb06 100644 --- a/tests/test_reliability.nim +++ b/tests/test_reliability.nim @@ -741,3 +741,277 @@ suite "Multi-Channel ReliabilityManager Tests": # Dependencies in channel1 should not affect channel2 check rm.channels[channel1].bloomFilter.contains("dep1") check not rm.channels[channel2].bloomFilter.contains("dep1") + +# SDS-R Repair tests +suite "SDS-R: Computation Functions": + test "computeTReq returns duration in [tMin, tMax)": + let tMin = initDuration(seconds = 30) + let tMax = initDuration(seconds = 300) + let d = computeTReq("participant1", "msg1", tMin, tMax) + check: + d.inMilliseconds >= tMin.inMilliseconds + d.inMilliseconds < tMax.inMilliseconds + + test "computeTReq is deterministic for same inputs": + let tMin = initDuration(seconds = 30) + let tMax = initDuration(seconds = 300) + let d1 = computeTReq("p1", "m1", tMin, tMax) + let d2 = computeTReq("p1", "m1", tMin, tMax) + check d1 == d2 + + test "computeTReq varies with different participants": + let tMin = initDuration(seconds = 30) + let tMax = initDuration(seconds = 300) + let d1 = computeTReq("participant-A", "msg1", tMin, tMax) + let d2 = computeTReq("participant-B", "msg1", tMin, tMax) + # Different participants should generally get different backoff (not guaranteed but highly likely) + # Just check both are in valid range + check: + d1.inMilliseconds >= tMin.inMilliseconds + d2.inMilliseconds >= tMin.inMilliseconds + + test "computeTResp original sender has zero distance": + let d = computeTResp("sender1", "sender1", "msg1", initDuration(seconds = 300)) + check d.inMilliseconds == 0 + + test "computeTResp non-sender has positive backoff": + let d = computeTResp("other-node", "sender1", "msg1", initDuration(seconds = 300)) + check d.inMilliseconds >= 0 + + test "isInResponseGroup all in same group when numGroups=1": + check isInResponseGroup("p1", "sender1", "msg1", 1) == true + check isInResponseGroup("p2", "sender1", "msg1", 1) == true + + test "isInResponseGroup sender always in own group": + # Original sender must always be in their own response group + for groups in 1 .. 10: + check isInResponseGroup("sender1", "sender1", "msg1", groups) == true + +suite "SDS-R: Repair Buffer Management": + var rm: ReliabilityManager + + setup: + let rmResult = newReliabilityManager( + participantId = "test-participant" + ) + check rmResult.isOk() + rm = rmResult.get() + check rm.ensureChannel(testChannel).isOk() + + teardown: + if not rm.isNil: + rm.cleanup() + + test "missing deps added to outgoing repair buffer": + var missingDepsCount = 0 + + rm.setCallbacks( + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, missingDeps: seq[HistoryEntry], channelId: SdsChannelID) {.gcsafe.} = + missingDepsCount += 1, + ) + + # Create a message with a missing dependency + let msg = SdsMessage( + messageId: "msg2", + lamportTimestamp: 2, + causalHistory: @[HistoryEntry(messageId: "msg1", senderId: "sender-A")], + channelId: testChannel, + content: @[byte(2)], + bloomFilter: @[], + ) + + let serialized = serializeMessage(msg).get() + let result = rm.unwrapReceivedMessage(serialized) + check result.isOk() + + # msg1 should be in the outgoing repair buffer + let channel = rm.channels[testChannel] + check: + missingDepsCount == 1 + "msg1" in channel.outgoingRepairBuffer + + test "receiving message clears it from repair buffers": + rm.setCallbacks( + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, missingDeps: seq[HistoryEntry], channelId: SdsChannelID) {.gcsafe.} = discard, + ) + + # First, create the missing dep scenario + let msg2 = SdsMessage( + messageId: "msg2", + lamportTimestamp: 2, + causalHistory: @[HistoryEntry(messageId: "msg1", senderId: "sender-A")], + channelId: testChannel, + content: @[byte(2)], + bloomFilter: @[], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg2).get()) + check "msg1" in rm.channels[testChannel].outgoingRepairBuffer + + # Now receive msg1 — should clear from repair buffer + let msg1 = SdsMessage( + messageId: "msg1", + lamportTimestamp: 1, + causalHistory: @[], + channelId: testChannel, + content: @[byte(1)], + bloomFilter: @[], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg1).get()) + check "msg1" notin rm.channels[testChannel].outgoingRepairBuffer + + test "markDependenciesMet clears repair buffers": + rm.setCallbacks( + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, missingDeps: seq[HistoryEntry], channelId: SdsChannelID) {.gcsafe.} = discard, + ) + + let msg2 = SdsMessage( + messageId: "msg2", + lamportTimestamp: 2, + causalHistory: @[HistoryEntry(messageId: "msg1", senderId: "sender-A")], + channelId: testChannel, + content: @[byte(2)], + bloomFilter: @[], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg2).get()) + check "msg1" in rm.channels[testChannel].outgoingRepairBuffer + + # Mark as met via store retrieval + check rm.markDependenciesMet(@["msg1"], testChannel).isOk() + check "msg1" notin rm.channels[testChannel].outgoingRepairBuffer + + test "expired repair requests attached to outgoing messages": + rm.setCallbacks( + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, missingDeps: seq[HistoryEntry], channelId: SdsChannelID) {.gcsafe.} = discard, + ) + + # Manually add an expired repair entry + let channel = rm.channels[testChannel] + channel.outgoingRepairBuffer["missing-msg"] = OutgoingRepairEntry( + entry: HistoryEntry(messageId: "missing-msg", senderId: "orig-sender"), + tReq: getTime() - initDuration(seconds = 10), # Already expired + ) + + # Send a message — should pick up the expired repair request + let wrapped = rm.wrapOutgoingMessage(@[byte(1)], "new-msg", testChannel) + check wrapped.isOk() + + let unwrapped = deserializeMessage(wrapped.get()).get() + check: + unwrapped.repairRequest.len == 1 + unwrapped.repairRequest[0].messageId == "missing-msg" + # Should be removed from buffer after attaching + "missing-msg" notin channel.outgoingRepairBuffer + + test "incoming repair request adds to incoming repair buffer when eligible": + rm.setCallbacks( + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, channelId: SdsChannelID) {.gcsafe.} = discard, + proc(messageId: SdsMessageID, missingDeps: seq[HistoryEntry], channelId: SdsChannelID) {.gcsafe.} = discard, + ) + + let channel = rm.channels[testChannel] + + # First, cache a message so we can respond to a repair request for it + let cachedMsg = SdsMessage( + messageId: "cached-msg", + lamportTimestamp: 1, + causalHistory: @[], + channelId: testChannel, + content: @[byte(99)], + bloomFilter: @[], + ) + let cachedBytes = serializeMessage(cachedMsg).get() + channel.messageCache["cached-msg"] = cachedBytes + + # Receive a message with a repair request for "cached-msg" + let msgWithRepair = SdsMessage( + messageId: "requester-msg", + lamportTimestamp: 5, + causalHistory: @[], + channelId: testChannel, + content: @[byte(3)], + bloomFilter: @[], + repairRequest: @[HistoryEntry( + messageId: "cached-msg", + senderId: "test-participant", # Same as our participantId so we're in response group + )], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msgWithRepair).get()) + + # We should have added it to the incoming repair buffer (we have the message and are in response group) + check "cached-msg" in channel.incomingRepairBuffer + +suite "SDS-R: Protobuf Roundtrip": + test "senderId in HistoryEntry roundtrips through protobuf": + let msg = SdsMessage( + messageId: "msg1", + lamportTimestamp: 100, + causalHistory: @[ + HistoryEntry(messageId: "dep1", retrievalHint: @[byte(1), 2], senderId: "sender-A"), + HistoryEntry(messageId: "dep2", senderId: "sender-B"), + ], + channelId: "ch1", + content: @[byte(42)], + bloomFilter: @[], + ) + + let serialized = serializeMessage(msg).get() + let decoded = deserializeMessage(serialized).get() + + check: + decoded.causalHistory.len == 2 + decoded.causalHistory[0].messageId == "dep1" + decoded.causalHistory[0].senderId == "sender-A" + decoded.causalHistory[0].retrievalHint == @[byte(1), 2] + decoded.causalHistory[1].messageId == "dep2" + decoded.causalHistory[1].senderId == "sender-B" + + test "repairRequest field roundtrips through protobuf": + let msg = SdsMessage( + messageId: "msg1", + lamportTimestamp: 100, + causalHistory: @[], + channelId: "ch1", + content: @[byte(42)], + bloomFilter: @[], + repairRequest: @[ + HistoryEntry(messageId: "missing1", senderId: "sender-X"), + HistoryEntry(messageId: "missing2", senderId: "sender-Y", retrievalHint: @[byte(5)]), + ], + ) + + let serialized = serializeMessage(msg).get() + let decoded = deserializeMessage(serialized).get() + + check: + decoded.repairRequest.len == 2 + decoded.repairRequest[0].messageId == "missing1" + decoded.repairRequest[0].senderId == "sender-X" + decoded.repairRequest[1].messageId == "missing2" + decoded.repairRequest[1].senderId == "sender-Y" + decoded.repairRequest[1].retrievalHint == @[byte(5)] + + test "backward compat: message without repairRequest decodes fine": + let msg = SdsMessage( + messageId: "msg1", + lamportTimestamp: 100, + causalHistory: @[HistoryEntry(messageId: "dep1")], + channelId: "ch1", + content: @[byte(42)], + bloomFilter: @[], + ) + + let serialized = serializeMessage(msg).get() + let decoded = deserializeMessage(serialized).get() + + check: + decoded.repairRequest.len == 0 + decoded.causalHistory[0].senderId == "" From 219454ce430109334f8979379097f6e254a3b02d Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Sat, 11 Apr 2026 17:23:36 +0530 Subject: [PATCH 2/5] feat: add missing json_repair_ready_event for SDS-R FFI --- library/events/json_repair_ready_event.nim | 20 ++++++++++++++++++++ tests/test_bloom | Bin 0 -> 419624 bytes 2 files changed, 20 insertions(+) create mode 100644 library/events/json_repair_ready_event.nim create mode 100755 tests/test_bloom diff --git a/library/events/json_repair_ready_event.nim b/library/events/json_repair_ready_event.nim new file mode 100644 index 0000000..d34c954 --- /dev/null +++ b/library/events/json_repair_ready_event.nim @@ -0,0 +1,20 @@ +import std/[json, base64] +import ./json_base_event, sds/[message] + +type JsonRepairReadyEvent* = ref object of JsonEvent + channelId*: SdsChannelID + message*: seq[byte] + +proc new*( + T: type JsonRepairReadyEvent, message: seq[byte], channelId: SdsChannelID +): T = + return JsonRepairReadyEvent( + eventType: "repair_ready", message: message, channelId: channelId + ) + +method `$`*(jsonRepairReady: JsonRepairReadyEvent): string = + var node = newJObject() + node["eventType"] = %*jsonRepairReady.eventType + node["channelId"] = %*jsonRepairReady.channelId + node["message"] = %*encode(jsonRepairReady.message) + $node diff --git a/tests/test_bloom b/tests/test_bloom new file mode 100755 index 0000000000000000000000000000000000000000..cf17bfaf8bba21f383239a1ed49bae2bffb889fd GIT binary patch literal 419624 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�dlU0%+g+I$aAyh&80n4;#Gh>AK3GN{lv`g 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ð=&h((79*o$HKG+?H`86FzR6y^`wHN{YSMqT9b_t+WFaqbYO*_R1&LHiaPt!khtk!t5wj1!F3Q+wl>>k1 z0v;UV2=PE;BgnW;9N7sO?^NY!#E~wF?r&;l>|dLM9AaMnOg?up-;?2C7#o#o=6epo z&W_^1f4!gjVkG<&?y}50hcca!`mO~z9ZzJvtpf$_uY&b_;TNQ+| zDXvuVB=NgkC*?`H!WL2}m!0?rrd3lJQl2FJ=5f^|2B9t%>s?j#o5>e4n(bg6BN^o- zO8lWekhkyv#Y9zR2hTr<_Z_TsUl$8KgffKMX9)k;w+AAq%`|_t6mlxWu?WW!yWE8o z_$`!e##*{*y^Cce+QjCf7NBqP+(eTXaJqSJB+9yGF7BfEc5BQ77HgVG+zuTPQZV

-((vN5b*9SSsQ|^Fgm>xH`z_+&b5Wj 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 literal 0 HcmV?d00001 From af93eae19900b456a1834149b69f2cdd9c4b42be Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Sat, 11 Apr 2026 23:46:51 +0530 Subject: [PATCH 3/5] feat: upgrade testbench and claude.md file for better context --- sds.nim | 98 ++++-- sds/protobuf.nim | 6 + sds/sds_utils.nim | 21 +- sds/types/channel_context.nim | 3 + sds/types/sds_message.nim | 3 + tests/test_bloom | Bin 419624 -> 419592 bytes tests/test_reliability.nim | 616 ++++++++++++++++++++++++++++++++++ 7 files changed, 702 insertions(+), 45 deletions(-) diff --git a/sds.nim b/sds.nim index d9c4b82..c4a1482 100644 --- a/sds.nim +++ b/sds.nim @@ -107,6 +107,7 @@ proc wrapOutgoingMessage*( channelId = channelId, content = message, bloomFilter = bfResult.get(), + senderId = rm.participantId, repairRequest = repairReqs, ) @@ -117,7 +118,16 @@ proc wrapOutgoingMessage*( channel.bloomFilter.add(msg.messageId) rm.addToHistory(msg.messageId, channelId) - return serializeMessage(msg) + # SDS-R: record sender for future causal-history entries + if rm.participantId.len > 0: + channel.messageSenders[msg.messageId] = rm.participantId + + let serialized = serializeMessage(msg) + if serialized.isOk(): + # SDS-R: cache serialized bytes so we can serve our own message on repair + if channel.messageCache.len < rm.config.maxMessageHistory: + channel.messageCache[msg.messageId] = serialized.get() + return serialized except Exception: error "Failed to wrap message", channelId = channelId, msg = getCurrentExceptionMsg() @@ -177,6 +187,11 @@ proc unwrapReceivedMessage*( let channel = rm.getOrCreateChannel(channelId) + # SDS-R: opportunistic repair-buffer cleanup — applies to duplicates too, + # so rebroadcasts cancel redundant responses on peers that already have the message. + channel.outgoingRepairBuffer.del(msg.messageId) + channel.incomingRepairBuffer.del(msg.messageId) + if msg.messageId in channel.messageHistory: return ok((msg.content, @[], channelId)) @@ -185,14 +200,14 @@ proc unwrapReceivedMessage*( rm.updateLamportTimestamp(msg.lamportTimestamp, channelId) rm.reviewAckStatus(msg) - # SDS-R: remove this message from repair buffers (dependency now met) - channel.outgoingRepairBuffer.del(msg.messageId) - channel.incomingRepairBuffer.del(msg.messageId) - # SDS-R: cache the raw message for potential repair responses if channel.messageCache.len < rm.config.maxMessageHistory: channel.messageCache[msg.messageId] = message + # SDS-R: record sender so our future causal-history entries carry it + if msg.senderId.len > 0: + channel.messageSenders[msg.messageId] = msg.senderId + # SDS-R: process incoming repair requests from this message let now = getTime() for repairEntry in msg.repairRequest: @@ -228,6 +243,10 @@ proc unwrapReceivedMessage*( IncomingMessage.init(message = msg, missingDeps = initHashSet[SdsMessageID]()) else: rm.addToHistory(msg.messageId, channelId) + # Unblock any buffered messages that were waiting on this one. + for pendingId, entry in channel.incomingBuffer: + if msg.messageId in entry.missingDeps: + channel.incomingBuffer[pendingId].missingDeps.excl(msg.messageId) rm.processIncomingBuffer(channelId) if not rm.onMessageReady.isNil(): rm.onMessageReady(msg.messageId, channelId) @@ -361,43 +380,47 @@ proc periodicSyncMessage( error "Error in periodic sync", msg = getCurrentExceptionMsg() await sleepAsync(chronos.seconds(rm.config.syncMessageInterval.inSeconds)) +proc runRepairSweep*(rm: ReliabilityManager) {.gcsafe, raises: [].} = + ## SDS-R: Runs a single pass of the repair sweep. + ## - Incoming: fires onRepairReady for expired T_resp entries and removes them + ## - Outgoing: drops entries past T_max window + ## Exposed so it can be driven directly in tests; also invoked by periodicRepairSweep. + try: + let now = getTime() + for channelId, channel in rm.channels: + try: + # Check incoming repair buffer for expired T_resp (time to rebroadcast) + var toRebroadcast: seq[SdsMessageID] = @[] + for msgId, entry in channel.incomingRepairBuffer: + if now >= entry.tResp: + toRebroadcast.add(msgId) + + for msgId in toRebroadcast: + let entry = channel.incomingRepairBuffer[msgId] + channel.incomingRepairBuffer.del(msgId) + if not rm.onRepairReady.isNil(): + rm.onRepairReady(entry.cachedMessage, channelId) + + # Drop expired outgoing repair entries past T_max + var toRemove: seq[SdsMessageID] = @[] + let tMaxDuration = rm.config.repairTMax + for msgId, entry in channel.outgoingRepairBuffer: + if now - entry.tReq > tMaxDuration: + toRemove.add(msgId) + for msgId in toRemove: + channel.outgoingRepairBuffer.del(msgId) + except Exception: + error "Error in repair sweep for channel", + channelId = channelId, msg = getCurrentExceptionMsg() + except Exception: + error "Error in repair sweep", msg = getCurrentExceptionMsg() + proc periodicRepairSweep( rm: ReliabilityManager ) {.async: (raises: [CancelledError]), gcsafe.} = ## SDS-R: Periodically checks repair buffers for expired entries. - ## - Incoming: fires onRepairReady for expired T_resp entries - ## - Outgoing: drops entries past T_max while true: - try: - let now = getTime() - for channelId, channel in rm.channels: - try: - # Check incoming repair buffer for expired T_resp (time to rebroadcast) - var toRebroadcast: seq[SdsMessageID] = @[] - for msgId, entry in channel.incomingRepairBuffer: - if now >= entry.tResp: - toRebroadcast.add(msgId) - - for msgId in toRebroadcast: - let entry = channel.incomingRepairBuffer[msgId] - channel.incomingRepairBuffer.del(msgId) - if not rm.onRepairReady.isNil(): - rm.onRepairReady(entry.cachedMessage, channelId) - - # Drop expired outgoing repair entries past T_max - var toRemove: seq[SdsMessageID] = @[] - let tMaxDuration = rm.config.repairTMax - for msgId, entry in channel.outgoingRepairBuffer: - if now - entry.tReq > tMaxDuration: - toRemove.add(msgId) - for msgId in toRemove: - channel.outgoingRepairBuffer.del(msgId) - except Exception: - error "Error in repair sweep for channel", - channelId = channelId, msg = getCurrentExceptionMsg() - except Exception: - error "Error in periodic repair sweep", msg = getCurrentExceptionMsg() - + rm.runRepairSweep() await sleepAsync(chronos.milliseconds(rm.config.repairSweepInterval.inMilliseconds)) proc startPeriodicTasks*(rm: ReliabilityManager) = @@ -418,6 +441,7 @@ proc resetReliabilityManager*(rm: ReliabilityManager): Result[void, ReliabilityE channel.outgoingRepairBuffer.clear() channel.incomingRepairBuffer.clear() channel.messageCache.clear() + channel.messageSenders.clear() channel.bloomFilter = RollingBloomFilter.init(rm.config.bloomFilterCapacity, rm.config.bloomFilterErrorRate) rm.channels.clear() diff --git a/sds/protobuf.nim b/sds/protobuf.nim index 63830c7..24a95d7 100644 --- a/sds/protobuf.nim +++ b/sds/protobuf.nim @@ -37,6 +37,9 @@ proc encode*(msg: SdsMessage): ProtoBuffer = pb.write(5, msg.content) pb.write(6, msg.bloomFilter) + if msg.senderId.len > 0: + pb.write(7, msg.senderId) + for entry in msg.repairRequest: let entryPb = encodeHistoryEntry(entry) pb.write(13, entryPb.buffer) @@ -81,6 +84,9 @@ proc decode*(T: type SdsMessage, buffer: seq[byte]): ProtobufResult[T] = if not ?pb.getField(6, msg.bloomFilter): msg.bloomFilter = @[] # Empty if not present + # SDS-R: decode senderId (field 7, optional) + discard pb.getField(7, msg.senderId) + # SDS-R: decode repair request (field 13, optional) var repairBuffers: seq[seq[byte]] if pb.getRepeatedField(13, repairBuffers).isOk(): diff --git a/sds/sds_utils.nim b/sds/sds_utils.nim index f979b3e..7e4eba6 100644 --- a/sds/sds_utils.nim +++ b/sds/sds_utils.nim @@ -25,6 +25,7 @@ proc cleanup*(rm: ReliabilityManager) {.raises: [].} = channel.outgoingRepairBuffer.clear() channel.incomingRepairBuffer.clear() channel.messageCache.clear() + channel.messageSenders.clear() rm.channels.clear() except Exception: error "Error during cleanup", error = getCurrentExceptionMsg() @@ -128,18 +129,21 @@ proc isInResponseGroup*( proc getRecentHistoryEntries*( rm: ReliabilityManager, n: int, channelId: SdsChannelID ): seq[HistoryEntry] = + ## Get recent history entries for sending in causal history. + ## Populates retrieval hints and senderId (SDS-R) for each entry. try: if channelId in rm.channels: let channel = rm.channels[channelId] let recentMessageIds = channel.messageHistory[max(0, channel.messageHistory.len - n) .. ^1] - if rm.onRetrievalHint.isNil(): - return toCausalHistory(recentMessageIds) - else: - var entries: seq[HistoryEntry] = @[] - for msgId in recentMessageIds: - let hint = rm.onRetrievalHint(msgId) - entries.add(newHistoryEntry(msgId, hint)) - return entries + var entries: seq[HistoryEntry] = @[] + for msgId in recentMessageIds: + var entry = HistoryEntry(messageId: msgId) + if not rm.onRetrievalHint.isNil(): + entry.retrievalHint = rm.onRetrievalHint(msgId) + if msgId in channel.messageSenders: + entry.senderId = channel.messageSenders[msgId] + entries.add(entry) + return entries else: return @[] except Exception: @@ -246,6 +250,7 @@ proc removeChannel*( channel.outgoingRepairBuffer.clear() channel.incomingRepairBuffer.clear() channel.messageCache.clear() + channel.messageSenders.clear() rm.channels.del(channelId) return ok() except Exception: diff --git a/sds/types/channel_context.nim b/sds/types/channel_context.nim index cec11dc..2f61584 100644 --- a/sds/types/channel_context.nim +++ b/sds/types/channel_context.nim @@ -19,6 +19,8 @@ type ChannelContext* = ref object incomingRepairBuffer*: Table[SdsMessageID, IncomingRepairEntry] messageCache*: Table[SdsMessageID, seq[byte]] ## Cached serialized messages for repair responses + messageSenders*: Table[SdsMessageID, SdsParticipantID] + ## SDS-R: msgId -> original sender, used to populate causal-history senderId proc new*(T: type ChannelContext, bloomFilter: RollingBloomFilter): T = return T( @@ -30,4 +32,5 @@ proc new*(T: type ChannelContext, bloomFilter: RollingBloomFilter): T = outgoingRepairBuffer: initTable[SdsMessageID, OutgoingRepairEntry](), incomingRepairBuffer: initTable[SdsMessageID, IncomingRepairEntry](), messageCache: initTable[SdsMessageID, seq[byte]](), + messageSenders: initTable[SdsMessageID, SdsParticipantID](), ) diff --git a/sds/types/sds_message.nim b/sds/types/sds_message.nim index b50380c..6ab7a4f 100644 --- a/sds/types/sds_message.nim +++ b/sds/types/sds_message.nim @@ -9,6 +9,7 @@ type SdsMessage* = object channelId*: SdsChannelID content*: seq[byte] bloomFilter*: seq[byte] + senderId*: SdsParticipantID ## SDS-R: original sender's participant ID repairRequest*: seq[HistoryEntry] ## Capped list of missing entries requesting repair (SDS-R) @@ -20,6 +21,7 @@ proc init*( channelId: SdsChannelID, content: seq[byte], bloomFilter: seq[byte], + senderId: SdsParticipantID = "", repairRequest: seq[HistoryEntry] = @[], ): T = return T( @@ -29,5 +31,6 @@ proc init*( channelId: channelId, content: content, bloomFilter: bloomFilter, + senderId: senderId, repairRequest: repairRequest, ) diff --git a/tests/test_bloom b/tests/test_bloom index cf17bfaf8bba21f383239a1ed49bae2bffb889fd..f4776c4b0cf87a2bdc3c03f5c34db079c02412e5 100755 GIT binary patch delta 40228 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 delta 40314 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 Vxh2r!wyX7+K|8h6q{We{{{u@3TVenJ diff --git a/tests/test_reliability.nim b/tests/test_reliability.nim index aa0eb06..7f738c5 100644 --- a/tests/test_reliability.nim +++ b/tests/test_reliability.nim @@ -1015,3 +1015,619 @@ suite "SDS-R: Protobuf Roundtrip": check: decoded.repairRequest.len == 0 decoded.causalHistory[0].senderId == "" + + test "SdsMessage.senderId roundtrips through protobuf": + let msg = SdsMessage( + messageId: "m1", + lamportTimestamp: 1, + causalHistory: @[], + channelId: "ch1", + content: @[byte(1)], + bloomFilter: @[], + senderId: "alice", + ) + let decoded = deserializeMessage(serializeMessage(msg).get()).get() + check decoded.senderId == "alice" + +# --------------------------------------------------------------------------- +# SDS-R Phase 2 tests: edge cases, lifecycle, sweep, and multi-participant flows +# --------------------------------------------------------------------------- + +suite "SDS-R: Edge Cases and Defensive Branches": + test "computeTReq returns tMin when range is degenerate": + let tMin = initDuration(seconds = 30) + # tMax == tMin + let d1 = computeTReq("p", "m", tMin, tMin) + check d1 == tMin + # tMax < tMin (rangeMs < 0) + let d2 = computeTReq("p", "m", tMin, initDuration(seconds = 10)) + check d2 == tMin + + test "computeTResp returns 0 when tMax is 0": + let d = computeTResp("p", "other", "m", initDuration(milliseconds = 0)) + check d.inMilliseconds == 0 + + test "computeTResp always stays within [0, tMax)": + # Adversarial sweep — result must never wrap negative nor exceed tMax + let tMax = initDuration(seconds = 300) + for i in 0 ..< 500: + let d = computeTResp( + "participant-" & $i, "sender-" & $(i * 13), "msg-" & $(i * 31), tMax + ) + check: + d.inMilliseconds >= 0 + d.inMilliseconds < tMax.inMilliseconds + + test "isInResponseGroup returns true for non-positive numGroups": + check isInResponseGroup("p", "sender", "m", 0) == true + check isInResponseGroup("p", "sender", "m", -1) == true + + test "computeTReq bounds across many random inputs": + let tMin = initDuration(seconds = 30) + let tMax = initDuration(seconds = 300) + for i in 0 ..< 200: + let d = computeTReq("p-" & $i, "m-" & $i, tMin, tMax) + check: + d.inMilliseconds >= tMin.inMilliseconds + d.inMilliseconds < tMax.inMilliseconds + + test "response group distribution is roughly uniform": + # With numGroups=10, ~10% of random participants should share sender's group. + const numGroups = 10 + const totalParticipants = 1000 + let senderId = "alice" + let msgId = "msg-xyz" + var sameGroup = 0 + for i in 0 ..< totalParticipants: + if isInResponseGroup("participant-" & $i, senderId, msgId, numGroups): + sameGroup += 1 + # Expected ~100 (1/N), allow [50, 200] band for hash quirks + check: + sameGroup >= 50 + sameGroup <= 200 + + test "computeTResp monotonicity: self always fastest": + # The original sender (distance=0) must always be first to respond. + let tMax = initDuration(seconds = 300) + let selfD = computeTResp("alice", "alice", "msg-xyz", tMax) + check selfD.inMilliseconds == 0 + for i in 0 ..< 50: + let other = computeTResp("other-" & $i, "alice", "msg-xyz", tMax) + check other.inMilliseconds >= selfD.inMilliseconds + +suite "SDS-R: Lifecycle and State": + test "empty participantId disables outgoing repair creation": + let rm = newReliabilityManager().get() # empty participantId + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + ) + + let msg = SdsMessage( + messageId: "m2", + lamportTimestamp: 2, + causalHistory: @[HistoryEntry(messageId: "m1-missing", senderId: "alice")], + channelId: testChannel, + content: @[byte(2)], + bloomFilter: @[], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg).get()) + check rm.channels[testChannel].outgoingRepairBuffer.len == 0 + + test "empty senderId in incoming repair request is ignored": + let rm = newReliabilityManager(participantId = "bob").get() + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + let channel = rm.channels[testChannel] + channel.messageCache["m-wanted"] = @[byte(99), 99, 99] + + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + ) + + let msg = SdsMessage( + messageId: "req-msg", + lamportTimestamp: 5, + causalHistory: @[], + channelId: testChannel, + content: @[byte(1)], + bloomFilter: @[], + repairRequest: @[HistoryEntry(messageId: "m-wanted", senderId: "")], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg).get()) + check "m-wanted" notin channel.incomingRepairBuffer + + test "wrapOutgoingMessage caches bytes and records sender": + # Proves Bug 1 is fixed — the original sender can serve her own message. + let rm = newReliabilityManager(participantId = "alice").get() + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + + discard rm.wrapOutgoingMessage(@[byte(1), 2, 3], "m1", testChannel) + let channel = rm.channels[testChannel] + check: + "m1" in channel.messageCache + channel.messageCache["m1"].len > 0 + "m1" in channel.messageSenders + channel.messageSenders["m1"] == "alice" + + test "getRecentHistoryEntries carries senderId for own messages": + let rm = newReliabilityManager(participantId = "alice").get() + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + + discard rm.wrapOutgoingMessage(@[byte(1)], "m1", testChannel) + discard rm.wrapOutgoingMessage(@[byte(2)], "m2", testChannel) + let entries = rm.getRecentHistoryEntries(10, testChannel) + check: + entries.len == 2 + entries[0].senderId == "alice" + entries[1].senderId == "alice" + + test "resetReliabilityManager clears all SDS-R state": + let rm = newReliabilityManager(participantId = "alice").get() + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + let channel = rm.channels[testChannel] + + channel.outgoingRepairBuffer["a"] = OutgoingRepairEntry( + entry: HistoryEntry(messageId: "a", senderId: "x"), + tReq: getTime(), + ) + channel.incomingRepairBuffer["b"] = IncomingRepairEntry( + entry: HistoryEntry(messageId: "b", senderId: "y"), + cachedMessage: @[byte(1)], + tResp: getTime(), + ) + channel.messageCache["c"] = @[byte(2)] + channel.messageSenders["c"] = "someone" + + check rm.resetReliabilityManager().isOk() + check rm.ensureChannel(testChannel).isOk() + let ch2 = rm.channels[testChannel] + check: + ch2.outgoingRepairBuffer.len == 0 + ch2.incomingRepairBuffer.len == 0 + ch2.messageCache.len == 0 + ch2.messageSenders.len == 0 + + test "SDS-R state is isolated per channel": + let rm = newReliabilityManager(participantId = "alice").get() + defer: rm.cleanup() + check rm.ensureChannel("ch-A").isOk() + check rm.ensureChannel("ch-B").isOk() + + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + ) + + let msg = SdsMessage( + messageId: "m2", + lamportTimestamp: 2, + causalHistory: @[HistoryEntry(messageId: "m1-missing", senderId: "bob")], + channelId: "ch-A", + content: @[byte(2)], + bloomFilter: @[], + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg).get()) + check: + rm.channels["ch-A"].outgoingRepairBuffer.len == 1 + rm.channels["ch-B"].outgoingRepairBuffer.len == 0 + + test "duplicate message arrival cancels pending incoming repair entry": + # Covers the dedup-before-cleanup fix: a rebroadcast arriving at a peer who + # already has the message must clear that peer's incomingRepairBuffer entry. + let rm = newReliabilityManager(participantId = "carol").get() + defer: rm.cleanup() + check rm.ensureChannel(testChannel).isOk() + let channel = rm.channels[testChannel] + + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + ) + + # Carol already has M1 in history and has a pending incomingRepairBuffer entry + channel.messageHistory.add("m1") + channel.incomingRepairBuffer["m1"] = IncomingRepairEntry( + entry: HistoryEntry(messageId: "m1", senderId: "alice"), + cachedMessage: @[byte(1)], + tResp: getTime() + initDuration(seconds = 10), + ) + + # A rebroadcast of M1 arrives + let msg = SdsMessage( + messageId: "m1", + lamportTimestamp: 1, + causalHistory: @[], + channelId: testChannel, + content: @[byte(1)], + bloomFilter: @[], + senderId: "alice", + ) + discard rm.unwrapReceivedMessage(serializeMessage(msg).get()) + check "m1" notin channel.incomingRepairBuffer + +suite "SDS-R: Repair Sweep": + var rm: ReliabilityManager + + setup: + rm = newReliabilityManager(participantId = "bob").get() + check rm.ensureChannel(testChannel).isOk() + + teardown: + if not rm.isNil: + rm.cleanup() + + test "runRepairSweep fires onRepairReady for expired tResp": + var fireCount = 0 + var firstBytes: seq[byte] = @[] + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + onRepairReady = proc(bytes: seq[byte], ch: SdsChannelID) {.gcsafe.} = + {.cast(gcsafe).}: + fireCount += 1 + if fireCount == 1: + firstBytes = bytes, + ) + + let channel = rm.channels[testChannel] + channel.incomingRepairBuffer["m-ready"] = IncomingRepairEntry( + entry: HistoryEntry(messageId: "m-ready", senderId: "alice"), + cachedMessage: @[byte(1), 2, 3], + tResp: getTime() - initDuration(seconds = 1), # expired + ) + channel.incomingRepairBuffer["m-not-ready"] = IncomingRepairEntry( + entry: HistoryEntry(messageId: "m-not-ready", senderId: "alice"), + cachedMessage: @[byte(9), 9, 9], + tResp: getTime() + initDuration(minutes = 10), # far future + ) + + rm.runRepairSweep() + + check: + fireCount == 1 + firstBytes == @[byte(1), 2, 3] + "m-ready" notin channel.incomingRepairBuffer + "m-not-ready" in channel.incomingRepairBuffer + + test "runRepairSweep drops outgoing entries past T_max window": + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + ) + + let channel = rm.channels[testChannel] + let tMax = rm.config.repairTMax + channel.outgoingRepairBuffer["m-stale"] = OutgoingRepairEntry( + entry: HistoryEntry(messageId: "m-stale", senderId: "alice"), + tReq: getTime() - (tMax + tMax), # now - 2*T_max, past drop window + ) + channel.outgoingRepairBuffer["m-fresh"] = OutgoingRepairEntry( + entry: HistoryEntry(messageId: "m-fresh", senderId: "alice"), + tReq: getTime(), + ) + + rm.runRepairSweep() + + check: + "m-stale" notin channel.outgoingRepairBuffer + "m-fresh" in channel.outgoingRepairBuffer + + test "runRepairSweep no-op when buffers are empty": + var fireCount = 0 + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + onRepairReady = proc(bytes: seq[byte], ch: SdsChannelID) {.gcsafe.} = + fireCount += 1, + ) + rm.runRepairSweep() + check fireCount == 0 + +# --- Multi-participant in-process bus for integration tests --------------- + +type + TestBus = ref object + peers: OrderedTable[SdsParticipantID, ReliabilityManager] + delivered: Table[SdsParticipantID, seq[SdsMessageID]] + # Log of raw message-ids placed on the wire, tagged with the source peer. + wireLog: seq[tuple[senderId: SdsParticipantID, messageId: SdsMessageID]] + +proc newTestBus(): TestBus = + TestBus( + peers: initOrderedTable[SdsParticipantID, ReliabilityManager](), + delivered: initTable[SdsParticipantID, seq[SdsMessageID]](), + wireLog: @[], + ) + +proc recordWire(bus: TestBus, senderId: SdsParticipantID, bytes: seq[byte]) {.gcsafe.} = + let decoded = deserializeMessage(bytes) + if decoded.isOk(): + bus.wireLog.add((senderId, decoded.get().messageId)) + +proc deliverExcept( + bus: TestBus, + senderId: SdsParticipantID, + bytes: seq[byte], + exclude: seq[SdsParticipantID], +) {.gcsafe.} = + for pid, peer in bus.peers: + if pid == senderId or pid in exclude: + continue + discard peer.unwrapReceivedMessage(bytes) + +proc addPeer( + bus: TestBus, + participantId: SdsParticipantID, + config: ReliabilityConfig = defaultConfig(), +): ReliabilityManager = + let rm = newReliabilityManager(config, participantId).get() + doAssert rm.ensureChannel(testChannel).isOk() + bus.peers[participantId] = rm + bus.delivered[participantId] = @[] + + let pid = participantId + let busRef = bus + rm.setCallbacks( + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = + {.cast(gcsafe).}: + busRef.delivered[pid].add(msgId), + proc(msgId: SdsMessageID, ch: SdsChannelID) {.gcsafe.} = discard, + proc(msgId: SdsMessageID, deps: seq[HistoryEntry], ch: SdsChannelID) {.gcsafe.} = discard, + onRepairReady = proc(bytes: seq[byte], ch: SdsChannelID) {.gcsafe.} = + {.cast(gcsafe).}: + busRef.recordWire(pid, bytes) + busRef.deliverExcept(pid, bytes, @[]), + ) + rm + +proc broadcast( + bus: TestBus, + senderId: SdsParticipantID, + content: seq[byte], + messageId: SdsMessageID, + dropAt: seq[SdsParticipantID] = @[], +) = + let rm = bus.peers[senderId] + let wrapped = rm.wrapOutgoingMessage(content, messageId, testChannel) + doAssert wrapped.isOk() + bus.recordWire(senderId, wrapped.get()) + bus.deliverExcept(senderId, wrapped.get(), dropAt) + +proc forceOutgoingExpired( + rm: ReliabilityManager, messageId: SdsMessageID +) = + ## Push a specific outgoingRepairBuffer entry's tReq into the past so the + ## next wrapOutgoingMessage will pick it up. + let channel = rm.channels[testChannel] + if messageId in channel.outgoingRepairBuffer: + channel.outgoingRepairBuffer[messageId].tReq = + getTime() - initDuration(seconds = 1) + +proc forceIncomingExpired( + rm: ReliabilityManager, messageId: SdsMessageID +) = + ## Push an incomingRepairBuffer entry's tResp into the past so runRepairSweep fires it. + let channel = rm.channels[testChannel] + if messageId in channel.incomingRepairBuffer: + channel.incomingRepairBuffer[messageId].tResp = + getTime() - initDuration(seconds = 1) + +suite "SDS-R: Multi-Participant Integration": + + test "basic single-gap repair (Alice -> Bob misses -> Carol's message triggers repair)": + let bus = newTestBus() + let alice = bus.addPeer("alice") + let bob = bus.addPeer("bob") + let carol = bus.addPeer("carol") + + # Alice sends M1, but Bob is offline for this one. + bus.broadcast("alice", @[byte(1)], "m1", dropAt = @["bob".SdsParticipantID]) + # Carol now has M1; Bob does not. + check "m1" in carol.channels[testChannel].messageHistory + check "m1" notin bob.channels[testChannel].messageHistory + + # Carol sends M2 with causal history referencing M1. + bus.broadcast("carol", @[byte(2)], "m2") + # Bob detects M1 missing and populates his outgoingRepairBuffer. + check "m1" in bob.channels[testChannel].outgoingRepairBuffer + # Bob should have buffered M2. + check "m2" in bob.channels[testChannel].incomingBuffer + check "m2" notin bus.delivered["bob"] + + # Force Bob's T_req so the next wrap attaches the repair request. + bob.forceOutgoingExpired("m1") + + # Bob sends M3 — it must carry repair_request=[M1, sender=alice]. + bus.broadcast("bob", @[byte(3)], "m3") + + # Alice received M3, saw the repair_request, cached-bypass and response-group + # checks pass, so she has an incomingRepairBuffer entry for M1 with tResp=0. + check "m1" in alice.channels[testChannel].incomingRepairBuffer + + # Force alice's tResp to past just to be safe (it's already 0 for self), + # then run her sweep. She rebroadcasts M1. + alice.forceIncomingExpired("m1") + alice.runRepairSweep() + + # Bob now has M1 and M2 delivered. + check: + "m1" in bus.delivered["bob"] + "m2" in bus.delivered["bob"] + + test "response cancellation: only one rebroadcast on the wire": + let bus = newTestBus() + let alice = bus.addPeer("alice") + let bob = bus.addPeer("bob") + let carol = bus.addPeer("carol") + + # Alice sends M1, Bob offline. + bus.broadcast("alice", @[byte(1)], "m1", dropAt = @["bob".SdsParticipantID]) + # Carol sends M2; Bob sees M1 missing. + bus.broadcast("carol", @[byte(2)], "m2") + check "m1" in bob.channels[testChannel].outgoingRepairBuffer + + # Bob requests repair. + bob.forceOutgoingExpired("m1") + bus.broadcast("bob", @[byte(3)], "m3") + + # Both Alice and Carol now have an incomingRepairBuffer entry for M1. + check: + "m1" in alice.channels[testChannel].incomingRepairBuffer + "m1" in carol.channels[testChannel].incomingRepairBuffer + + # Alice fires first (T_resp=0 for self). Her rebroadcast should cancel Carol's + # pending entry when Carol receives the rebroadcast. + alice.forceIncomingExpired("m1") + alice.runRepairSweep() + + # Carol's pending response must have been cleared by the dedup-path cleanup. + check "m1" notin carol.channels[testChannel].incomingRepairBuffer + + # Even if we now force-run Carol's sweep, nothing should fire. + let wireCountBefore = bus.wireLog.len + carol.runRepairSweep() + check bus.wireLog.len == wireCountBefore + + # Bob received exactly one rebroadcast of M1. + var m1RebroadcastCount = 0 + for entry in bus.wireLog: + if entry.messageId == "m1" and entry.senderId != "alice": + discard # only the original Alice->all broadcast had senderId="alice" + if entry.messageId == "m1": + m1RebroadcastCount += 1 + # Two "m1" entries total on wire: (1) Alice's original broadcast, (2) Alice's rebroadcast. + check m1RebroadcastCount == 2 + + test "cancellation on incoming repair request: peer drops its own pending request": + let bus = newTestBus() + let alice = bus.addPeer("alice") + let bob = bus.addPeer("bob") + let carol = bus.addPeer("carol") + + # Alice sends M1 — drop at both Bob and Carol, so both miss it. + bus.broadcast( + "alice", @[byte(1)], "m1", + dropAt = @["bob".SdsParticipantID, "carol".SdsParticipantID], + ) + # Alice sends M2 referencing M1 — both Bob and Carol see M1 missing. + bus.broadcast("alice", @[byte(2)], "m2") + check: + "m1" in bob.channels[testChannel].outgoingRepairBuffer + "m1" in carol.channels[testChannel].outgoingRepairBuffer + + # Bob's T_req fires first. He sends a repair request for M1. + bob.forceOutgoingExpired("m1") + bus.broadcast("bob", @[byte(3)], "m3") + + # Carol, on receiving Bob's repair request, must have dropped her own + # pending outgoingRepairBuffer entry for M1 (cancellation). + check "m1" notin carol.channels[testChannel].outgoingRepairBuffer + + test "response group filtering: only group members respond": + # With numGroups=10, roughly 1/10 of receivers will be in the group. + # Construct a sender+message where a specific non-sender is NOT in the group. + var cfg = defaultConfig() + cfg.numResponseGroups = 10 + + # Pick a msgId where carol is not in the group and bob is + # We probe deterministically because computeTReq/isInResponseGroup are pure. + var chosenMsg = "" + for i in 0 ..< 1000: + let candidate = "probe-" & $i + let bobIn = isInResponseGroup("bob", "alice", candidate, 10) + let carolIn = isInResponseGroup("carol", "alice", candidate, 10) + if bobIn and not carolIn: + chosenMsg = candidate + break + check chosenMsg.len > 0 + + let bus = newTestBus() + discard bus.addPeer("alice", cfg) + let bob = bus.addPeer("bob", cfg) + let carol = bus.addPeer("carol", cfg) + + # Both Bob and Carol receive the original M1 (so both have it in messageCache). + bus.broadcast("alice", @[byte(1)], chosenMsg) + + # Now Dave arrives: build a fake requester message manually so its repair_request + # names Alice as senderId for chosenMsg. + # We inject directly by calling unwrapReceivedMessage on bob/carol. + let dave = bus.addPeer("dave", cfg) + # Dave has no messages, but we can hand-craft a repair request he would send. + let reqMsg = SdsMessage( + messageId: "req-from-dave", + lamportTimestamp: 10, + causalHistory: @[], + channelId: testChannel, + content: @[byte(9)], + bloomFilter: @[], + senderId: "dave", + repairRequest: @[HistoryEntry(messageId: chosenMsg, senderId: "alice")], + ) + let bytes = serializeMessage(reqMsg).get() + discard bob.unwrapReceivedMessage(bytes) + discard carol.unwrapReceivedMessage(bytes) + + check: + chosenMsg in bob.channels[testChannel].incomingRepairBuffer + chosenMsg notin carol.channels[testChannel].incomingRepairBuffer + + test "multi-gap batch repair: many missing deps split across requests": + let bus = newTestBus() + discard bus.addPeer("alice") + let bob = bus.addPeer("bob") + + # Alice sends 5 messages while Bob is offline. + let drops = @["bob".SdsParticipantID] + bus.broadcast("alice", @[byte(1)], "m1", dropAt = drops) + bus.broadcast("alice", @[byte(2)], "m2", dropAt = drops) + bus.broadcast("alice", @[byte(3)], "m3", dropAt = drops) + bus.broadcast("alice", @[byte(4)], "m4", dropAt = drops) + bus.broadcast("alice", @[byte(5)], "m5", dropAt = drops) + + # Bob comes online and receives M6 which depends on m1..m5. + bus.broadcast("alice", @[byte(6)], "m6") + + # Bob should have 5 outgoing repair entries. + let channel = bob.channels[testChannel] + check channel.outgoingRepairBuffer.len == 5 + + # Force all to expired and wrap one message — only maxRepairRequests + # (default 3) should attach to a single outgoing message. + for id in ["m1", "m2", "m3", "m4", "m5"]: + bob.forceOutgoingExpired(id) + + let wrapped = bob.wrapOutgoingMessage(@[byte(99)], "bob-msg-1", testChannel).get() + let decoded = deserializeMessage(wrapped).get() + check decoded.repairRequest.len <= bob.config.maxRepairRequests + + # The attached entries should be removed from the outgoing buffer. + check channel.outgoingRepairBuffer.len == 5 - decoded.repairRequest.len + + test "markDependenciesMet externally clears pending repair entry": + let bus = newTestBus() + discard bus.addPeer("alice") + let bob = bus.addPeer("bob") + + bus.broadcast("alice", @[byte(1)], "m1", dropAt = @["bob".SdsParticipantID]) + bus.broadcast("alice", @[byte(2)], "m2") + check "m1" in bob.channels[testChannel].outgoingRepairBuffer + + # Simulate Bob fetching M1 via an out-of-band store query. + check bob.markDependenciesMet(@["m1"], testChannel).isOk() + check "m1" notin bob.channels[testChannel].outgoingRepairBuffer From 5170c999d3426e74c5eb5bda46f1f9945bc223c4 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Sat, 11 Apr 2026 23:54:56 +0530 Subject: [PATCH 4/5] feat: delete binary of test_bloom --- tests/test_bloom | Bin 419592 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 tests/test_bloom diff --git a/tests/test_bloom b/tests/test_bloom deleted file mode 100755 index f4776c4b0cf87a2bdc3c03f5c34db079c02412e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419592 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

YW
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%0AwgB`>w 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 From 6433c7623ef9d37a2370c6be63ef5fe99e234fe2 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Sun, 26 Apr 2026 03:05:33 +0530 Subject: [PATCH 5/5] feat: library update after SDS-R --- library/config_json.nim | 82 +++++++++++++++++++ library/libsds.h | 38 +++++++++ library/libsds.nim | 70 ++++++++++++++-- .../requests/sds_lifecycle_request.nim | 30 ++++++- 4 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 library/config_json.nim diff --git a/library/config_json.nim b/library/config_json.nim new file mode 100644 index 0000000..95c529e --- /dev/null +++ b/library/config_json.nim @@ -0,0 +1,82 @@ +## JSON parser for ReliabilityConfig — used by the FFI constructor +## SdsNewReliabilityManagerWithConfig. +## +## Schema: a JSON object where every field is optional. Missing fields fall +## back to the Default* constants in sds/types/reliability_config.nim. +## Duration fields use the suffix "Ms" and are integer milliseconds. +## +## Empty input ("" or NULL on the C side) returns the default config. + +import std/[json, times] +import results +import sds/types/reliability_config + +proc getJsonInt(node: JsonNode, key: string, default: int): int = + if node.hasKey(key) and node[key].kind == JInt: + return node[key].getInt() + return default + +proc getJsonFloat(node: JsonNode, key: string, default: float): float = + if not node.hasKey(key): + return default + case node[key].kind + of JFloat: node[key].getFloat() + of JInt: node[key].getInt().float + else: default + +proc getJsonDurationMs( + node: JsonNode, key: string, default: Duration +): Duration = + if node.hasKey(key) and node[key].kind == JInt: + return initDuration(milliseconds = node[key].getInt()) + return default + +proc parseReliabilityConfig*( + jsonStr: string +): Result[ReliabilityConfig, string] = + ## Parses a JSON string into a ReliabilityConfig. Empty input returns the + ## default config. Unknown keys are ignored. Type-mismatched values fall + ## back to defaults rather than failing. + if jsonStr.len == 0: + return ok(ReliabilityConfig.init()) + + var node: JsonNode + try: + node = parseJson(jsonStr) + except JsonParsingError, ValueError, Exception: + return err("invalid JSON: " & getCurrentExceptionMsg()) + + if node.isNil or node.kind != JObject: + return err("config must be a JSON object") + + ok( + ReliabilityConfig.init( + bloomFilterCapacity = + getJsonInt(node, "bloomFilterCapacity", DefaultBloomFilterCapacity), + bloomFilterErrorRate = + getJsonFloat(node, "bloomFilterErrorRate", DefaultBloomFilterErrorRate), + maxMessageHistory = + getJsonInt(node, "maxMessageHistory", DefaultMaxMessageHistory), + maxCausalHistory = + getJsonInt(node, "maxCausalHistory", DefaultMaxCausalHistory), + resendInterval = + getJsonDurationMs(node, "resendIntervalMs", DefaultResendInterval), + maxResendAttempts = + getJsonInt(node, "maxResendAttempts", DefaultMaxResendAttempts), + syncMessageInterval = getJsonDurationMs( + node, "syncMessageIntervalMs", DefaultSyncMessageInterval + ), + bufferSweepInterval = getJsonDurationMs( + node, "bufferSweepIntervalMs", DefaultBufferSweepInterval + ), + repairTMin = getJsonDurationMs(node, "repairTMinMs", DefaultRepairTMin), + repairTMax = getJsonDurationMs(node, "repairTMaxMs", DefaultRepairTMax), + numResponseGroups = + getJsonInt(node, "numResponseGroups", DefaultNumResponseGroups), + maxRepairRequests = + getJsonInt(node, "maxRepairRequests", DefaultMaxRepairRequests), + repairSweepInterval = getJsonDurationMs( + node, "repairSweepIntervalMs", DefaultRepairSweepInterval + ), + ) + ) diff --git a/library/libsds.h b/library/libsds.h index 0d9840e..553d469 100644 --- a/library/libsds.h +++ b/library/libsds.h @@ -28,6 +28,37 @@ typedef void (*SdsRetrievalHintProvider) (const char* messageId, char** hint, si void* SdsNewReliabilityManager(SdsCallBack callback, void* userData); +// Construct a Reliability Manager with an explicit participant ID and a +// JSON-encoded ReliabilityConfig. +// +// participantId: stable, non-empty identifier for SDS-R. Pass NULL or "" to +// disable SDS-R (the manager will not request or answer +// repairs). It MUST be set-once at construction; do not change +// it across the lifetime of the manager. +// configJson: JSON object with optional fields for ReliabilityConfig. +// Pass NULL or "" to use the full default config. Missing +// fields fall back to per-field defaults. Duration fields use +// the suffix "Ms" (integer milliseconds). +// +// Recognised JSON keys: +// bloomFilterCapacity (int, default 10000) +// bloomFilterErrorRate (float, default 0.001) +// maxMessageHistory (int, default 1000) +// maxCausalHistory (int, default 10) +// resendIntervalMs (int, default 60000) +// maxResendAttempts (int, default 5) +// syncMessageIntervalMs (int, default 30000) +// bufferSweepIntervalMs (int, default 60000) +// repairTMinMs (int, default 30000) +// repairTMaxMs (int, default 300000) +// numResponseGroups (int, default 1) +// maxRepairRequests (int, default 3) +// repairSweepIntervalMs (int, default 5000) +void* SdsNewReliabilityManagerWithConfig(const char* participantId, + const char* configJson, + SdsCallBack callback, + void* userData); + void SdsSetEventCallback(void* ctx, SdsCallBack callback, void* userData); void SdsSetRetrievalHintProvider(void* ctx, SdsRetrievalHintProvider callback, void* userData); @@ -59,6 +90,13 @@ int SdsMarkDependenciesMet(void* ctx, int SdsStartPeriodicTasks(void* ctx, SdsCallBack callback, void* userData); +// Removes a channel and frees its per-channel state (buffers, bloom filter, +// message cache, SDS-R repair entries). Safe to call on a channel that does +// not exist; returns RET_OK in that case. +int SdsRemoveChannel(void* ctx, + const char* channelId, + SdsCallBack callback, + void* userData); #ifdef __cplusplus diff --git a/library/libsds.nim b/library/libsds.nim index af05857..fc90003 100644 --- a/library/libsds.nim +++ b/library/libsds.nim @@ -178,12 +178,17 @@ proc initializeLibrary() {.exported.} = ################################################################################ ### Exported procs -proc SdsNewReliabilityManager( - callback: SdsCallBack, userData: pointer -): pointer {.dynlib, exportc, cdecl.} = +proc createManager( + participantId: cstring, + configJson: cstring, + callback: SdsCallBack, + userData: pointer, +): pointer = + ## Shared implementation for SdsNewReliabilityManager and + ## SdsNewReliabilityManagerWithConfig. Either argument may be NULL or empty + ## to indicate "use defaults". initializeLibrary() - ## Creates a new instance of the Reliability Manager. if isNil(callback): echo "error: missing callback in NewReliabilityManager" return nil @@ -204,11 +209,14 @@ proc SdsNewReliabilityManager( repairReadyCb: onRepairReady(ctx), ) + let pId: cstring = if participantId.isNil: cstring"" else: participantId + let cfg: cstring = if configJson.isNil: cstring"" else: configJson + let retCode = handleRequest( ctx, RequestType.LIFECYCLE, SdsLifecycleRequest.createShared( - SdsLifecycleMsgType.CREATE_RELIABILITY_MANAGER, nil, appCallbacks + SdsLifecycleMsgType.CREATE_RELIABILITY_MANAGER, "", appCallbacks, pId, cfg ), callback, userData, @@ -219,6 +227,26 @@ proc SdsNewReliabilityManager( return ctx +proc SdsNewReliabilityManager( + callback: SdsCallBack, userData: pointer +): pointer {.dynlib, exportc, cdecl.} = + ## Back-compat shim. Constructs a manager with empty participantId (SDS-R + ## disabled) and the default ReliabilityConfig. New code should use + ## SdsNewReliabilityManagerWithConfig. + return createManager(nil, nil, callback, userData) + +proc SdsNewReliabilityManagerWithConfig( + participantId: cstring, + configJson: cstring, + callback: SdsCallBack, + userData: pointer, +): pointer {.dynlib, exportc, cdecl.} = + ## Creates a new instance of the Reliability Manager with an explicit + ## participantId (required for SDS-R) and a JSON-encoded ReliabilityConfig. + ## Either argument may be NULL or empty to fall back to defaults; missing + ## fields inside the JSON also fall back to per-field defaults. + return createManager(participantId, configJson, callback, userData) + proc SdsSetEventCallback( ctx: ptr SdsContext, callback: SdsCallBack, userData: pointer ) {.dynlib, exportc.} = @@ -384,5 +412,37 @@ proc SdsStartPeriodicTasks( userData, ) +proc SdsRemoveChannel( + ctx: ptr SdsContext, + channelId: cstring, + callback: SdsCallBack, + userData: pointer, +): cint {.dynlib, exportc.} = + ## Removes a channel and its associated state from the Reliability Manager. + ## Use this when a user leaves a channel to release per-channel buffers, + ## bloom filter, message cache, and SDS-R repair state. + initializeLibrary() + checkLibsdsParams(ctx, callback, userData) + + if channelId == nil: + let msg = "libsds error: " & "channel ID pointer is NULL" + callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) + return RET_ERR + + if $channelId == "": + let msg = "libsds error: " & "channel ID is empty string" + callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) + return RET_ERR + + handleRequest( + ctx, + RequestType.LIFECYCLE, + SdsLifecycleRequest.createShared( + SdsLifecycleMsgType.REMOVE_CHANNEL, channelId + ), + callback, + userData, + ) + ### End of exported procs ################################################################################ diff --git a/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim b/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim index a0f3adb..363d442 100644 --- a/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim +++ b/library/sds_thread/inter_thread_communication/requests/sds_lifecycle_request.nim @@ -2,38 +2,54 @@ import std/json import chronos, chronicles, results import library/alloc +import library/config_json import sds type SdsLifecycleMsgType* = enum CREATE_RELIABILITY_MANAGER RESET_RELIABILITY_MANAGER START_PERIODIC_TASKS + REMOVE_CHANNEL type SdsLifecycleRequest* = object operation: SdsLifecycleMsgType channelId: cstring appCallbacks: AppCallbacks + participantId: cstring + configJson: cstring proc createShared*( T: type SdsLifecycleRequest, op: SdsLifecycleMsgType, channelId: cstring = "", appCallbacks: AppCallbacks = nil, + participantId: cstring = "", + configJson: cstring = "", ): ptr type T = var ret = createShared(T) ret[].operation = op ret[].appCallbacks = appCallbacks ret[].channelId = channelId.alloc() + ret[].participantId = participantId.alloc() + ret[].configJson = configJson.alloc() return ret proc destroyShared(self: ptr SdsLifecycleRequest) = deallocShared(self[].channelId) + deallocShared(self[].participantId) + deallocShared(self[].configJson) deallocShared(self) proc createReliabilityManager( - appCallbacks: AppCallbacks = nil + participantId: string, + configJson: string, + appCallbacks: AppCallbacks = nil, ): Future[Result[ReliabilityManager, string]] {.async.} = - let rm = newReliabilityManager().valueOr: + let config = parseReliabilityConfig(configJson).valueOr: + error "Failed to parse reliability config", error = error + return err("Failed to parse reliability config: " & error) + + let rm = newReliabilityManager(config, participantId).valueOr: error "Failed creating reliability manager", error = error return err("Failed creating reliability manager: " & $error) @@ -53,7 +69,11 @@ proc process*( case self.operation of CREATE_RELIABILITY_MANAGER: - rm[] = (await createReliabilityManager(self.appCallbacks)).valueOr: + rm[] = ( + await createReliabilityManager( + $self.participantId, $self.configJson, self.appCallbacks + ) + ).valueOr: error "CREATE_RELIABILITY_MANAGER failed", error = error return err("error processing CREATE_RELIABILITY_MANAGER request: " & $error) of RESET_RELIABILITY_MANAGER: @@ -62,5 +82,9 @@ proc process*( return err("error processing RESET_RELIABILITY_MANAGER request: " & $error) of START_PERIODIC_TASKS: rm[].startPeriodicTasks() + of REMOVE_CHANNEL: + removeChannel(rm[], $self.channelId).isOkOr: + error "REMOVE_CHANNEL failed", error = error + return err("error processing REMOVE_CHANNEL request: " & $error) return ok("")