Simple missing blobs Report at blobsets_fs
This commit is contained in:
parent
633edf7a51
commit
7a583a4783
|
@ -3,6 +3,7 @@
|
||||||
<requires>
|
<requires>
|
||||||
<file_system label="backend"/>
|
<file_system label="backend"/>
|
||||||
<nic/>
|
<nic/>
|
||||||
|
<report/>
|
||||||
<rtc/>
|
<rtc/>
|
||||||
</requires>
|
</requires>
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
<service name="ROM"/>
|
<service name="ROM"/>
|
||||||
<service name="File_system"/>
|
<service name="File_system"/>
|
||||||
<service name="Nic"/>
|
<service name="Nic"/>
|
||||||
|
<service name="Report"/>
|
||||||
<service name="Rtc"/>
|
<service name="Rtc"/>
|
||||||
<service name="Timer"/>
|
<service name="Timer"/>
|
||||||
</parent-provides>
|
</parent-provides>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
<requires>
|
<requires>
|
||||||
<file_system label="blobstore"/>
|
<file_system label="blobstore"/>
|
||||||
|
<report label="missing"/>
|
||||||
<rtc/>
|
<rtc/>
|
||||||
</requires>
|
</requires>
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import std/tables, std/xmltree, std/strtabs, std/strutils, std/streams, std/xmlp
|
||||||
|
|
||||||
import genode, genode/signals, genode/parents, genode/servers, genode/roms
|
import genode, genode/signals, genode/parents, genode/servers, genode/roms
|
||||||
|
|
||||||
import blobsets, blobsets/filestores, ./private/filesystemsession
|
import blobsets, blobsets/filestores, ./private/filesystemsession, ./private/store_reporter
|
||||||
|
|
||||||
const
|
const
|
||||||
currentPath = currentSourcePath.rsplit("/", 1)[0]
|
currentPath = currentSourcePath.rsplit("/", 1)[0]
|
||||||
|
@ -297,8 +297,8 @@ componentConstructHook = proc(env: GenodeEnv) =
|
||||||
var
|
var
|
||||||
policies = newSeq[XmlNode](8)
|
policies = newSeq[XmlNode](8)
|
||||||
sessions = initTable[ServerId, SessionRef]()
|
sessions = initTable[ServerId, SessionRef]()
|
||||||
let store = newFileStore("/store")
|
let store = env.newStoreReporter(newFileStore("/store"))
|
||||||
# Use the file-system as the store backend
|
# Use the file-system as the store backend, with a reporter wrapper
|
||||||
|
|
||||||
proc createSession(env: GenodeEnv; store: BlobStore; id: ServerId; label: string; setId: SetId; txBufSize: int) =
|
proc createSession(env: GenodeEnv; store: BlobStore; id: ServerId; label: string; setId: SetId; txBufSize: int) =
|
||||||
let
|
let
|
||||||
|
|
47
genode/src/private/store_reporter.nim
Normal file
47
genode/src/private/store_reporter.nim
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import blobsets
|
||||||
|
import genode, genode/reports
|
||||||
|
import std/asyncdispatch, std/asyncfutures, std/streams, std/xmltree
|
||||||
|
|
||||||
|
type
|
||||||
|
StoreReporter = ref StoreReporterObj
|
||||||
|
StoreReporterObj = object of BlobStoreObj
|
||||||
|
store: BlobStore
|
||||||
|
reporter: ReportClient
|
||||||
|
xml: XmlNode
|
||||||
|
# TODO: put missing objects in a table and add
|
||||||
|
# a weight value that increase for each miss
|
||||||
|
|
||||||
|
proc reportMissing(sr: StoreReporter; id: BlobId; kind: BlobKind) =
|
||||||
|
sr.xml.add <>blob(id=id.toHex, kind=($kind))
|
||||||
|
sr.reporter.submit do (str: Stream):
|
||||||
|
str.writeLine(sr.xml)
|
||||||
|
|
||||||
|
proc xContains(s: BlobStore; id: BlobId; kind: BlobKind): Future[bool] {.async.} =
|
||||||
|
var sr = StoreReporter(s)
|
||||||
|
let r = await sr.store.containsImpl(sr.store, id, kind)
|
||||||
|
if not r:
|
||||||
|
sr.reportMissing(id, kind)
|
||||||
|
return r
|
||||||
|
|
||||||
|
proc xOpenBlobStream(s: BlobStore; id: BlobId; size: BiggestInt; kind: BlobKind): BlobStream =
|
||||||
|
var sr = StoreReporter(s)
|
||||||
|
try:
|
||||||
|
result = sr.store.openBlobStreamImpl(sr.store, id, size, kind)
|
||||||
|
except KeyError:
|
||||||
|
sr.reportMissing(id, kind)
|
||||||
|
raise newException(KeyError, "blob missing blob reported")
|
||||||
|
|
||||||
|
proc xOpenIngestStream(s: BlobStore; size: BiggestInt; kind: BlobKind): IngestStream =
|
||||||
|
var sr = StoreReporter(s)
|
||||||
|
sr.store.openIngestStreamImpl(sr.store, size, kind)
|
||||||
|
|
||||||
|
proc newStoreReporter*(env: GenodeEnv; store: BlobStore): BlobStore =
|
||||||
|
## Create a new store that reports missing blobs via a Report session.
|
||||||
|
StoreReporter(
|
||||||
|
containsImpl: xcontains,
|
||||||
|
openBlobStreamImpl: xopenBlobStream,
|
||||||
|
openIngestStreamImpl: xopenIngestStream,
|
||||||
|
store: store,
|
||||||
|
reporter: env.newReportClient("missing"),
|
||||||
|
xml: <>missing(),
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user