mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
outlet/clickhouse: ensure we don't cancel flushing when we don't need
Some checks failed
CI / 🤖 Check dependabot status (push) Has been cancelled
CI / 🐧 Test on Linux (${{ github.ref_type == 'tag' }}, misc) (push) Has been cancelled
CI / 🐧 Test on Linux (coverage) (push) Has been cancelled
CI / 🐧 Test on Linux (regular) (push) Has been cancelled
CI / ❄️ Build on Nix (push) Has been cancelled
CI / 🍏 Build and test on macOS (push) Has been cancelled
CI / 🧪 End-to-end testing (push) Has been cancelled
CI / 🔍 Upload code coverage (push) Has been cancelled
CI / 🔬 Test only Go (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 20) (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 22) (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 24) (push) Has been cancelled
CI / ⚖️ Check licenses (push) Has been cancelled
CI / 🐋 Build Docker images (push) Has been cancelled
CI / 🐋 Tag Docker images (push) Has been cancelled
CI / 🚀 Publish release (push) Has been cancelled
Some checks failed
CI / 🤖 Check dependabot status (push) Has been cancelled
CI / 🐧 Test on Linux (${{ github.ref_type == 'tag' }}, misc) (push) Has been cancelled
CI / 🐧 Test on Linux (coverage) (push) Has been cancelled
CI / 🐧 Test on Linux (regular) (push) Has been cancelled
CI / ❄️ Build on Nix (push) Has been cancelled
CI / 🍏 Build and test on macOS (push) Has been cancelled
CI / 🧪 End-to-end testing (push) Has been cancelled
CI / 🔍 Upload code coverage (push) Has been cancelled
CI / 🔬 Test only Go (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 20) (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 22) (push) Has been cancelled
CI / 🔬 Test only JS (${{ needs.dependabot.outputs.package-ecosystem }}, 24) (push) Has been cancelled
CI / ⚖️ Check licenses (push) Has been cancelled
CI / 🐋 Build Docker images (push) Has been cancelled
CI / 🐋 Tag Docker images (push) Has been cancelled
CI / 🚀 Publish release (push) Has been cancelled
We really want to use max(current deadline, grace period timeout), but this is not easy with contexts. So, we spawn a goroutine for that. We need some extra care to ensure it does not leak. Maybe it would be easier to just use `context.Background()`?
This commit is contained in:
@@ -136,9 +136,32 @@ func (w *realWorker) Flush(ctx context.Context) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't use the parent context, it may be too short.
|
// Ensure the context lives for at least GracePeriod.
|
||||||
chCtx, cancel := context.WithTimeout(context.Background(), w.c.config.GracePeriod)
|
chCtx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel() // needed in case the operation completes before grace period and parent context
|
||||||
|
go func() {
|
||||||
|
gracePeriodTimer := time.NewTimer(w.c.config.GracePeriod)
|
||||||
|
defer gracePeriodTimer.Stop()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-gracePeriodTimer.C:
|
||||||
|
// Grace period elapsed, now wait for parent or end of operation.
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
case <-chCtx.Done():
|
||||||
|
}
|
||||||
|
case <-ctx.Done():
|
||||||
|
// Parent done before grace period, wait for grace period or end of operation.
|
||||||
|
select {
|
||||||
|
case <-gracePeriodTimer.C:
|
||||||
|
w.logger.Info().Msg("grace period to flush batch expired")
|
||||||
|
case <-chCtx.Done():
|
||||||
|
}
|
||||||
|
case <-chCtx.Done():
|
||||||
|
// Operation done!
|
||||||
|
}
|
||||||
|
cancel()
|
||||||
|
}()
|
||||||
|
|
||||||
// Send to ClickHouse in flows_XXXXX_raw.
|
// Send to ClickHouse in flows_XXXXX_raw.
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|||||||
Reference in New Issue
Block a user