github.com/ncdc/docker@v0.10.1-0.20160129113957-6c6729ef5b74/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  }