Skip to content
This repository was archived by the owner on Oct 13, 2023. It is now read-only.

Commit 7fdbfac

Browse files
authored
Merge pull request #40921 from cpuguy83/19.03_log_rotate_error_handling
19.03: logfile: Check if log is closed on close error during rotate Upstream-commit: c4c6cf6b6a353d7bdcd1e2f92eebec0d2c0b8cd9 Component: engine
2 parents e0a599a + 9854078 commit 7fdbfac

7 files changed

Lines changed: 168 additions & 20 deletions

File tree

components/engine/daemon/logger/loggerutils/logfile.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,11 @@ func (w *LogFile) checkCapacityAndRotate() error {
175175
w.rotateMu.Lock()
176176
fname := w.f.Name()
177177
if err := w.f.Close(); err != nil {
178-
w.rotateMu.Unlock()
179-
return errors.Wrap(err, "error closing file")
178+
// if there was an error during a prior rotate, the file could already be closed
179+
if !errors.Is(err, os.ErrClosed) {
180+
w.rotateMu.Unlock()
181+
return errors.Wrap(err, "error closing file")
182+
}
180183
}
181184
if err := rotate(fname, w.maxFiles, w.compress); err != nil {
182185
w.rotateMu.Unlock()

components/engine/daemon/logger/loggerutils/logfile_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/docker/docker/daemon/logger"
14+
"github.com/docker/docker/pkg/pubsub"
1415
"github.com/docker/docker/pkg/tailfile"
1516
"gotest.tools/assert"
1617
)
@@ -201,3 +202,66 @@ func TestFollowLogsProducerGone(t *testing.T) {
201202
default:
202203
}
203204
}
205+
206+
func TestCheckCapacityAndRotate(t *testing.T) {
207+
dir, err := ioutil.TempDir("", t.Name())
208+
assert.NilError(t, err)
209+
defer os.RemoveAll(dir)
210+
211+
f, err := ioutil.TempFile(dir, "log")
212+
assert.NilError(t, err)
213+
214+
l := &LogFile{
215+
f: f,
216+
capacity: 5,
217+
maxFiles: 3,
218+
compress: true,
219+
notifyRotate: pubsub.NewPublisher(0, 1),
220+
perms: 0600,
221+
marshal: func(msg *logger.Message) ([]byte, error) {
222+
return msg.Line, nil
223+
},
224+
}
225+
defer l.Close()
226+
227+
assert.NilError(t, l.WriteLogEntry(&logger.Message{Line: []byte("hello world!")}))
228+
229+
dStringer := dirStringer{dir}
230+
231+
_, err = os.Stat(f.Name() + ".1")
232+
assert.Assert(t, os.IsNotExist(err), dStringer)
233+
234+
assert.NilError(t, l.WriteLogEntry(&logger.Message{Line: []byte("hello world!")}))
235+
_, err = os.Stat(f.Name() + ".1")
236+
assert.NilError(t, err, dStringer)
237+
238+
assert.NilError(t, l.WriteLogEntry(&logger.Message{Line: []byte("hello world!")}))
239+
_, err = os.Stat(f.Name() + ".1")
240+
assert.NilError(t, err, dStringer)
241+
_, err = os.Stat(f.Name() + ".2.gz")
242+
assert.NilError(t, err, dStringer)
243+
244+
// Now let's simulate a failed rotation where the file was able to be closed but something else happened elsewhere
245+
// down the line.
246+
// We want to make sure that we can recover in the case that `l.f` was closed while attempting a rotation.
247+
l.f.Close()
248+
assert.NilError(t, l.WriteLogEntry(&logger.Message{Line: []byte("hello world!")}))
249+
}
250+
251+
type dirStringer struct {
252+
d string
253+
}
254+
255+
func (d dirStringer) String() string {
256+
ls, err := ioutil.ReadDir(d.d)
257+
if err != nil {
258+
return ""
259+
}
260+
var s strings.Builder
261+
s.WriteString("\n")
262+
263+
for _, fi := range ls {
264+
s.WriteString(fi.Name() + "\n")
265+
}
266+
return s.String()
267+
}

components/engine/vendor.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ github.com/prometheus/client_model 6f3806018612930941127f2a7c6c
149149
github.com/prometheus/common 7600349dcfe1abd18d72d3a1770870d9800a7801
150150
github.com/prometheus/procfs 7d6f385de8bea29190f15ba9931442a0eaef9af7
151151
github.com/matttproud/golang_protobuf_extensions c12348ce28de40eed0136aa2b644d0ee0650e56c # v1.0.1
152-
github.com/pkg/errors ba968bfe8b2f7e042a574c888954fccecfa385b4 # v0.8.1
152+
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
153153
github.com/grpc-ecosystem/go-grpc-prometheus c225b8c3b01faf2899099b768856a9e916e5087b # v1.2.0
154154

155155
# cli

components/engine/vendor/github.com/pkg/errors/README.md

Lines changed: 9 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/engine/vendor/github.com/pkg/errors/errors.go

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/engine/vendor/github.com/pkg/errors/go113.go

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/engine/vendor/github.com/pkg/errors/stack.go

Lines changed: 44 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)