Simple missing blobs Report at blobsets_fs

This commit is contained in:
Ehmry - 2019-04-28 19:41:48 +02:00
parent 633edf7a51
commit 7a583a4783
4 changed files with 53 additions and 3 deletions

View File

@ -3,6 +3,7 @@
<requires>
<file_system label="backend"/>
<nic/>
<report/>
<rtc/>
</requires>
@ -27,6 +28,7 @@
<service name="ROM"/>
<service name="File_system"/>
<service name="Nic"/>
<service name="Report"/>
<service name="Rtc"/>
<service name="Timer"/>
</parent-provides>

View File

@ -2,6 +2,7 @@
<requires>
<file_system label="blobstore"/>
<report label="missing"/>
<rtc/>
</requires>

View File

@ -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 blobsets, blobsets/filestores, ./private/filesystemsession
import blobsets, blobsets/filestores, ./private/filesystemsession, ./private/store_reporter
const
currentPath = currentSourcePath.rsplit("/", 1)[0]
@ -297,8 +297,8 @@ componentConstructHook = proc(env: GenodeEnv) =
var
policies = newSeq[XmlNode](8)
sessions = initTable[ServerId, SessionRef]()
let store = newFileStore("/store")
# Use the file-system as the store backend
let store = env.newStoreReporter(newFileStore("/store"))
# 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) =
let

View 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(),
)