Merge pull request #3789 from pwaller/issue-3674

Fix for #3674 Can't `rm` containers when disk full
This commit is contained in:
Michael Crosby 2014-01-27 17:00:16 -08:00
commit ed12818f99
2 changed files with 8 additions and 10 deletions

View File

@ -231,6 +231,7 @@ Paul Morie <pmorie@gmail.com>
Paul Nasrat <pnasrat@gmail.com>
Paul <paul9869@gmail.com>
Peter Braden <peterbraden@peterbraden.co.uk>
Peter Waller <p@pwaller.net>
Phil Spitler <pspitler@gmail.com>
Pierre-Alain RIVIERE <pariviere@ippon.fr>
Piotr Bogdan <ppbogdan@gmail.com>

View File

@ -192,20 +192,17 @@ func (a *Driver) Remove(id string) error {
"diff",
}
// Remove the dirs atomically
// Atomically remove each directory in turn by first moving it out of the
// way (so that docker doesn't find it anymore) before doing removal of
// the whole tree.
for _, p := range tmpDirs {
// We need to use a temp dir in the same dir as the driver so Rename
// does not fall back to the slow copy if /tmp and the driver dir
// are on different devices
tmp := path.Join(a.rootPath(), "tmp", p, id)
if err := os.MkdirAll(tmp, 0755); err != nil {
return err
}
realPath := path.Join(a.rootPath(), p, id)
if err := os.Rename(realPath, tmp); err != nil && !os.IsNotExist(err) {
tmpPath := path.Join(a.rootPath(), p, fmt.Sprintf("%s-removing", id))
if err := os.Rename(realPath, tmpPath); err != nil && !os.IsNotExist(err) {
return err
}
defer os.RemoveAll(tmp)
defer os.RemoveAll(tmpPath)
}
// Remove the layers file for the id