layer_windows.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package layer
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/Sirupsen/logrus"
  6. "github.com/docker/distribution/digest"
  7. "github.com/docker/docker/daemon/graphdriver"
  8. )
  9. // GetLayerPath returns the path to a layer
  10. func GetLayerPath(s Store, layer ChainID) (string, error) {
  11. ls, ok := s.(*layerStore)
  12. if !ok {
  13. return "", errors.New("unsupported layer store")
  14. }
  15. ls.layerL.Lock()
  16. defer ls.layerL.Unlock()
  17. rl, ok := ls.layerMap[layer]
  18. if !ok {
  19. return "", ErrLayerDoesNotExist
  20. }
  21. path, err := ls.driver.Get(rl.cacheID, "")
  22. if err != nil {
  23. return "", err
  24. }
  25. if err := ls.driver.Put(rl.cacheID); err != nil {
  26. return "", err
  27. }
  28. return path, nil
  29. }
  30. func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error) {
  31. var err error // this is used for cleanup in existingLayer case
  32. diffID := digest.FromBytes([]byte(graphID))
  33. // Create new roLayer
  34. layer := &roLayer{
  35. cacheID: graphID,
  36. diffID: DiffID(diffID),
  37. referenceCount: 1,
  38. layerStore: ls,
  39. references: map[Layer]struct{}{},
  40. size: size,
  41. }
  42. tx, err := ls.store.StartTransaction()
  43. if err != nil {
  44. return nil, err
  45. }
  46. defer func() {
  47. if err != nil {
  48. if err := tx.Cancel(); err != nil {
  49. logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err)
  50. }
  51. }
  52. }()
  53. layer.chainID = createChainIDFromParent("", layer.diffID)
  54. if !ls.driver.Exists(layer.cacheID) {
  55. return nil, fmt.Errorf("layer %q is unknown to driver", layer.cacheID)
  56. }
  57. if err = storeLayer(tx, layer); err != nil {
  58. return nil, err
  59. }
  60. ls.layerL.Lock()
  61. defer ls.layerL.Unlock()
  62. if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil {
  63. // Set error for cleanup, but do not return
  64. err = errors.New("layer already exists")
  65. return existingLayer.getReference(), nil
  66. }
  67. if err = tx.Commit(layer.chainID); err != nil {
  68. return nil, err
  69. }
  70. ls.layerMap[layer.chainID] = layer
  71. return layer.getReference(), nil
  72. }
  73. func (ls *layerStore) mountID(name string) string {
  74. // windows has issues if container ID doesn't match mount ID
  75. return name
  76. }
  77. func (ls *layerStore) GraphDriver() graphdriver.Driver {
  78. return ls.driver
  79. }