From 4c7a4e64a3223de2af37bbe5b0ad4409c362ce86 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Tue, 10 Jul 2018 10:32:28 -0700 Subject: [PATCH] builder: fix duplicate calls to mountable Signed-off-by: Tonis Tiigi Upstream-commit: ffa7233d1538363fe12ad609e720b8d75e8768de Component: engine --- .../api/server/router/build/build_routes.go | 1 - .../adapters/snapshot/snapshot.go | 80 ++++++++++++------- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/components/engine/api/server/router/build/build_routes.go b/components/engine/api/server/router/build/build_routes.go index c4699f3d86..3073479ccf 100644 --- a/components/engine/api/server/router/build/build_routes.go +++ b/components/engine/api/server/router/build/build_routes.go @@ -208,7 +208,6 @@ func (br *buildRouter) postBuild(ctx context.Context, w http.ResponseWriter, r * output.Write(notVerboseBuffer.Bytes()) } - logrus.Debugf("isflushed %v", output.Flushed()) // Do not write the error in the http output if it's still empty. // This prevents from writing a 200(OK) when there is an internal error. if !output.Flushed() { diff --git a/components/engine/builder/builder-next/adapters/snapshot/snapshot.go b/components/engine/builder/builder-next/adapters/snapshot/snapshot.go index 9934c8ae3a..5b2c583a17 100644 --- a/components/engine/builder/builder-next/adapters/snapshot/snapshot.go +++ b/components/engine/builder/builder-next/adapters/snapshot/snapshot.go @@ -245,21 +245,23 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) (snapshot.Mountabl } if l != nil { id := identity.NewID() - rwlayer, err := s.opt.LayerStore.CreateRWLayer(id, l.ChainID(), nil) - if err != nil { - return nil, err - } - rootfs, err := rwlayer.Mount("") - if err != nil { - return nil, err - } - mnt := []mount.Mount{{ - Source: rootfs.Path(), - Type: "bind", - Options: []string{"rbind"}, - }} - return &constMountable{ - mounts: mnt, + var rwlayer layer.RWLayer + return &mountable{ + acquire: func() ([]mount.Mount, error) { + rwlayer, err = s.opt.LayerStore.CreateRWLayer(id, l.ChainID(), nil) + if err != nil { + return nil, err + } + rootfs, err := rwlayer.Mount("") + if err != nil { + return nil, err + } + return []mount.Mount{{ + Source: rootfs.Path(), + Type: "bind", + Options: []string{"rbind"}, + }}, nil + }, release: func() error { _, err := s.opt.LayerStore.ReleaseRWLayer(rwlayer) return err @@ -269,17 +271,18 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) (snapshot.Mountabl id, _ := s.getGraphDriverID(key) - rootfs, err := s.opt.GraphDriver.Get(id, "") - if err != nil { - return nil, err - } - mnt := []mount.Mount{{ - Source: rootfs.Path(), - Type: "bind", - Options: []string{"rbind"}, - }} - return &constMountable{ - mounts: mnt, + return &mountable{ + acquire: func() ([]mount.Mount, error) { + rootfs, err := s.opt.GraphDriver.Get(id, "") + if err != nil { + return nil, err + } + return []mount.Mount{{ + Source: rootfs.Path(), + Type: "bind", + Options: []string{"rbind"}, + }}, nil + }, release: func() error { return s.opt.GraphDriver.Put(id) }, @@ -428,18 +431,37 @@ func (s *snapshotter) Close() error { return s.db.Close() } -type constMountable struct { +type mountable struct { + mu sync.Mutex mounts []mount.Mount + acquire func() ([]mount.Mount, error) release func() error } -func (m *constMountable) Mount() ([]mount.Mount, error) { +func (m *mountable) Mount() ([]mount.Mount, error) { + m.mu.Lock() + defer m.mu.Unlock() + + if m.mounts != nil { + return m.mounts, nil + } + + mounts, err := m.acquire() + if err != nil { + return nil, err + } + m.mounts = mounts + return m.mounts, nil } -func (m *constMountable) Release() error { +func (m *mountable) Release() error { + m.mu.Lock() + defer m.mu.Unlock() if m.release == nil { return nil } + + m.mounts = nil return m.release() }