Browse code

Remove temporary layer download file on error

Currently, the temporary file storing downloaded layer data is only
removed after a successful download or a digest verification error. A
transport-level error does not cause it to be removed. This is a
regression from 1.9 that could cause disk usage to grow until the Docker
daemon is restarted.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>

Aaron Lehmann authored on 2016/01/26 11:20:18
Showing 1 changed files
... ...
@@ -171,6 +171,10 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre
171 171
 
172 172
 	_, err = io.Copy(tmpFile, io.TeeReader(reader, verifier))
173 173
 	if err != nil {
174
+		tmpFile.Close()
175
+		if err := os.Remove(tmpFile.Name()); err != nil {
176
+			logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
177
+		}
174 178
 		return nil, 0, retryOnError(err)
175 179
 	}
176 180
 
... ...
@@ -179,8 +183,9 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre
179 179
 	if !verifier.Verified() {
180 180
 		err = fmt.Errorf("filesystem layer verification failed for digest %s", ld.digest)
181 181
 		logrus.Error(err)
182
+
182 183
 		tmpFile.Close()
183
-		if err := os.RemoveAll(tmpFile.Name()); err != nil {
184
+		if err := os.Remove(tmpFile.Name()); err != nil {
184 185
 			logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
185 186
 		}
186 187
 
... ...
@@ -191,7 +196,14 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre
191 191
 
192 192
 	logrus.Debugf("Downloaded %s to tempfile %s", ld.ID(), tmpFile.Name())
193 193
 
194
-	tmpFile.Seek(0, 0)
194
+	_, err = tmpFile.Seek(0, os.SEEK_SET)
195
+	if err != nil {
196
+		tmpFile.Close()
197
+		if err := os.Remove(tmpFile.Name()); err != nil {
198
+			logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
199
+		}
200
+		return nil, 0, xfer.DoNotRetry{Err: err}
201
+	}
195 202
 	return ioutils.NewReadCloserWrapper(tmpFile, tmpFileCloser(tmpFile)), size, nil
196 203
 }
197 204