From c8e8eeb91b8612f33bb3c53b552622ff19995c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E6=B3=BD=E8=BD=A9?= Date: Mon, 1 Jul 2024 10:11:52 +0800 Subject: [PATCH] fix race when recycling filterManager (#613) Signed-off-by: spacewander --- api/pkg/filtermanager/filtermanager.go | 12 +++++++++--- api/pkg/filtermanager/filtermanager_test.go | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/api/pkg/filtermanager/filtermanager.go b/api/pkg/filtermanager/filtermanager.go index b5d3acf2..b23fef66 100644 --- a/api/pkg/filtermanager/filtermanager.go +++ b/api/pkg/filtermanager/filtermanager.go @@ -43,7 +43,7 @@ type filterManager struct { encodeIdx int rspHdr api.ResponseHeaderMap - runningInGoThread atomic.Bool + runningInGoThread atomic.Int32 hdrLock sync.Mutex // FIXME: remove this once we get request headers from the OnLog directly // use a group of bools instead of map to avoid lookup @@ -71,6 +71,8 @@ func (m *filterManager) Reset() { m.encodeIdx = -1 m.rspHdr = nil + m.runningInGoThread.Store(0) // defence in depth + m.canSkipDecodeHeaders = false m.canSkipDecodeData = false m.canSkipEncodeHeaders = false @@ -81,11 +83,15 @@ func (m *filterManager) Reset() { } func (m *filterManager) IsRunningInGoThread() bool { - return m.runningInGoThread.Load() + return m.runningInGoThread.Load() != 0 } func (m *filterManager) MarkRunningInGoThread(flag bool) { - m.runningInGoThread.Store(flag) + if flag { + m.runningInGoThread.Add(1) + } else { + m.runningInGoThread.Add(-1) + } } func (m *filterManager) DebugModeEnabled() bool { diff --git a/api/pkg/filtermanager/filtermanager_test.go b/api/pkg/filtermanager/filtermanager_test.go index 19163d2c..b7445040 100644 --- a/api/pkg/filtermanager/filtermanager_test.go +++ b/api/pkg/filtermanager/filtermanager_test.go @@ -528,6 +528,7 @@ func (f *accessFieldOnLogFilter) OnLog(_ api.RequestHeaderMap, _ api.RequestTrai } func TestDoNotRecycleInUsedFilterManager(t *testing.T) { + envoy.DisableLogInTest() // otherwise, there is too much output config := initFilterManagerConfig("ns") config.parsed = []*model.ParsedFilterConfig{ { @@ -536,7 +537,7 @@ func TestDoNotRecycleInUsedFilterManager(t *testing.T) { }, } - n := 10 + n := 100 var wg sync.WaitGroup // DecodeHeaders