github.com/endocode/docker@v1.4.2-0.20160113120958-46eb4700391e/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 pr, pw := io.Pipe() 24 go func() { 25 err := rl.layerStore.assembleTarTo(rl.cacheID, r, nil, pw) 26 if err != nil { 27 pw.CloseWithError(err) 28 } else { 29 pw.Close() 30 } 31 }() 32 return pr, nil 33 } 34 35 func (rl *roLayer) ChainID() ChainID { 36 return rl.chainID 37 } 38 39 func (rl *roLayer) DiffID() DiffID { 40 return rl.diffID 41 } 42 43 func (rl *roLayer) Parent() Layer { 44 if rl.parent == nil { 45 return nil 46 } 47 return rl.parent 48 } 49 50 func (rl *roLayer) Size() (size int64, err error) { 51 if rl.parent != nil { 52 size, err = rl.parent.Size() 53 if err != nil { 54 return 55 } 56 } 57 58 return size + rl.size, nil 59 } 60 61 func (rl *roLayer) DiffSize() (size int64, err error) { 62 return rl.size, nil 63 } 64 65 func (rl *roLayer) Metadata() (map[string]string, error) { 66 return rl.layerStore.driver.GetMetadata(rl.cacheID) 67 } 68 69 type referencedCacheLayer struct { 70 *roLayer 71 } 72 73 func (rl *roLayer) getReference() Layer { 74 ref := &referencedCacheLayer{ 75 roLayer: rl, 76 } 77 rl.references[ref] = struct{}{} 78 79 return ref 80 } 81 82 func (rl *roLayer) hasReference(ref Layer) bool { 83 _, ok := rl.references[ref] 84 return ok 85 } 86 87 func (rl *roLayer) hasReferences() bool { 88 return len(rl.references) > 0 89 } 90 91 func (rl *roLayer) deleteReference(ref Layer) { 92 delete(rl.references, ref) 93 } 94 95 func (rl *roLayer) depth() int { 96 if rl.parent == nil { 97 return 1 98 } 99 return rl.parent.depth() + 1 100 } 101 102 func storeLayer(tx MetadataTransaction, layer *roLayer) error { 103 if err := tx.SetDiffID(layer.diffID); err != nil { 104 return err 105 } 106 if err := tx.SetSize(layer.size); err != nil { 107 return err 108 } 109 if err := tx.SetCacheID(layer.cacheID); err != nil { 110 return err 111 } 112 if layer.parent != nil { 113 if err := tx.SetParent(layer.parent.chainID); err != nil { 114 return err 115 } 116 } 117 118 return nil 119 }