mirror of
https://github.com/pomerium/pomerium.git
synced 2025-04-29 18:36:30 +02:00
databroker: fix in-memory backend deadlock (#3300)
This commit is contained in:
parent
f73c5c615f
commit
2e1366c417
2 changed files with 32 additions and 18 deletions
|
@ -188,6 +188,10 @@ func (backend *Backend) Lease(_ context.Context, leaseName, leaseID string, ttl
|
|||
|
||||
// Put puts a record into the in-memory store.
|
||||
func (backend *Backend) Put(ctx context.Context, records []*databroker.Record) (serverVersion uint64, err error) {
|
||||
backend.mu.Lock()
|
||||
defer backend.mu.Unlock()
|
||||
defer backend.onChange.Broadcast(ctx)
|
||||
|
||||
recordTypes := map[string]struct{}{}
|
||||
for _, record := range records {
|
||||
if record == nil {
|
||||
|
@ -200,10 +204,6 @@ func (backend *Backend) Put(ctx context.Context, records []*databroker.Record) (
|
|||
Str("db_type", record.Type)
|
||||
})
|
||||
|
||||
backend.mu.Lock()
|
||||
defer backend.mu.Unlock()
|
||||
defer backend.onChange.Broadcast(ctx)
|
||||
|
||||
backend.recordChange(record)
|
||||
|
||||
c, ok := backend.lookup[record.GetType()]
|
||||
|
|
|
@ -28,22 +28,36 @@ func TestBackend(t *testing.T) {
|
|||
})
|
||||
t.Run("get record", func(t *testing.T) {
|
||||
data := new(anypb.Any)
|
||||
sv, err := backend.Put(ctx, []*databroker.Record{{
|
||||
Type: "TYPE",
|
||||
Id: "abcd",
|
||||
Data: data,
|
||||
}})
|
||||
sv, err := backend.Put(ctx, []*databroker.Record{
|
||||
{
|
||||
Type: "TYPE",
|
||||
Id: "a",
|
||||
Data: data,
|
||||
},
|
||||
{
|
||||
Type: "TYPE",
|
||||
Id: "b",
|
||||
Data: data,
|
||||
},
|
||||
{
|
||||
Type: "TYPE",
|
||||
Id: "c",
|
||||
Data: data,
|
||||
},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, backend.serverVersion, sv)
|
||||
record, err := backend.Get(ctx, "TYPE", "abcd")
|
||||
require.NoError(t, err)
|
||||
if assert.NotNil(t, record) {
|
||||
assert.Equal(t, data, record.Data)
|
||||
assert.Nil(t, record.DeletedAt)
|
||||
assert.Equal(t, "abcd", record.Id)
|
||||
assert.NotNil(t, record.ModifiedAt)
|
||||
assert.Equal(t, "TYPE", record.Type)
|
||||
assert.Equal(t, uint64(1), record.Version)
|
||||
for i, id := range []string{"a", "b", "c"} {
|
||||
record, err := backend.Get(ctx, "TYPE", id)
|
||||
require.NoError(t, err)
|
||||
if assert.NotNil(t, record) {
|
||||
assert.Equal(t, data, record.Data)
|
||||
assert.Nil(t, record.DeletedAt)
|
||||
assert.Equal(t, id, record.Id)
|
||||
assert.NotNil(t, record.ModifiedAt)
|
||||
assert.Equal(t, "TYPE", record.Type)
|
||||
assert.Equal(t, uint64(i+1), record.Version)
|
||||
}
|
||||
}
|
||||
})
|
||||
t.Run("delete record", func(t *testing.T) {
|
||||
|
|
Loading…
Add table
Reference in a new issue