Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
| ... | ... |
@@ -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 {
|