@@ -8,8 +8,12 @@ import (
88	"errors" 
99	"fmt" 
1010	"maps" 
11+ 	"net" 
12+ 	"net/http" 
1113	"runtime" 
14+ 	"strconv" 
1215	"sync" 
16+ 	"time" 
1317
1418	"github.com/NethermindEth/juno/adapters/sn2core" 
1519	"github.com/NethermindEth/juno/core" 
@@ -29,6 +33,12 @@ type schemaMetadata struct {
2933	IntermediateState  []byte 
3034}
3135
36+ type  HTTPConfig  struct  {
37+ 	Enabled  bool 
38+ 	Host     string 
39+ 	Port     uint16 
40+ }
41+ 
3242type  Migration  interface  {
3343	Before (intermediateState  []byte ) error 
3444	// Migration should return intermediate state whenever it requests new txn or detects cancelled ctx. 
@@ -76,8 +86,10 @@ var defaultMigrations = []Migration{
7686
7787var  ErrCallWithNewTransaction  =  errors .New ("call with new transaction" )
7888
79- func  MigrateIfNeeded (ctx  context.Context , targetDB  db.KeyValueStore , network  * utils.Network , log  utils.SimpleLogger ) error  {
80- 	return  migrateIfNeeded (ctx , targetDB , network , log , defaultMigrations )
89+ func  MigrateIfNeeded (ctx  context.Context , targetDB  db.KeyValueStore , network  * utils.Network ,
90+ 	log  utils.SimpleLogger , httpConfig  * HTTPConfig ,
91+ ) error  {
92+ 	return  migrateIfNeeded (ctx , targetDB , network , log , defaultMigrations , httpConfig )
8193}
8294
8395func  migrateIfNeeded (
@@ -86,6 +98,7 @@ func migrateIfNeeded(
8698	network  * utils.Network ,
8799	log  utils.SimpleLogger ,
88100	migrations  []Migration ,
101+ 	httpConfig  * HTTPConfig ,
89102) error  {
90103	/* 
91104		Schema metadata of the targetDB determines which set of migrations need to be applied to the database. 
@@ -113,6 +126,11 @@ func migrateIfNeeded(
113126		return  errors .New ("db is from a newer, incompatible version of Juno; upgrade to use this database" )
114127	}
115128
129+ 	if  httpConfig .Enabled  {
130+ 		migrationSrv  :=  startMigrationStatusServer (log , httpConfig .Host , httpConfig .Port )
131+ 		defer  closeMigrationServer (migrationSrv , log )
132+ 	}
133+ 
116134	for  i  :=  metadata .Version ; i  <  currentVersion ; i ++  {
117135		if  err  =  ctx .Err (); err  !=  nil  {
118136			return  err 
@@ -155,6 +173,13 @@ func migrateIfNeeded(
155173	return  nil 
156174}
157175
176+ func  closeMigrationServer (srv  * http.Server , log  utils.SimpleLogger ) {
177+ 	log .Debugw ("Closing migration status server immediately..." )
178+ 	if  err  :=  srv .Close (); err  !=  nil  {
179+ 		log .Errorw ("Migration status server close failed" , "err" , err )
180+ 	}
181+ }
182+ 
158183// SchemaMetadata retrieves metadata about a database schema from the given database. 
159184func  SchemaMetadata (targetDB  db.KeyValueStore ) (schemaMetadata , error ) {
160185	metadata  :=  schemaMetadata {}
@@ -869,3 +894,35 @@ func reconstructAggregatedBloomFilters(txn db.IndexedBatch, network *utils.Netwo
869894
870895	return  core .WriteRunningEventFilter (txn , runningFilter )
871896}
897+ 
898+ func  startMigrationStatusServer (log  utils.SimpleLogger , host  string , port  uint16 ) * http.Server  {
899+ 	mux  :=  http .NewServeMux ()
900+ 
901+ 	mux .HandleFunc ("/live" , func (w  http.ResponseWriter , r  * http.Request ) {
902+ 		w .WriteHeader (http .StatusOK )
903+ 	})
904+ 
905+ 	mux .HandleFunc ("/ready" , func (w  http.ResponseWriter , r  * http.Request ) {
906+ 		w .WriteHeader (http .StatusServiceUnavailable )
907+ 		_ , err  :=  w .Write ([]byte ("Database migration in progress." ))
908+ 		if  err  !=  nil  {
909+ 			log .Errorw ("Failed to write migration status response" , "err" , err )
910+ 		}
911+ 	})
912+ 
913+ 	portStr  :=  strconv .FormatUint (uint64 (port ), 10 )
914+ 	addr  :=  net .JoinHostPort (host , portStr )
915+ 	srv  :=  & http.Server {
916+ 		Addr :              addr ,
917+ 		Handler :           mux ,
918+ 		ReadHeaderTimeout : 30  *  time .Second ,
919+ 	}
920+ 
921+ 	go  func () {
922+ 		log .Debugw ("Starting migration status server on "  +  addr )
923+ 		if  err  :=  srv .ListenAndServe (); err  !=  http .ErrServerClosed  {
924+ 			log .Errorw ("Migration status server failed" , "err" , err )
925+ 		}
926+ 	}()
927+ 	return  srv 
928+ }
0 commit comments