add locks in memory store to very it's not the issue

This commit is contained in:
Jaremy Creechley 2023-09-19 18:48:19 -07:00
parent 9ff163e0ef
commit 0d34d048d5
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 20 additions and 11 deletions

View File

@ -17,9 +17,11 @@ export key, query
push: {.upraises: [].} push: {.upraises: [].}
type import std/locks
type
MemoryDatastore* = ref object of Datastore MemoryDatastore* = ref object of Datastore
lock*: Lock
store*: Table[KeyBuffer, ValueBuffer] store*: Table[KeyBuffer, ValueBuffer]
method has*( method has*(
@ -28,7 +30,8 @@ method has*(
): Future[?!bool] {.async.} = ): Future[?!bool] {.async.} =
let dk = KeyBuffer.new(key) let dk = KeyBuffer.new(key)
return success self.store.hasKey(dk) withLock(self.lock):
return success self.store.hasKey(dk)
method delete*( method delete*(
self: MemoryDatastore, self: MemoryDatastore,
@ -37,7 +40,8 @@ method delete*(
let dk = KeyBuffer.new(key) let dk = KeyBuffer.new(key)
var val: ValueBuffer var val: ValueBuffer
discard self.store.pop(dk, val) withLock(self.lock):
discard self.store.pop(dk, val)
return success() return success()
method delete*( method delete*(
@ -56,11 +60,12 @@ method get*(
): Future[?!seq[byte]] {.async.} = ): Future[?!seq[byte]] {.async.} =
let dk = KeyBuffer.new(key) let dk = KeyBuffer.new(key)
if self.store.hasKey(dk): withLock(self.lock):
let res = self.store[dk].toSeq(byte) if self.store.hasKey(dk):
return success res let res = self.store[dk].toSeq(byte)
else: return success res
return failure (ref DatastoreError)(msg: "no such key") else:
return failure (ref DatastoreError)(msg: "no such key")
method put*( method put*(
self: MemoryDatastore, self: MemoryDatastore,
@ -70,7 +75,8 @@ method put*(
let dk = KeyBuffer.new(key) let dk = KeyBuffer.new(key)
let dv = ValueBuffer.new(data) let dv = ValueBuffer.new(data)
self.store[dk] = dv withLock(self.lock):
self.store[dk] = dv
return success() return success()
method put*( method put*(
@ -114,8 +120,9 @@ method query*(
let key = kb.toKey() let key = kb.toKey()
var ds: ValueBuffer var ds: ValueBuffer
if query.value: withLock(self.lock):
ds = self.store[kb] if query.value:
ds = self.store[kb]
let data = if ds.isNil: EmptyBytes else: ds.toSeq(byte) let data = if ds.isNil: EmptyBytes else: ds.toSeq(byte)
return success (key.some, data) return success (key.some, data)
@ -129,4 +136,5 @@ method close*(self: MemoryDatastore): Future[?!void] {.async.} =
func new*(tp: typedesc[MemoryDatastore]): MemoryDatastore = func new*(tp: typedesc[MemoryDatastore]): MemoryDatastore =
var self = tp() var self = tp()
self.lock.initLock()
return self return self

View File

@ -16,6 +16,7 @@ import ./querycommontests
import pretty import pretty
proc testThreadProxy() = proc testThreadProxy() =
suite "Test Basic ThreadProxyDatastore": suite "Test Basic ThreadProxyDatastore":
var var