diff --git a/pkg/api/controller.go b/pkg/api/controller.go index a7348cd1..e501589a 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -455,12 +455,18 @@ func (c *Controller) LoadNewConfig(newConfig *config.Config) { } func (c *Controller) Shutdown() { + // stop all background tasks c.StopBackgroundTasks() if c.Server != nil { ctx := context.Background() _ = c.Server.Shutdown(ctx) } + + // close metadb + if c.MetaDB != nil { + c.MetaDB.Close() + } } // Will stop scheduler and wait for all tasks to finish their work. diff --git a/pkg/meta/boltdb/boltdb.go b/pkg/meta/boltdb/boltdb.go index 41f28fd3..32be0b77 100644 --- a/pkg/meta/boltdb/boltdb.go +++ b/pkg/meta/boltdb/boltdb.go @@ -2102,3 +2102,10 @@ func resetBucket(transaction *bbolt.Tx, bucketName string) error { return err } + +func (bdw *BoltDB) Close() error { + err := bdw.DB.Close() + bdw.DB = nil + + return err +} diff --git a/pkg/meta/dynamodb/dynamodb.go b/pkg/meta/dynamodb/dynamodb.go index 2eb0b63f..9e2e31c4 100644 --- a/pkg/meta/dynamodb/dynamodb.go +++ b/pkg/meta/dynamodb/dynamodb.go @@ -2274,3 +2274,7 @@ func (dwr *DynamoDB) getDBVersion() (string, error) { return version, nil } + +func (dwr *DynamoDB) Close() error { + return nil +} diff --git a/pkg/meta/meta.go b/pkg/meta/meta.go index 5eabf7dd..522a5390 100644 --- a/pkg/meta/meta.go +++ b/pkg/meta/meta.go @@ -147,3 +147,7 @@ func toStringIfOk(cacheDriverConfig map[string]interface{}, return str, true } + +func Close(metadb mTypes.MetaDB) error { + return metadb.Close() +} diff --git a/pkg/meta/redis/redis.go b/pkg/meta/redis/redis.go index 97ca5807..b8d623f9 100644 --- a/pkg/meta/redis/redis.go +++ b/pkg/meta/redis/redis.go @@ -2321,3 +2321,10 @@ func unmarshalProtoRepoBlobs(repo string, repoBlobsBytes []byte) (*proto_go.Repo func join(xs ...string) string { return strings.Join(xs, ":") } + +func (rc *RedisDB) Close() error { + err := rc.Client.Close() + rc.Client = nil + + return err +} diff --git a/pkg/meta/types/types.go b/pkg/meta/types/types.go index 3b53ba63..f6bbcdba 100644 --- a/pkg/meta/types/types.go +++ b/pkg/meta/types/types.go @@ -156,6 +156,9 @@ type MetaDB interface { //nolint:interfacebloat ImageTrustStore() ImageTrustStore SetImageTrustStore(imgTrustStore ImageTrustStore) + + // Close will close the db + Close() error } type UserDB interface { //nolint:interfacebloat diff --git a/pkg/test/mocks/repo_db_mock.go b/pkg/test/mocks/repo_db_mock.go index 53ca5f2a..86a1e242 100644 --- a/pkg/test/mocks/repo_db_mock.go +++ b/pkg/test/mocks/repo_db_mock.go @@ -103,6 +103,8 @@ type MetaDBMock struct { GetAllRepoNamesFn func() ([]string, error) ResetDBFn func() error + + CloseFn func() error } func (sdm MetaDBMock) DeleteRepoMeta(repo string) error { @@ -461,3 +463,11 @@ func (sdm MetaDBMock) ResetRepoReferences(repo string) error { return nil } + +func (sdm MetaDBMock) Close() error { + if sdm.CloseFn != nil { + return sdm.CloseFn() + } + + return nil +}