From 954df433e98f659d006ced52b23151cb5eb2fdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Fri, 23 Jun 2023 22:57:51 +0200 Subject: [PATCH] Promtail: Fix file descriptor leak (#8987) This reduces the amount of open file descriptors per followed journal file from 3 to 2. It also releases file descriptors for removed files (journal vacuuming). The `defaultJournalEntryFunc` is only called once upon startup. It creates a `Journal` instance to only read a single entry to determine the age of the entry referenced in the positions file. Right after, this instance is not required anymore. The actually used `Journal` instance used to follow the journal is created inside `journalTargetWithReader`. --- CHANGELOG.md | 1 + .../promtail/targets/journal/journaltarget.go | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34445ad9cf..bb718737b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,7 @@ * [8988](https://github.com/grafana/loki/pull/8988) **darxriggs**: Promtail: Prevent logging errors on normal shutdown. * [9155](https://github.com/grafana/loki/pull/9155) **farodin91**: Promtail: Break on iterate journal failure. +* [8987](https://github.com/grafana/loki/pull/8987) **darxriggs**: Promtail: Fix file descriptor leak. #### LogCLI diff --git a/clients/pkg/promtail/targets/journal/journaltarget.go b/clients/pkg/promtail/targets/journal/journaltarget.go index 02bceaf535..6630b827e7 100644 --- a/clients/pkg/promtail/targets/journal/journaltarget.go +++ b/clients/pkg/promtail/targets/journal/journaltarget.go @@ -56,21 +56,25 @@ var defaultJournalReaderFunc = func(c sdjournal.JournalReaderConfig) (journalRea return sdjournal.NewJournalReader(c) } -var defaultJournalEntryFunc = func(c sdjournal.JournalReaderConfig, cursor string) (*sdjournal.JournalEntry, error) { - var ( - journal *sdjournal.Journal - err error - ) +var defaultJournalEntryFunc = func(c sdjournal.JournalReaderConfig, cursor string) (entry *sdjournal.JournalEntry, err error) { + var journal *sdjournal.Journal if c.Path != "" { journal, err = sdjournal.NewJournalFromDir(c.Path) } else { journal, err = sdjournal.NewJournal() } - if err != nil { return nil, err - } else if err := journal.SeekCursor(cursor); err != nil { + } + defer func() { + if errClose := journal.Close(); err == nil { + err = errClose + } + }() + + err = journal.SeekCursor(cursor) + if err != nil { return nil, err }