Skip to content

Commit e2d1dfa

Browse files
authored
Fluffy: Create a top level wrapper type to hold all running services (#3158)
1 parent ae705d7 commit e2d1dfa

File tree

2 files changed

+57
-46
lines changed

2 files changed

+57
-46
lines changed

fluffy/fluffy.nim

+57-38
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,23 @@ func optionToOpt[T](o: Option[T]): Opt[T] =
4444
else:
4545
Opt.none(T)
4646

47-
proc run(
48-
config: PortalConf
49-
): (PortalNode, Opt[MetricsHttpServerRef], Opt[RpcHttpServer], Opt[RpcWebSocketServer]) {.
50-
raises: [CatchableError]
51-
.} =
47+
type
48+
FluffyStatus = enum
49+
Starting
50+
Running
51+
Stopping
52+
53+
Fluffy = ref object
54+
status: FluffyStatus
55+
portalNode: PortalNode
56+
metricsServer: Opt[MetricsHttpServerRef]
57+
rpcHttpServer: Opt[RpcHttpServer]
58+
rpcWsServer: Opt[RpcWebSocketServer]
59+
60+
proc init(T: type Fluffy): T =
61+
Fluffy(status: FluffyStatus.Starting)
62+
63+
proc run(fluffy: Fluffy, config: PortalConf) {.raises: [CatchableError].} =
5264
setupLogging(config.logLevel, config.logStdout, none(OutFile))
5365

5466
notice "Launching Fluffy", version = fullVersionStr, cmdParams = commandLineParams()
@@ -110,7 +122,7 @@ proc run(
110122
else:
111123
Opt.none(enr.Record)
112124

113-
var bootstrapRecords: seq[Record]
125+
var bootstrapRecords: seq[enr.Record]
114126
loadBootstrapFile(string config.bootstrapNodesFile, bootstrapRecords)
115127
bootstrapRecords.add(config.bootstrapNodes)
116128

@@ -320,7 +332,38 @@ proc run(
320332
else:
321333
Opt.none(RpcWebSocketServer)
322334

323-
return (node, metricsServer, rpcHttpServer, rpcWsServer)
335+
fluffy.status = FluffyStatus.Running
336+
fluffy.portalNode = node
337+
fluffy.metricsServer = metricsServer
338+
fluffy.rpcHttpServer = rpcHttpServer
339+
fluffy.rpcWsServer = rpcWsServer
340+
341+
proc stop(f: Fluffy) {.async: (raises: []).} =
342+
if f.rpcWsServer.isSome():
343+
let server = f.rpcWsServer.get()
344+
try:
345+
server.stop()
346+
await server.closeWait()
347+
except CatchableError as e:
348+
warn "Failed to stop rpc WS server", exc = e.name, err = e.msg
349+
350+
if f.rpcHttpServer.isSome():
351+
let server = f.rpcHttpServer.get()
352+
try:
353+
await server.stop()
354+
await server.closeWait()
355+
except CatchableError as e:
356+
warn "Failed to stop rpc HTTP server", exc = e.name, err = e.msg
357+
358+
if f.metricsServer.isSome():
359+
let server = f.metricsServer.get()
360+
try:
361+
await server.stop()
362+
await server.close()
363+
except CatchableError as e:
364+
warn "Failed to stop metrics HTTP server", exc = e.name, err = e.msg
365+
366+
await f.portalNode.stop()
324367

325368
when isMainModule:
326369
{.pop.}
@@ -330,10 +373,10 @@ when isMainModule:
330373
)
331374
{.push raises: [].}
332375

333-
let (node, metricsServer, rpcHttpServer, rpcWsServer) =
334-
case config.cmd
335-
of PortalCmd.noCommand:
336-
run(config)
376+
let fluffy = Fluffy.init()
377+
case config.cmd
378+
of PortalCmd.noCommand:
379+
fluffy.run(config)
337380

338381
# Ctrl+C handling
339382
proc controlCHandler() {.noconv.} =
@@ -345,41 +388,17 @@ when isMainModule:
345388
raiseAssert exc.msg # shouldn't happen
346389

347390
notice "Shutting down after having received SIGINT"
348-
node.status = PortalNodeStatus.Stopping
391+
fluffy.status = FluffyStatus.Stopping
349392

350393
try:
351394
setControlCHook(controlCHandler)
352395
except Exception as exc: # TODO Exception
353396
warn "Cannot set ctrl-c handler", msg = exc.msg
354397

355-
while node.status == PortalNodeStatus.Running:
398+
while fluffy.status == FluffyStatus.Running:
356399
try:
357400
poll()
358401
except CatchableError as e:
359402
warn "Exception in poll()", exc = e.name, err = e.msg
360403

361-
if rpcWsServer.isSome():
362-
let server = rpcWsServer.get()
363-
try:
364-
server.stop()
365-
waitFor server.closeWait()
366-
except CatchableError as e:
367-
warn "Failed to stop rpc WS server", exc = e.name, err = e.msg
368-
369-
if rpcHttpServer.isSome():
370-
let server = rpcHttpServer.get()
371-
try:
372-
waitFor server.stop()
373-
waitFor server.closeWait()
374-
except CatchableError as e:
375-
warn "Failed to stop rpc HTTP server", exc = e.name, err = e.msg
376-
377-
if metricsServer.isSome():
378-
let server = metricsServer.get()
379-
try:
380-
waitFor server.stop()
381-
waitFor server.close()
382-
except CatchableError as e:
383-
warn "Failed to stop metrics HTTP server", exc = e.name, err = e.msg
384-
385-
waitFor node.stop()
404+
waitFor fluffy.stop()

fluffy/portal_node.nim

-8
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ export
2525
beacon_light_client, history_network, state_network, portal_protocol_config, forks
2626

2727
type
28-
PortalNodeStatus* = enum
29-
Starting
30-
Running
31-
Stopping
32-
3328
PortalNodeConfig* = object
3429
accumulatorFile*: Opt[string]
3530
disableStateRootValidation*: bool
@@ -40,7 +35,6 @@ type
4035
contentRequestRetries*: int
4136

4237
PortalNode* = ref object
43-
status*: PortalNodeStatus
4438
discovery: protocol.Protocol
4539
contentDB: ContentDB
4640
streamManager: StreamManager
@@ -228,8 +222,6 @@ proc start*(n: PortalNode) =
228222

229223
n.statusLogLoop = statusLogLoop(n)
230224

231-
n.status = PortalNodeStatus.Running
232-
233225
proc stop*(n: PortalNode) {.async: (raises: []).} =
234226
debug "Stopping Portal node"
235227

0 commit comments

Comments
 (0)