Remove local providers (#53)

* refactor to use batch deletes

* add ability to remove local providers
This commit is contained in:
Dmitriy Ryajov 2022-10-03 15:14:47 -06:00 committed by GitHub
parent 4b9fa0356e
commit 08928e57d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 34 deletions

View File

@ -700,7 +700,7 @@ proc addProvider*(
var res = await d.lookup(cId)
trace "lookup returned:", res
# TODO: lookup is sepcified as not returning local, even if that is the closest. Is this OK?
# TODO: lookup is specified as not returning local, even if that is the closest. Is this OK?
if res.len == 0:
res.add(d.localNode)
for toNode in res:
@ -711,7 +711,6 @@ proc addProvider*(
return res
proc sendGetProviders(d: Protocol, toNode: Node,
cId: NodeId): Future[DiscResult[ProvidersMessage]]
{.async.} =
@ -749,6 +748,16 @@ proc getProvidersLocal*(
return provs.get
proc removeProvidersLocal*(
d: Protocol,
peerId: PeerId) {.async.} =
trace "Removing local provider", peerId
if(
let res = await d.providers.remove(peerId);
res.isErr):
trace "Error removing provider", err = res.error.msg
proc getProviders*(
d: Protocol,
cId: NodeId,
@ -785,7 +794,8 @@ proc getProviders*(
error "Sending of GetProviders message failed", error = providersMsgRes.error
# TODO: should we consider this as an error result if all GetProviders
# requests fail??
trace "getProviders collected: ", res=res.mapIt(it.data)
trace "getProviders collected: ", res = res.mapIt(it.data)
return ok res
@ -1026,7 +1036,9 @@ proc newProtocol*(
enrAutoUpdate = false,
config = defaultDiscoveryConfig,
rng = newRng(),
providers: ProvidersManager = nil):
providers = ProvidersManager.new(
SQLiteDatastore.new(Memory)
.expect("Should not fail!"))):
Protocol =
# TODO: Tried adding bindPort = udpPort as parameter but that gave
# "Error: internal error: environment misses: udpPort" in nim-beacon-chain.
@ -1070,13 +1082,6 @@ proc newProtocol*(
config.tableIpLimits,
rng)
providers =
if providers.isNil:
# TODO: There should be a passthrough datastore
ProvidersManager.new(SQLiteDatastore.new(Memory).expect("Should not fail!"))
else:
providers
result = Protocol(
privateKey: privKey,
localNode: node,
@ -1097,7 +1102,9 @@ proc newProtocol*(
bindIp = IPv4_any(),
config = defaultDiscoveryConfig,
rng = newRng(),
providers: ProvidersManager = nil):
providers = ProvidersManager.new(
SQLiteDatastore.new(Memory)
.expect("Should not fail!"))):
Protocol =
info "Discovery SPR initialized", seqNum = record.seqNum, uri = toURI(record)
let node = newNode(record).expect("Properly initialized record")
@ -1105,14 +1112,6 @@ proc newProtocol*(
# TODO Consider whether this should be a Defect
doAssert rng != nil, "RNG initialization failed"
let
providers =
if providers.isNil:
# TODO: There should be a passthrough datastore
ProvidersManager.new(SQLiteDatastore.new(Memory).expect("Should not fail!"))
else:
providers
result = Protocol(
privateKey: privKey,
localNode: node,

View File

@ -213,32 +213,38 @@ proc remove*(self: ProvidersManager, cid: NodeId): Future[?!void] {.async.} =
block:
without iter =? (await self.store.query(q)), err:
trace "Unable to obtain record for key", key = cidKey
return failure(err.msg)
return failure err
defer:
if not isNil(iter):
trace "Cleaning up query iterator"
discard (await iter.dispose())
var
keys: seq[Key]
for item in iter:
if pair =? (await item) and pair.key.isSome:
let key = pair.key.get()
if err =? (await self.store.delete(key)).errorOption:
trace "Error deleting record from persistent store", err = err.msg
continue
let
key = pair.key.get()
keys.add(key)
without pairs =? key.fromCidKey, err:
trace "Unable to parse peer id from key", key
continue
return failure err
self.cache.remove(cid, pairs.peerId)
trace "Deleted record from store", key
if keys.len > 0 and err =? (await self.store.delete(keys)).errorOption:
trace "Error deleting record from persistent store", err = err.msg
return failure err
return success()
proc remove*(self: ProvidersManager, peerId: PeerId): Future[?!void] {.async.} =
without cidKey =? (CidKey / "*" / $peerId), err:
return failure(err.msg)
return failure err
let
q = Query.init(cidKey)
@ -246,31 +252,36 @@ proc remove*(self: ProvidersManager, peerId: PeerId): Future[?!void] {.async.} =
block:
without iter =? (await self.store.query(q)), err:
trace "Unable to obtain record for key", key = cidKey
return failure(err.msg)
return failure err
defer:
if not isNil(iter):
trace "Cleaning up query iterator"
discard (await iter.dispose())
var
keys: seq[Key]
for item in iter:
if pair =? (await item) and pair.key.isSome:
let
key = pair.key.get()
if err =? (await self.store.delete(key)).errorOption:
trace "Error deleting record from persistent store", err = err.msg
continue
trace "Deleted record from store", key
keys.add(key)
let
parts = key.id.split(datastore.Separator)
self.cache.remove(NodeId.fromHex(parts[2]), peerId)
if keys.len > 0 and err =? (await self.store.delete(keys)).errorOption:
trace "Error deleting record from persistent store", err = err.msg
return failure err
trace "Deleted records from store"
without provKey =? makeProviderKey(peerId), err:
return failure(err.msg)
return failure err
trace "Removing provider record", key = provKey
return (await self.store.delete(provKey))