layer_store.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. package layer // import "github.com/docker/docker/layer"
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "sync"
  9. "github.com/docker/distribution"
  10. "github.com/docker/docker/daemon/graphdriver"
  11. "github.com/docker/docker/pkg/idtools"
  12. "github.com/docker/docker/pkg/plugingetter"
  13. "github.com/docker/docker/pkg/stringid"
  14. "github.com/docker/docker/pkg/system"
  15. "github.com/moby/locker"
  16. digest "github.com/opencontainers/go-digest"
  17. "github.com/sirupsen/logrus"
  18. "github.com/vbatts/tar-split/tar/asm"
  19. "github.com/vbatts/tar-split/tar/storage"
  20. )
  21. // maxLayerDepth represents the maximum number of
  22. // layers which can be chained together. 125 was
  23. // chosen to account for the 127 max in some
  24. // graphdrivers plus the 2 additional layers
  25. // used to create a rwlayer.
  26. const maxLayerDepth = 125
  27. type layerStore struct {
  28. store *fileMetadataStore
  29. driver graphdriver.Driver
  30. useTarSplit bool
  31. layerMap map[ChainID]*roLayer
  32. layerL sync.Mutex
  33. mounts map[string]*mountedLayer
  34. mountL sync.Mutex
  35. // protect *RWLayer() methods from operating on the same name/id
  36. locker *locker.Locker
  37. os string
  38. }
  39. // StoreOptions are the options used to create a new Store instance
  40. type StoreOptions struct {
  41. Root string
  42. MetadataStorePathTemplate string
  43. GraphDriver string
  44. GraphDriverOptions []string
  45. IDMapping *idtools.IdentityMapping
  46. PluginGetter plugingetter.PluginGetter
  47. ExperimentalEnabled bool
  48. OS string
  49. }
  50. // NewStoreFromOptions creates a new Store instance
  51. func NewStoreFromOptions(options StoreOptions) (Store, error) {
  52. driver, err := graphdriver.New(options.GraphDriver, options.PluginGetter, graphdriver.Options{
  53. Root: options.Root,
  54. DriverOptions: options.GraphDriverOptions,
  55. UIDMaps: options.IDMapping.UIDs(),
  56. GIDMaps: options.IDMapping.GIDs(),
  57. ExperimentalEnabled: options.ExperimentalEnabled,
  58. })
  59. if err != nil {
  60. return nil, fmt.Errorf("error initializing graphdriver: %v", err)
  61. }
  62. logrus.Debugf("Initialized graph driver %s", driver)
  63. root := fmt.Sprintf(options.MetadataStorePathTemplate, driver)
  64. return newStoreFromGraphDriver(root, driver, options.OS)
  65. }
  66. // newStoreFromGraphDriver creates a new Store instance using the provided
  67. // metadata store and graph driver. The metadata store will be used to restore
  68. // the Store.
  69. func newStoreFromGraphDriver(root string, driver graphdriver.Driver, os string) (Store, error) {
  70. if !system.IsOSSupported(os) {
  71. return nil, fmt.Errorf("failed to initialize layer store as operating system '%s' is not supported", os)
  72. }
  73. caps := graphdriver.Capabilities{}
  74. if capDriver, ok := driver.(graphdriver.CapabilityDriver); ok {
  75. caps = capDriver.Capabilities()
  76. }
  77. ms, err := newFSMetadataStore(root)
  78. if err != nil {
  79. return nil, err
  80. }
  81. ls := &layerStore{
  82. store: ms,
  83. driver: driver,
  84. layerMap: map[ChainID]*roLayer{},
  85. mounts: map[string]*mountedLayer{},
  86. locker: locker.New(),
  87. useTarSplit: !caps.ReproducesExactDiffs,
  88. os: os,
  89. }
  90. ids, mounts, err := ms.List()
  91. if err != nil {
  92. return nil, err
  93. }
  94. for _, id := range ids {
  95. l, err := ls.loadLayer(id)
  96. if err != nil {
  97. logrus.Debugf("Failed to load layer %s: %s", id, err)
  98. continue
  99. }
  100. if l.parent != nil {
  101. l.parent.referenceCount++
  102. }
  103. }
  104. for _, mount := range mounts {
  105. if err := ls.loadMount(mount); err != nil {
  106. logrus.Debugf("Failed to load mount %s: %s", mount, err)
  107. }
  108. }
  109. return ls, nil
  110. }
  111. func (ls *layerStore) Driver() graphdriver.Driver {
  112. return ls.driver
  113. }
  114. func (ls *layerStore) loadLayer(layer ChainID) (*roLayer, error) {
  115. cl, ok := ls.layerMap[layer]
  116. if ok {
  117. return cl, nil
  118. }
  119. diff, err := ls.store.GetDiffID(layer)
  120. if err != nil {
  121. return nil, fmt.Errorf("failed to get diff id for %s: %s", layer, err)
  122. }
  123. size, err := ls.store.GetSize(layer)
  124. if err != nil {
  125. return nil, fmt.Errorf("failed to get size for %s: %s", layer, err)
  126. }
  127. cacheID, err := ls.store.GetCacheID(layer)
  128. if err != nil {
  129. return nil, fmt.Errorf("failed to get cache id for %s: %s", layer, err)
  130. }
  131. parent, err := ls.store.GetParent(layer)
  132. if err != nil {
  133. return nil, fmt.Errorf("failed to get parent for %s: %s", layer, err)
  134. }
  135. descriptor, err := ls.store.GetDescriptor(layer)
  136. if err != nil {
  137. return nil, fmt.Errorf("failed to get descriptor for %s: %s", layer, err)
  138. }
  139. os, err := ls.store.getOS(layer)
  140. if err != nil {
  141. return nil, fmt.Errorf("failed to get operating system for %s: %s", layer, err)
  142. }
  143. if os != ls.os {
  144. return nil, fmt.Errorf("failed to load layer with os %s into layerstore for %s", os, ls.os)
  145. }
  146. cl = &roLayer{
  147. chainID: layer,
  148. diffID: diff,
  149. size: size,
  150. cacheID: cacheID,
  151. layerStore: ls,
  152. references: map[Layer]struct{}{},
  153. descriptor: descriptor,
  154. }
  155. if parent != "" {
  156. p, err := ls.loadLayer(parent)
  157. if err != nil {
  158. return nil, err
  159. }
  160. cl.parent = p
  161. }
  162. ls.layerMap[cl.chainID] = cl
  163. return cl, nil
  164. }
  165. func (ls *layerStore) loadMount(mount string) error {
  166. ls.mountL.Lock()
  167. defer ls.mountL.Unlock()
  168. if _, ok := ls.mounts[mount]; ok {
  169. return nil
  170. }
  171. mountID, err := ls.store.GetMountID(mount)
  172. if err != nil {
  173. return err
  174. }
  175. initID, err := ls.store.GetInitID(mount)
  176. if err != nil {
  177. return err
  178. }
  179. parent, err := ls.store.GetMountParent(mount)
  180. if err != nil {
  181. return err
  182. }
  183. ml := &mountedLayer{
  184. name: mount,
  185. mountID: mountID,
  186. initID: initID,
  187. layerStore: ls,
  188. references: map[RWLayer]*referencedRWLayer{},
  189. }
  190. if parent != "" {
  191. p, err := ls.loadLayer(parent)
  192. if err != nil {
  193. return err
  194. }
  195. ml.parent = p
  196. p.referenceCount++
  197. }
  198. ls.mounts[ml.name] = ml
  199. return nil
  200. }
  201. func (ls *layerStore) applyTar(tx *fileMetadataTransaction, ts io.Reader, parent string, layer *roLayer) error {
  202. digester := digest.Canonical.Digester()
  203. tr := io.TeeReader(ts, digester.Hash())
  204. rdr := tr
  205. if ls.useTarSplit {
  206. tsw, err := tx.TarSplitWriter(true)
  207. if err != nil {
  208. return err
  209. }
  210. metaPacker := storage.NewJSONPacker(tsw)
  211. defer tsw.Close()
  212. // we're passing nil here for the file putter, because the ApplyDiff will
  213. // handle the extraction of the archive
  214. rdr, err = asm.NewInputTarStream(tr, metaPacker, nil)
  215. if err != nil {
  216. return err
  217. }
  218. }
  219. applySize, err := ls.driver.ApplyDiff(layer.cacheID, parent, rdr)
  220. // discard trailing data but ensure metadata is picked up to reconstruct stream
  221. // unconditionally call io.Copy here before checking err to ensure the resources
  222. // allocated by NewInputTarStream above are always released
  223. io.Copy(io.Discard, rdr) // ignore error as reader may be closed
  224. if err != nil {
  225. return err
  226. }
  227. layer.size = applySize
  228. layer.diffID = DiffID(digester.Digest())
  229. logrus.Debugf("Applied tar %s to %s, size: %d", layer.diffID, layer.cacheID, applySize)
  230. return nil
  231. }
  232. func (ls *layerStore) Register(ts io.Reader, parent ChainID) (Layer, error) {
  233. return ls.registerWithDescriptor(ts, parent, distribution.Descriptor{})
  234. }
  235. func (ls *layerStore) registerWithDescriptor(ts io.Reader, parent ChainID, descriptor distribution.Descriptor) (Layer, error) {
  236. // err is used to hold the error which will always trigger
  237. // cleanup of creates sources but may not be an error returned
  238. // to the caller (already exists).
  239. var err error
  240. var pid string
  241. var p *roLayer
  242. if string(parent) != "" {
  243. p = ls.get(parent)
  244. if p == nil {
  245. return nil, ErrLayerDoesNotExist
  246. }
  247. pid = p.cacheID
  248. // Release parent chain if error
  249. defer func() {
  250. if err != nil {
  251. ls.layerL.Lock()
  252. ls.releaseLayer(p)
  253. ls.layerL.Unlock()
  254. }
  255. }()
  256. if p.depth() >= maxLayerDepth {
  257. err = ErrMaxDepthExceeded
  258. return nil, err
  259. }
  260. }
  261. // Create new roLayer
  262. layer := &roLayer{
  263. parent: p,
  264. cacheID: stringid.GenerateRandomID(),
  265. referenceCount: 1,
  266. layerStore: ls,
  267. references: map[Layer]struct{}{},
  268. descriptor: descriptor,
  269. }
  270. if err = ls.driver.Create(layer.cacheID, pid, nil); err != nil {
  271. return nil, err
  272. }
  273. tx, err := ls.store.StartTransaction()
  274. if err != nil {
  275. return nil, err
  276. }
  277. defer func() {
  278. if err != nil {
  279. logrus.Debugf("Cleaning up layer %s: %v", layer.cacheID, err)
  280. if err := ls.driver.Remove(layer.cacheID); err != nil {
  281. logrus.Errorf("Error cleaning up cache layer %s: %v", layer.cacheID, err)
  282. }
  283. if err := tx.Cancel(); err != nil {
  284. logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err)
  285. }
  286. }
  287. }()
  288. if err = ls.applyTar(tx, ts, pid, layer); err != nil {
  289. return nil, err
  290. }
  291. if layer.parent == nil {
  292. layer.chainID = ChainID(layer.diffID)
  293. } else {
  294. layer.chainID = createChainIDFromParent(layer.parent.chainID, layer.diffID)
  295. }
  296. if err = storeLayer(tx, layer); err != nil {
  297. return nil, err
  298. }
  299. ls.layerL.Lock()
  300. defer ls.layerL.Unlock()
  301. if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil {
  302. // Set error for cleanup, but do not return the error
  303. err = errors.New("layer already exists")
  304. return existingLayer.getReference(), nil
  305. }
  306. if err = tx.Commit(layer.chainID); err != nil {
  307. return nil, err
  308. }
  309. ls.layerMap[layer.chainID] = layer
  310. return layer.getReference(), nil
  311. }
  312. func (ls *layerStore) getWithoutLock(layer ChainID) *roLayer {
  313. l, ok := ls.layerMap[layer]
  314. if !ok {
  315. return nil
  316. }
  317. l.referenceCount++
  318. return l
  319. }
  320. func (ls *layerStore) get(l ChainID) *roLayer {
  321. ls.layerL.Lock()
  322. defer ls.layerL.Unlock()
  323. return ls.getWithoutLock(l)
  324. }
  325. func (ls *layerStore) Get(l ChainID) (Layer, error) {
  326. ls.layerL.Lock()
  327. defer ls.layerL.Unlock()
  328. layer := ls.getWithoutLock(l)
  329. if layer == nil {
  330. return nil, ErrLayerDoesNotExist
  331. }
  332. return layer.getReference(), nil
  333. }
  334. func (ls *layerStore) Map() map[ChainID]Layer {
  335. ls.layerL.Lock()
  336. defer ls.layerL.Unlock()
  337. layers := map[ChainID]Layer{}
  338. for k, v := range ls.layerMap {
  339. layers[k] = v
  340. }
  341. return layers
  342. }
  343. func (ls *layerStore) deleteLayer(layer *roLayer, metadata *Metadata) error {
  344. // Rename layer digest folder first so we detect orphan layer(s)
  345. // if ls.driver.Remove fails
  346. var dir string
  347. for {
  348. dgst := digest.Digest(layer.chainID)
  349. tmpID := fmt.Sprintf("%s-%s-removing", dgst.Hex(), stringid.GenerateRandomID())
  350. dir = filepath.Join(ls.store.root, string(dgst.Algorithm()), tmpID)
  351. err := os.Rename(ls.store.getLayerDirectory(layer.chainID), dir)
  352. if os.IsExist(err) {
  353. continue
  354. }
  355. break
  356. }
  357. err := ls.driver.Remove(layer.cacheID)
  358. if err != nil {
  359. return err
  360. }
  361. err = os.RemoveAll(dir)
  362. if err != nil {
  363. return err
  364. }
  365. metadata.DiffID = layer.diffID
  366. metadata.ChainID = layer.chainID
  367. metadata.Size, err = layer.Size()
  368. if err != nil {
  369. return err
  370. }
  371. metadata.DiffSize = layer.size
  372. return nil
  373. }
  374. func (ls *layerStore) releaseLayer(l *roLayer) ([]Metadata, error) {
  375. depth := 0
  376. removed := []Metadata{}
  377. for {
  378. if l.referenceCount == 0 {
  379. panic("layer not retained")
  380. }
  381. l.referenceCount--
  382. if l.referenceCount != 0 {
  383. return removed, nil
  384. }
  385. if len(removed) == 0 && depth > 0 {
  386. panic("cannot remove layer with child")
  387. }
  388. if l.hasReferences() {
  389. panic("cannot delete referenced layer")
  390. }
  391. // Remove layer from layer map first so it is not considered to exist
  392. // when if ls.deleteLayer fails.
  393. delete(ls.layerMap, l.chainID)
  394. var metadata Metadata
  395. if err := ls.deleteLayer(l, &metadata); err != nil {
  396. return nil, err
  397. }
  398. removed = append(removed, metadata)
  399. if l.parent == nil {
  400. return removed, nil
  401. }
  402. depth++
  403. l = l.parent
  404. }
  405. }
  406. func (ls *layerStore) Release(l Layer) ([]Metadata, error) {
  407. ls.layerL.Lock()
  408. defer ls.layerL.Unlock()
  409. layer, ok := ls.layerMap[l.ChainID()]
  410. if !ok {
  411. return []Metadata{}, nil
  412. }
  413. if !layer.hasReference(l) {
  414. return nil, ErrLayerNotRetained
  415. }
  416. layer.deleteReference(l)
  417. return ls.releaseLayer(layer)
  418. }
  419. func (ls *layerStore) CreateRWLayer(name string, parent ChainID, opts *CreateRWLayerOpts) (_ RWLayer, err error) {
  420. var (
  421. storageOpt map[string]string
  422. initFunc MountInit
  423. mountLabel string
  424. )
  425. if opts != nil {
  426. mountLabel = opts.MountLabel
  427. storageOpt = opts.StorageOpt
  428. initFunc = opts.InitFunc
  429. }
  430. ls.locker.Lock(name)
  431. defer ls.locker.Unlock(name)
  432. ls.mountL.Lock()
  433. _, ok := ls.mounts[name]
  434. ls.mountL.Unlock()
  435. if ok {
  436. return nil, ErrMountNameConflict
  437. }
  438. var pid string
  439. var p *roLayer
  440. if string(parent) != "" {
  441. p = ls.get(parent)
  442. if p == nil {
  443. return nil, ErrLayerDoesNotExist
  444. }
  445. pid = p.cacheID
  446. // Release parent chain if error
  447. defer func() {
  448. if err != nil {
  449. ls.layerL.Lock()
  450. ls.releaseLayer(p)
  451. ls.layerL.Unlock()
  452. }
  453. }()
  454. }
  455. m := &mountedLayer{
  456. name: name,
  457. parent: p,
  458. mountID: ls.mountID(name),
  459. layerStore: ls,
  460. references: map[RWLayer]*referencedRWLayer{},
  461. }
  462. if initFunc != nil {
  463. pid, err = ls.initMount(m.mountID, pid, mountLabel, initFunc, storageOpt)
  464. if err != nil {
  465. return
  466. }
  467. m.initID = pid
  468. }
  469. createOpts := &graphdriver.CreateOpts{
  470. StorageOpt: storageOpt,
  471. }
  472. if err = ls.driver.CreateReadWrite(m.mountID, pid, createOpts); err != nil {
  473. return
  474. }
  475. if err = ls.saveMount(m); err != nil {
  476. return
  477. }
  478. return m.getReference(), nil
  479. }
  480. func (ls *layerStore) GetRWLayer(id string) (RWLayer, error) {
  481. ls.locker.Lock(id)
  482. defer ls.locker.Unlock(id)
  483. ls.mountL.Lock()
  484. mount := ls.mounts[id]
  485. ls.mountL.Unlock()
  486. if mount == nil {
  487. return nil, ErrMountDoesNotExist
  488. }
  489. return mount.getReference(), nil
  490. }
  491. func (ls *layerStore) GetMountID(id string) (string, error) {
  492. ls.mountL.Lock()
  493. mount := ls.mounts[id]
  494. ls.mountL.Unlock()
  495. if mount == nil {
  496. return "", ErrMountDoesNotExist
  497. }
  498. logrus.Debugf("GetMountID id: %s -> mountID: %s", id, mount.mountID)
  499. return mount.mountID, nil
  500. }
  501. func (ls *layerStore) ReleaseRWLayer(l RWLayer) ([]Metadata, error) {
  502. name := l.Name()
  503. ls.locker.Lock(name)
  504. defer ls.locker.Unlock(name)
  505. ls.mountL.Lock()
  506. m := ls.mounts[name]
  507. ls.mountL.Unlock()
  508. if m == nil {
  509. return []Metadata{}, nil
  510. }
  511. if err := m.deleteReference(l); err != nil {
  512. return nil, err
  513. }
  514. if m.hasReferences() {
  515. return []Metadata{}, nil
  516. }
  517. if err := ls.driver.Remove(m.mountID); err != nil {
  518. logrus.Errorf("Error removing mounted layer %s: %s", m.name, err)
  519. m.retakeReference(l)
  520. return nil, err
  521. }
  522. if m.initID != "" {
  523. if err := ls.driver.Remove(m.initID); err != nil {
  524. logrus.Errorf("Error removing init layer %s: %s", m.name, err)
  525. m.retakeReference(l)
  526. return nil, err
  527. }
  528. }
  529. if err := ls.store.RemoveMount(m.name); err != nil {
  530. logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err)
  531. m.retakeReference(l)
  532. return nil, err
  533. }
  534. ls.mountL.Lock()
  535. delete(ls.mounts, name)
  536. ls.mountL.Unlock()
  537. ls.layerL.Lock()
  538. defer ls.layerL.Unlock()
  539. if m.parent != nil {
  540. return ls.releaseLayer(m.parent)
  541. }
  542. return []Metadata{}, nil
  543. }
  544. func (ls *layerStore) saveMount(mount *mountedLayer) error {
  545. if err := ls.store.SetMountID(mount.name, mount.mountID); err != nil {
  546. return err
  547. }
  548. if mount.initID != "" {
  549. if err := ls.store.SetInitID(mount.name, mount.initID); err != nil {
  550. return err
  551. }
  552. }
  553. if mount.parent != nil {
  554. if err := ls.store.SetMountParent(mount.name, mount.parent.chainID); err != nil {
  555. return err
  556. }
  557. }
  558. ls.mountL.Lock()
  559. ls.mounts[mount.name] = mount
  560. ls.mountL.Unlock()
  561. return nil
  562. }
  563. func (ls *layerStore) initMount(graphID, parent, mountLabel string, initFunc MountInit, storageOpt map[string]string) (string, error) {
  564. // Use "<graph-id>-init" to maintain compatibility with graph drivers
  565. // which are expecting this layer with this special name. If all
  566. // graph drivers can be updated to not rely on knowing about this layer
  567. // then the initID should be randomly generated.
  568. initID := fmt.Sprintf("%s-init", graphID)
  569. createOpts := &graphdriver.CreateOpts{
  570. MountLabel: mountLabel,
  571. StorageOpt: storageOpt,
  572. }
  573. if err := ls.driver.CreateReadWrite(initID, parent, createOpts); err != nil {
  574. return "", err
  575. }
  576. p, err := ls.driver.Get(initID, "")
  577. if err != nil {
  578. return "", err
  579. }
  580. if err := initFunc(p); err != nil {
  581. ls.driver.Put(initID)
  582. return "", err
  583. }
  584. if err := ls.driver.Put(initID); err != nil {
  585. return "", err
  586. }
  587. return initID, nil
  588. }
  589. func (ls *layerStore) getTarStream(rl *roLayer) (io.ReadCloser, error) {
  590. if !ls.useTarSplit {
  591. var parentCacheID string
  592. if rl.parent != nil {
  593. parentCacheID = rl.parent.cacheID
  594. }
  595. return ls.driver.Diff(rl.cacheID, parentCacheID)
  596. }
  597. r, err := ls.store.TarSplitReader(rl.chainID)
  598. if err != nil {
  599. return nil, err
  600. }
  601. pr, pw := io.Pipe()
  602. go func() {
  603. err := ls.assembleTarTo(rl.cacheID, r, nil, pw)
  604. if err != nil {
  605. pw.CloseWithError(err)
  606. } else {
  607. pw.Close()
  608. }
  609. }()
  610. return pr, nil
  611. }
  612. func (ls *layerStore) assembleTarTo(graphID string, metadata io.ReadCloser, size *int64, w io.Writer) error {
  613. diffDriver, ok := ls.driver.(graphdriver.DiffGetterDriver)
  614. if !ok {
  615. diffDriver = &naiveDiffPathDriver{ls.driver}
  616. }
  617. defer metadata.Close()
  618. // get our relative path to the container
  619. fileGetCloser, err := diffDriver.DiffGetter(graphID)
  620. if err != nil {
  621. return err
  622. }
  623. defer fileGetCloser.Close()
  624. metaUnpacker := storage.NewJSONUnpacker(metadata)
  625. upackerCounter := &unpackSizeCounter{metaUnpacker, size}
  626. logrus.Debugf("Assembling tar data for %s", graphID)
  627. return asm.WriteOutputTarStream(fileGetCloser, upackerCounter, w)
  628. }
  629. func (ls *layerStore) Cleanup() error {
  630. orphanLayers, err := ls.store.getOrphan()
  631. if err != nil {
  632. logrus.Errorf("Cannot get orphan layers: %v", err)
  633. }
  634. logrus.Debugf("found %v orphan layers", len(orphanLayers))
  635. for _, orphan := range orphanLayers {
  636. logrus.Debugf("removing orphan layer, chain ID: %v , cache ID: %v", orphan.chainID, orphan.cacheID)
  637. err = ls.driver.Remove(orphan.cacheID)
  638. if err != nil && !os.IsNotExist(err) {
  639. logrus.WithError(err).WithField("cache-id", orphan.cacheID).Error("cannot remove orphan layer")
  640. continue
  641. }
  642. err = ls.store.Remove(orphan.chainID, orphan.cacheID)
  643. if err != nil {
  644. logrus.WithError(err).WithField("chain-id", orphan.chainID).Error("cannot remove orphan layer metadata")
  645. }
  646. }
  647. return ls.driver.Cleanup()
  648. }
  649. func (ls *layerStore) DriverStatus() [][2]string {
  650. return ls.driver.Status()
  651. }
  652. func (ls *layerStore) DriverName() string {
  653. return ls.driver.String()
  654. }
  655. type naiveDiffPathDriver struct {
  656. graphdriver.Driver
  657. }
  658. type fileGetPutter struct {
  659. storage.FileGetter
  660. driver graphdriver.Driver
  661. id string
  662. }
  663. func (w *fileGetPutter) Close() error {
  664. return w.driver.Put(w.id)
  665. }
  666. func (n *naiveDiffPathDriver) DiffGetter(id string) (graphdriver.FileGetCloser, error) {
  667. p, err := n.Driver.Get(id, "")
  668. if err != nil {
  669. return nil, err
  670. }
  671. return &fileGetPutter{storage.NewPathFileGetter(p.Path()), n.Driver, id}, nil
  672. }