@@ -26,7 +26,9 @@ import (
2626 "github.com/stretchr/testify/require"
2727
2828 "github.com/elastic/beats/v7/filebeat/config"
29+ "github.com/elastic/beats/v7/filebeat/features"
2930 "github.com/elastic/beats/v7/libbeat/beat"
31+ "github.com/elastic/beats/v7/libbeat/statestore/storetest"
3032 "github.com/elastic/elastic-agent-libs/logp"
3133 "github.com/elastic/elastic-agent-libs/paths"
3234)
@@ -154,3 +156,50 @@ func TestOpenStateStore_ConcurrentOpenClose(t *testing.T) {
154156 globalMu .Unlock ()
155157 assert .False (t , exists , "entry should be cleaned up after all stores are closed" )
156158}
159+
160+ func TestOpenStateStore_DifferentESExtensionsShouldNotShare (t * testing.T ) {
161+ t .Setenv ("AGENTLESS_ELASTICSEARCH_STATE_STORE_INPUT_TYPES" , "dummy" )
162+ features .ReinitForTest ()
163+ t .Cleanup (func () {
164+ t .Setenv ("AGENTLESS_ELASTICSEARCH_STATE_STORE_INPUT_TYPES" , "" )
165+ features .ReinitForTest ()
166+ })
167+
168+ beatPaths := paths .New ()
169+ beatPaths .Data = t .TempDir ()
170+
171+ cfgWithExt := func (ext * storetest.MemoryStore ) config.Registry {
172+ return config.Registry {
173+ Path : "" ,
174+ Permissions : 0600 ,
175+ CleanInterval : time .Second ,
176+ ESStorageExtension : ext ,
177+ }
178+ }
179+
180+ extA := storetest .NewMemoryStoreBackend ()
181+ extB := storetest .NewMemoryStoreBackend ()
182+
183+ s1 , err := openStateStore (t .Context (), beat.Info {Beat : "testbeat" }, logp .NewNopLogger (), cfgWithExt (extA ), beatPaths )
184+ require .NoError (t , err )
185+ t .Cleanup (s1 .Close )
186+
187+ s2 , err := openStateStore (t .Context (), beat.Info {Beat : "testbeat" }, logp .NewNopLogger (), cfgWithExt (extB ), beatPaths )
188+ require .NoError (t , err )
189+ t .Cleanup (s2 .Close )
190+
191+ storeA , err := s1 .StoreFor ("dummy" )
192+ require .NoError (t , err )
193+ t .Cleanup (func () { _ = storeA .Close () })
194+
195+ storeB , err := s2 .StoreFor ("dummy" )
196+ require .NoError (t , err )
197+ t .Cleanup (func () { _ = storeB .Close () })
198+
199+ require .NoError (t , storeA .Set ("k" , map [string ]string {"v" : "from-a" }))
200+
201+ var got map [string ]string
202+ err = storeB .Get ("k" , & got )
203+ assert .Error (t , err , "expected independent storage extensions for stores with different ESStorageExtension instances" )
204+ assert .Nil (t , got , "no state should leak between stores with different ESStorageExtension instances" )
205+ }
0 commit comments