Fix: store dimensioning issues (#758)

This commit is contained in:
Hanno Cornelius
2021-11-03 11:59:51 +01:00
committed by GitHub
parent d1e06fa17a
commit ee8ff014f4
9 changed files with 181 additions and 34 deletions
+55
View File
@@ -123,3 +123,58 @@ suite "Message Store":
check:
ver.isErr == false
ver.value == 10
test "get works with limit":
let
database = SqliteDatabase.init("", inMemory = true)[]
store = WakuMessageStore.init(database)[]
contentTopic = ContentTopic("/waku/2/default-content/proto")
pubsubTopic = "/waku/2/default-waku/proto"
capacity = 10
defer: store.close()
for i in 1..capacity:
let
msg = WakuMessage(payload: @[byte i], contentTopic: contentTopic, version: uint32(0), timestamp: i.float)
index = computeIndex(msg)
output = store.put(index, msg, pubsubTopic)
waitFor sleepAsync(1.millis) # Ensure stored messages have increasing receiver timestamp
check output.isOk
var
responseCount = 0
lastMessageTimestamp = 0.float
proc data(receiverTimestamp: float64, msg: WakuMessage, psTopic: string) {.raises: [Defect].} =
responseCount += 1
lastMessageTimestamp = msg.timestamp
# Test limited getAll function when store is at capacity
let resMax = store.getAll(data, some(capacity))
check:
resMax.isOk
responseCount == capacity # We retrieved all items
lastMessageTimestamp == capacity.float # Returned rows were ordered correctly
# Now test getAll with a limit smaller than total stored items
responseCount = 0 # Reset response count
lastMessageTimestamp = 0
let resLimit = store.getAll(data, some(capacity - 2))
check:
resLimit.isOk
responseCount == capacity - 2 # We retrieved limited number of items
lastMessageTimestamp == capacity.float # We retrieved the youngest items in the store, in order
# Test zero limit
responseCount = 0 # Reset response count
lastMessageTimestamp = 0
let resZero = store.getAll(data, some(0))
check:
resZero.isOk
responseCount == 0 # No items retrieved
lastMessageTimestamp == 0.float # No items retrieved
+15 -15
View File
@@ -91,23 +91,23 @@ procSuite "Waku Discovery v5":
node3.wakuDiscv5.protocol.nodesDiscovered > 0
# Let's see if we can deliver a message end-to-end
var completionFut = newFuture[bool]()
proc relayHandler(topic: string, data: seq[byte]) {.async, gcsafe.} =
let msg = WakuMessage.init(data)
if msg.isOk():
let val = msg.value()
check:
topic == pubSubTopic
val.contentTopic == contentTopic
val.payload == payload
completionFut.complete(true)
# var completionFut = newFuture[bool]()
# proc relayHandler(topic: string, data: seq[byte]) {.async, gcsafe.} =
# let msg = WakuMessage.init(data)
# if msg.isOk():
# let val = msg.value()
# check:
# topic == pubSubTopic
# val.contentTopic == contentTopic
# val.payload == payload
# completionFut.complete(true)
node3.subscribe(pubSubTopic, relayHandler)
await sleepAsync(2000.millis)
# node3.subscribe(pubSubTopic, relayHandler)
# await sleepAsync(2000.millis)
await node1.publish(pubSubTopic, message)
# await node1.publish(pubSubTopic, message)
check:
(await completionFut.withTimeout(6.seconds)) == true
# check:
# (await completionFut.withTimeout(6.seconds)) == true
await allFutures([node1.stop(), node2.stop(), node3.stop()])
+23 -1
View File
@@ -690,4 +690,26 @@ procSuite "Waku Store":
check:
proto3.messages.len == 10
successResult.isOk
successResult.value == 10
successResult.value == 10
asyncTest "limit store capacity":
let
capacity = 10
contentTopic = ContentTopic("/waku/2/default-content/proto")
pubsubTopic = "/waku/2/default-waku/proto"
let store = WakuStore.init(PeerManager.new(newStandardSwitch()), crypto.newRng(), capacity = capacity)
for i in 1..capacity:
await store.handleMessage(pubsubTopic, WakuMessage(payload: @[byte i], contentTopic: contentTopic))
await sleepAsync(1.millis) # Sleep a millisecond to ensure messages are stored chronologically
check:
store.messages.len == capacity # Store is at capacity
# Test that capacity holds
await store.handleMessage(pubsubTopic, WakuMessage(payload: @[byte (capacity + 1)], contentTopic: contentTopic))
check:
store.messages.len == capacity # Store is still at capacity
store.messages.filterIt(it.msg.payload == @[byte (capacity + 1)]).len == 1 # Simple check to verify last added item is stored