Browse code

builder: add usage to snapshotter adapter

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2018/05/16 06:51:07
Showing 1 changed files
... ...
@@ -3,6 +3,7 @@ package snapshot
3 3
 import (
4 4
 	"context"
5 5
 	"path/filepath"
6
+	"strconv"
6 7
 	"strings"
7 8
 	"sync"
8 9
 
... ...
@@ -331,7 +332,69 @@ func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
331 331
 }
332 332
 
333 333
 func (s *snapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
334
-	return snapshots.Usage{}, nil
334
+	usage := snapshots.Usage{}
335
+	if l, err := s.getLayer(key); err != nil {
336
+		return usage, err
337
+	} else if l != nil {
338
+		s, err := l.DiffSize()
339
+		if err != nil {
340
+			return usage, err
341
+		}
342
+		usage.Size = s
343
+		return usage, nil
344
+	}
345
+
346
+	size := int64(-1)
347
+	if err := s.db.View(func(tx *bolt.Tx) error {
348
+		b := tx.Bucket([]byte(key))
349
+		if b == nil {
350
+			return nil
351
+		}
352
+		v := b.Get(keySize)
353
+		if v != nil {
354
+			s, err := strconv.Atoi(string(v))
355
+			if err != nil {
356
+				return err
357
+			}
358
+			size = int64(s)
359
+		}
360
+		return nil
361
+	}); err != nil {
362
+		return usage, err
363
+	}
364
+
365
+	if size != -1 {
366
+		usage.Size = size
367
+		return usage, nil
368
+	}
369
+
370
+	id, _ := s.getGraphDriverID(key)
371
+
372
+	info, err := s.Stat(ctx, key)
373
+	if err != nil {
374
+		return usage, err
375
+	}
376
+	var parent string
377
+	if info.Parent != "" {
378
+		parent, _ = s.getGraphDriverID(info.Parent)
379
+	}
380
+
381
+	diffSize, err := s.opt.GraphDriver.DiffSize(id, parent)
382
+	if err != nil {
383
+		return usage, err
384
+	}
385
+
386
+	if err := s.db.Update(func(tx *bolt.Tx) error {
387
+		b, err := tx.CreateBucketIfNotExists([]byte(key))
388
+		if err != nil {
389
+			return err
390
+		}
391
+		return b.Put(keySize, []byte(strconv.Itoa(int(diffSize))))
392
+	}); err != nil {
393
+		return usage, err
394
+	}
395
+	usage.Size = int64(diffSize)
396
+	return usage, nil
335 397
 }
336 398
 
337 399
 func (s *snapshotter) Close() error {