layer_store.go 18 KB

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