diff --git a/kaspad.go b/kaspad.go index 7b3db8260..7293f0036 100644 --- a/kaspad.go +++ b/kaspad.go @@ -13,6 +13,7 @@ import ( "runtime/debug" "runtime/pprof" "strings" + "time" "github.com/kaspanet/kaspad/dbaccess" @@ -145,7 +146,20 @@ func kaspadMain(serverChan chan<- *server.Server) error { defer func() { kasdLog.Infof("Gracefully shutting down the server...") server.Stop() - server.WaitForShutdown() + + shutdownDone := make(chan struct{}) + go func() { + server.WaitForShutdown() + shutdownDone <- struct{}{} + }() + + const shutdownTimeout = 2 * time.Minute + + select { + case <-shutdownDone: + case <-time.After(shutdownTimeout): + kasdLog.Criticalf("Graceful shutdown timed out %s. Terminating...", shutdownTimeout) + } srvrLog.Infof("Server shutdown complete") }() server.Start() diff --git a/netsync/manager.go b/netsync/manager.go index 7d27c30ad..cbc33d4d2 100644 --- a/netsync/manager.go +++ b/netsync/manager.go @@ -529,8 +529,17 @@ func (sm *SyncManager) handleBlockMsg(bmsg *blockMsg) { return } - // Request the parents for the orphan block from the peer that sent it. if isOrphan { + // If we received an orphan block from the sync peer, it is + // misbehaving and must be disconnected from. + if peer == sm.syncPeer { + log.Errorf("Received an orphan block %s from sync peer %s. Disconnecting...", + blockHash, peer) + peer.Disconnect() + return + } + + // Request the parents for the orphan block from the peer that sent it. missingAncestors, err := sm.dag.GetOrphanMissingAncestorHashes(blockHash) if err != nil { log.Errorf("Failed to find missing ancestors for block %s: %s",