Merge pull request #8164 from Luap99/journal-events

Improve the journal event reading
This commit is contained in:
OpenShift Merge Robot
2020-10-27 17:07:45 +01:00
committed by GitHub

View File

@ -69,35 +69,39 @@ func (e EventJournalD) Read(ctx context.Context, options ReadOptions) error {
if err != nil {
return errors.Wrapf(err, "failed to generate event options")
}
j, err := sdjournal.NewJournal() //nolint
j, err := sdjournal.NewJournal()
if err != nil {
return err
}
// TODO AddMatch and Seek seem to conflict
// Issue filed upstream -> https://github.com/coreos/go-systemd/issues/315
// Leaving commented code in case upstream fixes things
//podmanJournal := sdjournal.Match{Field: "SYSLOG_IDENTIFIER", Value: "podman"} //nolint
//if err := j.AddMatch(podmanJournal.String()); err != nil {
// return errors.Wrap(err, "failed to add filter for event log")
//}
// match only podman journal entries
podmanJournal := sdjournal.Match{Field: "SYSLOG_IDENTIFIER", Value: "podman"}
if err := j.AddMatch(podmanJournal.String()); err != nil {
return errors.Wrap(err, "failed to add journal filter for event log")
}
if len(options.Since) == 0 && len(options.Until) == 0 && options.Stream {
if err := j.SeekTail(); err != nil {
return errors.Wrap(err, "failed to seek end of journal")
}
} else {
podmanJournal := sdjournal.Match{Field: "SYSLOG_IDENTIFIER", Value: "podman"} //nolint
if err := j.AddMatch(podmanJournal.String()); err != nil {
return errors.Wrap(err, "failed to add filter for event log")
// After SeekTail calling Next moves to a random entry.
// To prevent this we have to call Previous first.
// see: https://bugs.freedesktop.org/show_bug.cgi?id=64614
if _, err := j.Previous(); err != nil {
return errors.Wrap(err, "failed to move journal cursor to previous entry")
}
}
// the api requires a next|prev before getting a cursor
if _, err := j.Next(); err != nil {
return err
return errors.Wrap(err, "failed to move journal cursor to next entry")
}
prevCursor, err := j.GetCursor()
if err != nil {
return err
return errors.Wrap(err, "failed to get journal cursor")
}
for {
select {
case <-ctx.Done():
@ -106,30 +110,26 @@ func (e EventJournalD) Read(ctx context.Context, options ReadOptions) error {
default:
// fallthrough
}
if _, err := j.Next(); err != nil {
return err
return errors.Wrap(err, "failed to move journal cursor to next entry")
}
newCursor, err := j.GetCursor()
if err != nil {
return err
return errors.Wrap(err, "failed to get journal cursor")
}
if prevCursor == newCursor {
if len(options.Until) > 0 || !options.Stream {
break
}
_ = j.Wait(sdjournal.IndefiniteWait) //nolint
_ = j.Wait(sdjournal.IndefiniteWait)
continue
}
prevCursor = newCursor
entry, err := j.GetEntry()
if err != nil {
return err
}
// TODO this keeps us from feeding the podman event parser with
// with regular journal content; it can be removed if the above
// problem with AddMatch is resolved.
if entry.Fields["PODMAN_EVENT"] == "" {
continue
return errors.Wrap(err, "failed to read journal entry")
}
newEvent, err := newEventFromJournalEntry(entry)
if err != nil {