mounted_layer.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package layer // import "github.com/docker/docker/layer"
  2. import (
  3. "io"
  4. "sync"
  5. "github.com/docker/docker/pkg/archive"
  6. )
  7. type mountedLayer struct {
  8. name string
  9. mountID string
  10. initID string
  11. parent *roLayer
  12. layerStore *layerStore
  13. sync.Mutex
  14. references map[RWLayer]*referencedRWLayer
  15. }
  16. func (ml *mountedLayer) cacheParent() string {
  17. if ml.initID != "" {
  18. return ml.initID
  19. }
  20. if ml.parent != nil {
  21. return ml.parent.cacheID
  22. }
  23. return ""
  24. }
  25. func (ml *mountedLayer) TarStream() (io.ReadCloser, error) {
  26. return ml.layerStore.driver.Diff(ml.mountID, ml.cacheParent())
  27. }
  28. func (ml *mountedLayer) Name() string {
  29. return ml.name
  30. }
  31. func (ml *mountedLayer) Parent() Layer {
  32. if ml.parent != nil {
  33. return ml.parent
  34. }
  35. // Return a nil interface instead of an interface wrapping a nil
  36. // pointer.
  37. return nil
  38. }
  39. func (ml *mountedLayer) Size() (int64, error) {
  40. return ml.layerStore.driver.DiffSize(ml.mountID, ml.cacheParent())
  41. }
  42. func (ml *mountedLayer) Changes() ([]archive.Change, error) {
  43. return ml.layerStore.driver.Changes(ml.mountID, ml.cacheParent())
  44. }
  45. func (ml *mountedLayer) Metadata() (map[string]string, error) {
  46. return ml.layerStore.driver.GetMetadata(ml.mountID)
  47. }
  48. func (ml *mountedLayer) getReference() RWLayer {
  49. ref := &referencedRWLayer{
  50. mountedLayer: ml,
  51. }
  52. ml.Lock()
  53. ml.references[ref] = ref
  54. ml.Unlock()
  55. return ref
  56. }
  57. func (ml *mountedLayer) hasReferences() bool {
  58. ml.Lock()
  59. ret := len(ml.references) > 0
  60. ml.Unlock()
  61. return ret
  62. }
  63. func (ml *mountedLayer) deleteReference(ref RWLayer) error {
  64. ml.Lock()
  65. defer ml.Unlock()
  66. if _, ok := ml.references[ref]; !ok {
  67. return ErrLayerNotRetained
  68. }
  69. delete(ml.references, ref)
  70. return nil
  71. }
  72. func (ml *mountedLayer) retakeReference(r RWLayer) {
  73. if ref, ok := r.(*referencedRWLayer); ok {
  74. ml.Lock()
  75. ml.references[ref] = ref
  76. ml.Unlock()
  77. }
  78. }
  79. type referencedRWLayer struct {
  80. *mountedLayer
  81. }
  82. func (rl *referencedRWLayer) Mount(mountLabel string) (string, error) {
  83. return rl.layerStore.driver.Get(rl.mountedLayer.mountID, mountLabel)
  84. }
  85. // Unmount decrements the activity count and unmounts the underlying layer
  86. // Callers should only call `Unmount` once per call to `Mount`, even on error.
  87. func (rl *referencedRWLayer) Unmount() error {
  88. return rl.layerStore.driver.Put(rl.mountedLayer.mountID)
  89. }
  90. // ApplyDiff applies specified diff to the layer
  91. func (rl *referencedRWLayer) ApplyDiff(diff io.Reader) (int64, error) {
  92. return rl.layerStore.driver.ApplyDiff(rl.mountID, rl.cacheParent(), diff)
  93. }