2015-11-18 17:15:00 -05:00
|
|
|
package layer
|
|
|
|
|
|
|
|
import "io"
|
|
|
|
|
|
|
|
type roLayer struct {
|
|
|
|
chainID ChainID
|
|
|
|
diffID DiffID
|
|
|
|
parent *roLayer
|
|
|
|
cacheID string
|
|
|
|
size int64
|
|
|
|
layerStore *layerStore
|
|
|
|
|
|
|
|
referenceCount int
|
|
|
|
references map[Layer]struct{}
|
|
|
|
}
|
|
|
|
|
2015-11-25 19:39:54 -05:00
|
|
|
func (rl *roLayer) TarStream() (io.ReadCloser, error) {
|
2015-11-18 17:15:00 -05:00
|
|
|
r, err := rl.layerStore.store.TarSplitReader(rl.chainID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2015-11-29 22:55:22 -05:00
|
|
|
pr, pw := io.Pipe()
|
|
|
|
go func() {
|
|
|
|
err := rl.layerStore.assembleTarTo(rl.cacheID, r, nil, pw)
|
|
|
|
if err != nil {
|
|
|
|
pw.CloseWithError(err)
|
|
|
|
} else {
|
|
|
|
pw.Close()
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return pr, nil
|
2015-11-18 17:15:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) ChainID() ChainID {
|
|
|
|
return rl.chainID
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) DiffID() DiffID {
|
|
|
|
return rl.diffID
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) Parent() Layer {
|
|
|
|
if rl.parent == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return rl.parent
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) Size() (size int64, err error) {
|
|
|
|
if rl.parent != nil {
|
|
|
|
size, err = rl.parent.Size()
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return size + rl.size, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) DiffSize() (size int64, err error) {
|
|
|
|
return rl.size, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) Metadata() (map[string]string, error) {
|
|
|
|
return rl.layerStore.driver.GetMetadata(rl.cacheID)
|
|
|
|
}
|
|
|
|
|
|
|
|
type referencedCacheLayer struct {
|
|
|
|
*roLayer
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) getReference() Layer {
|
|
|
|
ref := &referencedCacheLayer{
|
|
|
|
roLayer: rl,
|
|
|
|
}
|
|
|
|
rl.references[ref] = struct{}{}
|
|
|
|
|
|
|
|
return ref
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) hasReference(ref Layer) bool {
|
|
|
|
_, ok := rl.references[ref]
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) hasReferences() bool {
|
|
|
|
return len(rl.references) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) deleteReference(ref Layer) {
|
|
|
|
delete(rl.references, ref)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rl *roLayer) depth() int {
|
|
|
|
if rl.parent == nil {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
return rl.parent.depth() + 1
|
|
|
|
}
|
|
|
|
|
|
|
|
func storeLayer(tx MetadataTransaction, layer *roLayer) error {
|
|
|
|
if err := tx.SetDiffID(layer.diffID); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := tx.SetSize(layer.size); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := tx.SetCacheID(layer.cacheID); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if layer.parent != nil {
|
|
|
|
if err := tx.SetParent(layer.parent.chainID); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|