github.com/walkingsparrow/docker@v1.4.2-0.20151218153551-b708a2249bfa/layer/ro_layer.go (about) 1 package layer 2 3 import "io" 4 5 type roLayer struct { 6 chainID ChainID 7 diffID DiffID 8 parent *roLayer 9 cacheID string 10 size int64 11 layerStore *layerStore 12 13 referenceCount int 14 references map[Layer]struct{} 15 } 16 17 func (rl *roLayer) TarStream() (io.ReadCloser, error) { 18 r, err := rl.layerStore.store.TarSplitReader(rl.chainID) 19 if err != nil { 20 return nil, err 21 } 22 23 return rl.layerStore.assembleTar(rl.cacheID, r, nil) 24 } 25 26 func (rl *roLayer) ChainID() ChainID { 27 return rl.chainID 28 } 29 30 func (rl *roLayer) DiffID() DiffID { 31 return rl.diffID 32 } 33 34 func (rl *roLayer) Parent() Layer { 35 if rl.parent == nil { 36 return nil 37 } 38 return rl.parent 39 } 40 41 func (rl *roLayer) Size() (size int64, err error) { 42 if rl.parent != nil { 43 size, err = rl.parent.Size() 44 if err != nil { 45 return 46 } 47 } 48 49 return size + rl.size, nil 50 } 51 52 func (rl *roLayer) DiffSize() (size int64, err error) { 53 return rl.size, nil 54 } 55 56 func (rl *roLayer) Metadata() (map[string]string, error) { 57 return rl.layerStore.driver.GetMetadata(rl.cacheID) 58 } 59 60 type referencedCacheLayer struct { 61 *roLayer 62 } 63 64 func (rl *roLayer) getReference() Layer { 65 ref := &referencedCacheLayer{ 66 roLayer: rl, 67 } 68 rl.references[ref] = struct{}{} 69 70 return ref 71 } 72 73 func (rl *roLayer) hasReference(ref Layer) bool { 74 _, ok := rl.references[ref] 75 return ok 76 } 77 78 func (rl *roLayer) hasReferences() bool { 79 return len(rl.references) > 0 80 } 81 82 func (rl *roLayer) deleteReference(ref Layer) { 83 delete(rl.references, ref) 84 } 85 86 func (rl *roLayer) depth() int { 87 if rl.parent == nil { 88 return 1 89 } 90 return rl.parent.depth() + 1 91 } 92 93 func storeLayer(tx MetadataTransaction, layer *roLayer) error { 94 if err := tx.SetDiffID(layer.diffID); err != nil { 95 return err 96 } 97 if err := tx.SetSize(layer.size); err != nil { 98 return err 99 } 100 if err := tx.SetCacheID(layer.cacheID); err != nil { 101 return err 102 } 103 if layer.parent != nil { 104 if err := tx.SetParent(layer.parent.chainID); err != nil { 105 return err 106 } 107 } 108 109 return nil 110 }