mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 22:23:10 +00:00
add locks in memory store to very it's not the issue
This commit is contained in:
parent
9ff163e0ef
commit
0d34d048d5
@ -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
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import ./querycommontests
|
|||||||
|
|
||||||
import pretty
|
import pretty
|
||||||
|
|
||||||
|
|
||||||
proc testThreadProxy() =
|
proc testThreadProxy() =
|
||||||
suite "Test Basic ThreadProxyDatastore":
|
suite "Test Basic ThreadProxyDatastore":
|
||||||
var
|
var
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user