diff --git a/README.md b/README.md index a0121dc..8fdd9f1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ With `pgterminate`, you shouldn't be paged at night because some queries has loc # Highlights * `pgterminate` name is derived from `pg_terminate_backend` function, it terminates backends. * backends are called sessions in `pgterminate`. -* use `cancel` option to terminate query instead of session. +* `cancel` option terminate current query of active sessions instead of ending the whole backend. Idle sessions are terminated even with this option enabled because `pg_cancel_backend` function has no effect on them. * `active` sessions are backends in `active` state for more than `active-timeout` seconds. * `idle` sessions are backends in `idle`, `idle in transaction` or `idle in transaction (abort)` state for more than `idle-timeout` seconds. * at least one of `active-timeout` and `idle-timeout` parameter is required, both can be used. diff --git a/terminator/terminator.go b/terminator/terminator.go index b97d5c4..00ab241 100644 --- a/terminator/terminator.go +++ b/terminator/terminator.go @@ -38,28 +38,33 @@ func (t *Terminator) Run() { return default: sessions := t.db.Sessions() + + // Cancel or terminate active sessions if t.config.ActiveTimeout != 0 { - actives := activeSessions(sessions, t.config.ActiveTimeout) - t.terminateAndNotify(t.filter(actives)) + actives := t.filter(activeSessions(sessions, t.config.ActiveTimeout)) + if t.config.Cancel { + t.db.CancelSessions(actives) + } else { + t.db.TerminateSessions(actives) + } + t.notify(actives) } + // Terminate idle sessions if t.config.IdleTimeout != 0 { - idles := idleSessions(sessions, t.config.IdleTimeout) - t.terminateAndNotify(t.filter(idles)) + idles := t.filter(idleSessions(sessions, t.config.IdleTimeout)) + t.db.TerminateSessions(idles) + t.notify(idles) } + time.Sleep(time.Duration(t.config.Interval*1000) * time.Millisecond) } } } -// terminateAndNotify terminates a list of sessions and notifies channel -func (t *Terminator) terminateAndNotify(sessions []base.Session) { - if t.config.Cancel { - t.db.CancelSessions(sessions) - } else { - t.db.TerminateSessions(sessions) - } +// notify sends sessions to channel +func (t *Terminator) notify(sessions []base.Session) { for _, session := range sessions { t.sessions <- session }