From 3af09535162d35772b510f6dfd2912dfad73e4b1 Mon Sep 17 00:00:00 2001 From: Bernd Verst <4535280+berndverst@users.noreply.github.com> Date: Wed, 16 Nov 2022 19:59:22 -0800 Subject: [PATCH] Postgres State Store: Add Support for First-Write concurrency Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> --- state/postgresql/postgresdbaccess.go | 6 +++++- tests/config/state/tests.yml | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/state/postgresql/postgresdbaccess.go b/state/postgresql/postgresdbaccess.go index 8ffa628d9..3e62985a2 100644 --- a/state/postgresql/postgresdbaccess.go +++ b/state/postgresql/postgresdbaccess.go @@ -143,7 +143,11 @@ func (p *postgresDBAccess) setValue(req *state.SetRequest) error { // Sprintf is required for table name because sql.DB does not substitute parameters for table names. // Other parameters use sql.DB parameter substitution. - if req.ETag == nil { + if req.Options.Concurrency == state.FirstWrite && (req.ETag == nil || *req.ETag == "") { + result, err = p.db.Exec(fmt.Sprintf( + `INSERT INTO %s (key, value, isbinary) VALUES ($1, $2, $3);`, + defaultTableName), req.Key, value, isBinary) + } else if req.ETag == nil { result, err = p.db.Exec(fmt.Sprintf( `INSERT INTO %s (key, value, isbinary) VALUES ($1, $2, $3) ON CONFLICT (key) DO UPDATE SET value = $2, isbinary = $3, updatedate = NOW();`, diff --git a/tests/config/state/tests.yml b/tests/config/state/tests.yml index e3215c940..d211c5021 100644 --- a/tests/config/state/tests.yml +++ b/tests/config/state/tests.yml @@ -21,7 +21,7 @@ components: operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "first-write" ] - component: postgresql allOperations: false - operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query" ] + operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query", "first-write" ] - component: mysql.mysql allOperations: false operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "first-write" ] @@ -42,4 +42,4 @@ components: operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query" ] - component: rethinkdb allOperations: false - operations: [ "set", "get", "delete", "bulkset", "bulkdelete"] \ No newline at end of file + operations: [ "set", "get", "delete", "bulkset", "bulkdelete"]