@@ -19,6 +19,7 @@ package main
19
19
20
20
import (
21
21
"fmt"
22
+ "github.com/ethereum/go-ethereum/ethdb/leveldb"
22
23
"math"
23
24
"os"
24
25
"runtime"
@@ -257,6 +258,16 @@ func init() {
257
258
return debug .Setup (ctx )
258
259
}
259
260
app .After = func (ctx * cli.Context ) error {
261
+ unsafeShutdownDb , err := leveldb .New (utils .DataDirFlag .Value .String ()+ "/unsafe-shutdown" , 0 , 0 , "" )
262
+ if err != nil {
263
+ log .Warn ("failed to access unsafe shutdown database" , "time" , err )
264
+ }
265
+ // safe shutdown deletes unsafe shutdown from unsafe-shutdown-db
266
+ err = unsafeShutdownDb .Delete ([]byte ("unsafe-shutdown" ))
267
+ if err != nil {
268
+ log .Error ("err" , err )
269
+ }
270
+ unsafeShutdownDb .Close ()
260
271
debug .Exit ()
261
272
prompt .Stdin .Close () // Resets terminal mode.
262
273
return nil
@@ -361,6 +372,21 @@ func geth(ctx *cli.Context) error {
361
372
func startNode (ctx * cli.Context , stack * node.Node ) {
362
373
debug .Memsize .Add ("node" , stack )
363
374
375
+ // Create a db to hold invalid shutdowns
376
+ unsafeShutdownDb , err := leveldb .New (utils .DataDirFlag .Value .String ()+ "/unsafe-shutdown" , 0 , 0 , "" )
377
+ if err != nil {
378
+ log .Warn ("failed to access unsafe shutdown database" , "time" , err )
379
+ }
380
+ // Check for invalid shutdown
381
+ invalidShutdown , _ := unsafeShutdownDb .Get ([]byte ("unsafe-shutdown" ))
382
+ if invalidShutdown != nil {
383
+ log .Error ("unsafe shutdown detected" , "time" , string (invalidShutdown ))
384
+ }
385
+ // Create an invalid shutdown in database in case the app crashed
386
+ if err = unsafeShutdownDb .Put ([]byte ("unsafe-shutdown" ), []byte (time .Now ().String ())); err != nil {
387
+ log .Warn ("Failed to record possible future unsafe shutdown" , "err" , err )
388
+ }
389
+ unsafeShutdownDb .Close ()
364
390
// Start up the node itself
365
391
utils .StartNode (stack )
366
392
0 commit comments