Merge pull request #1390 from iofq/master

Make HTTP server wait for tasks before shutdown
This commit is contained in:
André Roth
2024-11-10 15:38:47 +01:00
committed by GitHub
4 changed files with 17 additions and 5 deletions

View File

@@ -65,6 +65,8 @@ func aptlyAPIServe(cmd *commander.Command, args []string) error {
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
go (func() {
if _, ok := <-sigchan; ok {
fmt.Printf("\nShutdown signal received, waiting for background tasks...\n")
context.TaskList().Wait()
server.Shutdown(stdcontext.Background())
}
})()

View File

@@ -13,6 +13,7 @@ import (
"runtime/pprof"
"strings"
"sync"
"syscall"
"time"
"github.com/aptly-dev/aptly/aptly"
@@ -359,10 +360,7 @@ func (context *AptlyContext) ReOpenDatabase() error {
// NewCollectionFactory builds factory producing all kinds of collections
func (context *AptlyContext) NewCollectionFactory() *deb.CollectionFactory {
context.Lock()
defer context.Unlock()
db, err := context._database()
db, err := context.Database()
if err != nil {
Fatal(err)
}
@@ -560,7 +558,7 @@ func (context *AptlyContext) GoContextHandleSignals() {
// Catch ^C
sigch := make(chan os.Signal, 1)
signal.Notify(sigch, os.Interrupt)
signal.Notify(sigch, syscall.SIGINT, syscall.SIGTERM)
var cancel gocontext.CancelFunc

View File

@@ -133,6 +133,8 @@ func retryableError(err error) bool {
}
switch err {
case context.Canceled:
return false
case io.EOF:
return true
case io.ErrUnexpectedEOF:

View File

@@ -154,3 +154,13 @@ func (s *DownloaderSuite) TestGetLengthConnectError(c *C) {
c.Assert(err, ErrorMatches, ".*no such host")
}
func (s *DownloaderSuite) TestContextCancel(c *C) {
ctx, cancel := context.WithCancel(s.ctx)
s.ctx = ctx
cancel()
_, err := s.d.GetLength(s.ctx, "http://nosuch.host.invalid./")
c.Assert(err, ErrorMatches, ".*context canceled.*")
}