// Shutdown handles graceful cleanup of server functions before exiting DVID. // This may not be so graceful if the chunk handler uses cgo since the interrupt // may be caught during cgo execution. func Shutdown() { // Stop accepting HTTP requests. httpAvail = false // Wait for chunk handlers. waits := 0 for { active := MaxChunkHandlers - len(HandlerToken) if waits >= 20 { dvid.Infof("Already waited for 20 seconds. Continuing with shutdown...") break } else if active > 0 { dvid.Infof("Waiting for %d chunk handlers to finish...\n", active) waits++ } else { dvid.Infof("No chunk handlers active. Proceeding...\n") break } time.Sleep(1 * time.Second) } dvid.Infof("Waiting 5 seconds for any HTTP requests to drain...\n") time.Sleep(5 * time.Second) datastore.Shutdown() dvid.BlockOnActiveCgo() rpc.Shutdown() dvid.Shutdown() shutdownCh <- struct{}{} }
// Shutdown handles graceful cleanup of server functions before exiting DVID. // This may not be so graceful if the chunk handler uses cgo since the interrupt // may be caught during cgo execution. func Shutdown() { waits := 0 for { active := MaxChunkHandlers - len(HandlerToken) if waits >= 20 { log.Printf("Already waited for 20 seconds. Continuing with shutdown...") break } else if active > 0 { log.Printf("Waiting for %d chunk handlers to finish...\n", active) waits++ } else { log.Println("No chunk handlers active...") break } time.Sleep(1 * time.Second) } datastore.Shutdown() storage.Shutdown() dvid.BlockOnActiveCgo() }