@@ -44,11 +44,23 @@ func optionToOpt[T](o: Option[T]): Opt[T] =
44
44
else:
45
45
Opt.none(T)
46
46
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].} =
52
64
setupLogging(config.logLevel, config.logStdout, none(OutFile))
53
65
54
66
notice "Launching Fluffy", version = fullVersionStr, cmdParams = commandLineParams()
@@ -110,7 +122,7 @@ proc run(
110
122
else:
111
123
Opt.none(enr.Record)
112
124
113
- var bootstrapRecords: seq [Record]
125
+ var bootstrapRecords: seq [enr. Record]
114
126
loadBootstrapFile(string config.bootstrapNodesFile, bootstrapRecords)
115
127
bootstrapRecords.add(config.bootstrapNodes)
116
128
@@ -320,7 +332,38 @@ proc run(
320
332
else:
321
333
Opt.none(RpcWebSocketServer)
322
334
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()
324
367
325
368
when isMainModule :
326
369
{.pop.}
@@ -330,10 +373,10 @@ when isMainModule:
330
373
)
331
374
{.push raises: [].}
332
375
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)
337
380
338
381
# Ctrl+C handling
339
382
proc controlCHandler() {.noconv.} =
@@ -345,41 +388,17 @@ when isMainModule:
345
388
raiseAssert exc.msg # shouldn't happen
346
389
347
390
notice "Shutting down after having received SIGINT"
348
- node .status = PortalNodeStatus .Stopping
391
+ fluffy .status = FluffyStatus .Stopping
349
392
350
393
try:
351
394
setControlCHook(controlCHandler)
352
395
except Exception as exc: # TODO Exception
353
396
warn "Cannot set ctrl-c handler", msg = exc.msg
354
397
355
- while node .status == PortalNodeStatus .Running:
398
+ while fluffy .status == FluffyStatus .Running:
356
399
try:
357
400
poll()
358
401
except CatchableError as e:
359
402
warn "Exception in poll()", exc = e.name, err = e.msg
360
403
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()
0 commit comments