Browse code

builder-next: close boltdb instances on error

These parts were flagged by my IDE, complaining about resources not being
closed properly. These code-paths open a bolt DB (which includes opening
the DB file, and acquiring a advisory lock on some file-descriptors).

This _probably_ is mostly cleanliness, as (AFAICS) all code paths leading
to an error would be in the daemon startup, and make the daemon exit, and
BoltDB should handle those OK, but probably won't do harm either to
explicitly close.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2026/02/03 19:20:34
Showing 2 changed files
... ...
@@ -60,12 +60,17 @@ type snapshotter struct {
60 60
 }
61 61
 
62 62
 // NewSnapshotter creates a new snapshotter
63
-func NewSnapshotter(opt Opt, prevLM leases.Manager, ns string) (snapshot.Snapshotter, *leaseutil.Manager, error) {
63
+func NewSnapshotter(opt Opt, prevLM leases.Manager, ns string) (_ snapshot.Snapshotter, _ *leaseutil.Manager, retErr error) {
64 64
 	dbPath := filepath.Join(opt.Root, "snapshots.db")
65 65
 	db, err := bolt.Open(dbPath, 0o600, nil)
66 66
 	if err != nil {
67 67
 		return nil, nil, errors.Wrapf(err, "failed to open database file %s", dbPath)
68 68
 	}
69
+	defer func() {
70
+		if retErr != nil {
71
+			_ = db.Close()
72
+		}
73
+	}()
69 74
 
70 75
 	reg, ok := opt.LayerStore.(graphIDRegistrar)
71 76
 	if !ok {
... ...
@@ -82,7 +82,7 @@ func getTraceExporter(ctx context.Context) trace.SpanExporter {
82 82
 	return tc
83 83
 }
84 84
 
85
-func newSnapshotterController(ctx context.Context, rt http.RoundTripper, opt Opt) (*control.Controller, error) {
85
+func newSnapshotterController(ctx context.Context, rt http.RoundTripper, opt Opt) (_ *control.Controller, retErr error) {
86 86
 	if err := os.MkdirAll(opt.Root, 0o711); err != nil {
87 87
 		return nil, err
88 88
 	}
... ...
@@ -91,11 +91,21 @@ func newSnapshotterController(ctx context.Context, rt http.RoundTripper, opt Opt
91 91
 	if err != nil {
92 92
 		return nil, err
93 93
 	}
94
+	defer func() {
95
+		if retErr != nil {
96
+			_ = historyDB.Close()
97
+		}
98
+	}()
94 99
 
95 100
 	cacheStorage, err := bboltcachestorage.NewStore(filepath.Join(opt.Root, "cache.db"))
96 101
 	if err != nil {
97 102
 		return nil, err
98 103
 	}
104
+	defer func() {
105
+		if retErr != nil {
106
+			_ = cacheStorage.Close()
107
+		}
108
+	}()
99 109
 
100 110
 	nc := netproviders.Opt{
101 111
 		Mode: "host",
... ...
@@ -234,7 +244,7 @@ func openHistoryDB(root string, fn string, cfg *config.BuilderHistoryConfig) (*b
234 234
 	return db, conf, nil
235 235
 }
236 236
 
237
-func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt) (*control.Controller, error) {
237
+func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt) (_ *control.Controller, retErr error) {
238 238
 	if err := os.MkdirAll(opt.Root, 0o711); err != nil {
239 239
 		return nil, err
240 240
 	}
... ...
@@ -272,6 +282,11 @@ func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt
272 272
 	if err != nil {
273 273
 		return nil, errors.WithStack(err)
274 274
 	}
275
+	defer func() {
276
+		if retErr != nil {
277
+			_ = db.Close()
278
+		}
279
+	}()
275 280
 
276 281
 	mdb := ctdmetadata.NewDB(db, innerStore, map[string]snapshots.Snapshotter{})
277 282
 
... ...
@@ -286,6 +301,11 @@ func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt
286 286
 	if err != nil {
287 287
 		return nil, err
288 288
 	}
289
+	defer func() {
290
+		if retErr != nil {
291
+			_ = snapshotter.Close()
292
+		}
293
+	}()
289 294
 
290 295
 	if err := cache.MigrateV2(context.Background(), filepath.Join(root, "metadata.db"), filepath.Join(root, "metadata_v2.db"), store, snapshotter, lm); err != nil {
291 296
 		return nil, err
... ...
@@ -295,6 +315,11 @@ func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt
295 295
 	if err != nil {
296 296
 		return nil, err
297 297
 	}
298
+	defer func() {
299
+		if retErr != nil {
300
+			_ = md.Close()
301
+		}
302
+	}()
298 303
 
299 304
 	layerGetter, ok := snapshotter.(imagerefchecker.LayerGetter)
300 305
 	if !ok {
... ...
@@ -380,11 +405,21 @@ func newGraphDriverController(ctx context.Context, rt http.RoundTripper, opt Opt
380 380
 	if err != nil {
381 381
 		return nil, err
382 382
 	}
383
+	defer func() {
384
+		if retErr != nil {
385
+			_ = cacheStorage.Close()
386
+		}
387
+	}()
383 388
 
384 389
 	historyDB, historyConf, err := openHistoryDB(opt.Root, "history.db", opt.BuilderConfig.History)
385 390
 	if err != nil {
386 391
 		return nil, err
387 392
 	}
393
+	defer func() {
394
+		if retErr != nil {
395
+			_ = historyDB.Close()
396
+		}
397
+	}()
388 398
 
389 399
 	gcPolicy, err := getGCPolicy(opt.BuilderConfig, root)
390 400
 	if err != nil {