mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Close logger only after StartLogger call
Signed-off-by: Jim Minter <jminter@redhat.com>
This commit is contained in:
parent
32ca1214fa
commit
68e71aa3e6
2 changed files with 29 additions and 23 deletions
|
@ -102,15 +102,23 @@ func (daemon *Daemon) ContainerAttachRaw(prefixOrName string, stdin io.ReadClose
|
||||||
|
|
||||||
func (daemon *Daemon) containerAttach(c *container.Container, cfg *stream.AttachConfig, logs, doStream bool) error {
|
func (daemon *Daemon) containerAttach(c *container.Container, cfg *stream.AttachConfig, logs, doStream bool) error {
|
||||||
if logs {
|
if logs {
|
||||||
logDriver, err := daemon.getLogger(c)
|
logDriver, logCreated, err := daemon.getLogger(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if logCreated {
|
||||||
|
defer func() {
|
||||||
|
if err = logDriver.Close(); err != nil {
|
||||||
|
logrus.Errorf("Error closing logger: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
cLog, ok := logDriver.(logger.LogReader)
|
cLog, ok := logDriver.(logger.LogReader)
|
||||||
if !ok {
|
if !ok {
|
||||||
return logger.ErrReadLogsNotSupported
|
return logger.ErrReadLogsNotSupported
|
||||||
}
|
}
|
||||||
logs := cLog.ReadLogs(logger.ReadConfig{Tail: -1})
|
logs := cLog.ReadLogs(logger.ReadConfig{Tail: -1})
|
||||||
|
defer logs.Close()
|
||||||
|
|
||||||
LogLoop:
|
LogLoop:
|
||||||
for {
|
for {
|
||||||
|
|
|
@ -45,10 +45,17 @@ func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, c
|
||||||
return nil, logger.ErrReadLogsNotSupported
|
return nil, logger.ErrReadLogsNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
cLog, err := daemon.getLogger(container)
|
cLog, cLogCreated, err := daemon.getLogger(container)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if cLogCreated {
|
||||||
|
defer func() {
|
||||||
|
if err = cLog.Close(); err != nil {
|
||||||
|
logrus.Errorf("Error closing logger: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
logReader, ok := cLog.(logger.LogReader)
|
logReader, ok := cLog.(logger.LogReader)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -85,23 +92,8 @@ func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, c
|
||||||
messageChan := make(chan *backend.LogMessage, 1)
|
messageChan := make(chan *backend.LogMessage, 1)
|
||||||
go func() {
|
go func() {
|
||||||
// set up some defers
|
// set up some defers
|
||||||
defer func() {
|
defer logs.Close()
|
||||||
// ok so this function, originally, was placed right after that
|
|
||||||
// logger.ReadLogs call above. I THINK that means it sets off the
|
|
||||||
// chain of events that results in the logger needing to be closed.
|
|
||||||
// i do not know if an error in time parsing above causing an early
|
|
||||||
// return will result in leaking the logger. if that is the case,
|
|
||||||
// it would also have been a bug in the original code
|
|
||||||
logs.Close()
|
|
||||||
if cLog != container.LogDriver {
|
|
||||||
// Since the logger isn't cached in the container, which
|
|
||||||
// occurs if it is running, it must get explicitly closed
|
|
||||||
// here to avoid leaking it and any file handles it has.
|
|
||||||
if err := cLog.Close(); err != nil {
|
|
||||||
logrus.Errorf("Error closing logger: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
// close the messages channel. closing is the only way to signal above
|
// close the messages channel. closing is the only way to signal above
|
||||||
// that we're doing with logs (other than context cancel i guess).
|
// that we're doing with logs (other than context cancel i guess).
|
||||||
defer close(messageChan)
|
defer close(messageChan)
|
||||||
|
@ -148,11 +140,17 @@ func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, c
|
||||||
return messageChan, nil
|
return messageChan, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (daemon *Daemon) getLogger(container *container.Container) (logger.Logger, error) {
|
func (daemon *Daemon) getLogger(container *container.Container) (l logger.Logger, created bool, err error) {
|
||||||
if container.LogDriver != nil && container.IsRunning() {
|
container.Lock()
|
||||||
return container.LogDriver, nil
|
if container.State.Running {
|
||||||
|
l = container.LogDriver
|
||||||
}
|
}
|
||||||
return container.StartLogger()
|
container.Unlock()
|
||||||
|
if l == nil {
|
||||||
|
created = true
|
||||||
|
l, err = container.StartLogger()
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// mergeLogConfig merges the daemon log config to the container's log config if the container's log driver is not specified.
|
// mergeLogConfig merges the daemon log config to the container's log config if the container's log driver is not specified.
|
||||||
|
|
Loading…
Reference in a new issue