From a6bbf484489d291c096769bc2fb4d1fdfdec2651 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Mon, 19 Jun 2023 18:09:14 +0100 Subject: [PATCH 1/2] Reduce DB conn usage when fetching device data slightly terrifyingly this suggests that the impl was written was not atomically doing a get-and-update? --- state/device_data_table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/state/device_data_table.go b/state/device_data_table.go index 61853f75..1a671cf6 100644 --- a/state/device_data_table.go +++ b/state/device_data_table.go @@ -44,7 +44,7 @@ func NewDeviceDataTable(db *sqlx.DB) *DeviceDataTable { func (t *DeviceDataTable) Select(userID, deviceID string, swap bool) (result *internal.DeviceData, err error) { err = sqlutil.WithTransaction(t.db, func(txn *sqlx.Tx) error { var row DeviceDataRow - err = t.db.Get(&row, `SELECT data FROM syncv3_device_data WHERE user_id=$1 AND device_id=$2`, userID, deviceID) + err = txn.Get(&row, `SELECT data FROM syncv3_device_data WHERE user_id=$1 AND device_id=$2`, userID, deviceID) if err != nil { if err == sql.ErrNoRows { // if there is no device data for this user, it's not an error. @@ -78,7 +78,7 @@ func (t *DeviceDataTable) Select(userID, deviceID string, swap bool) (result *in // the device_data table. return nil } - _, err = t.db.Exec(`UPDATE syncv3_device_data SET data=$1 WHERE user_id=$2 AND device_id=$3`, data, userID, deviceID) + _, err = txn.Exec(`UPDATE syncv3_device_data SET data=$1 WHERE user_id=$2 AND device_id=$3`, data, userID, deviceID) return err }) return From 5e8a6912c885a0c65af7e19714f88d002a898729 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Mon, 19 Jun 2023 18:11:16 +0100 Subject: [PATCH 2/2] Another not-using-txn --- state/device_data_table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/state/device_data_table.go b/state/device_data_table.go index 1a671cf6..dc8f2488 100644 --- a/state/device_data_table.go +++ b/state/device_data_table.go @@ -94,7 +94,7 @@ func (t *DeviceDataTable) Upsert(dd *internal.DeviceData) (pos int64, err error) err = sqlutil.WithTransaction(t.db, func(txn *sqlx.Tx) error { // select what already exists var row DeviceDataRow - err = t.db.Get(&row, `SELECT data FROM syncv3_device_data WHERE user_id=$1 AND device_id=$2`, dd.UserID, dd.DeviceID) + err = txn.Get(&row, `SELECT data FROM syncv3_device_data WHERE user_id=$1 AND device_id=$2`, dd.UserID, dd.DeviceID) if err != nil && err != sql.ErrNoRows { return err } @@ -119,7 +119,7 @@ func (t *DeviceDataTable) Upsert(dd *internal.DeviceData) (pos int64, err error) if err != nil { return err } - err = t.db.QueryRow( + err = txn.QueryRow( `INSERT INTO syncv3_device_data(user_id, device_id, data) VALUES($1,$2,$3) ON CONFLICT (user_id, device_id) DO UPDATE SET data=$3, id=nextval('syncv3_device_data_seq') RETURNING id`, dd.UserID, dd.DeviceID, data,