From 376547c33c7dff04b3a56cbd43f4b6035f4a661f Mon Sep 17 00:00:00 2001 From: Jeff Wendling Date: Wed, 10 Feb 2021 13:40:23 -0500 Subject: [PATCH] satellite/compensation: smaller txns for RecordPeriod cockroach is having problems with huge transactions and having them complete before timeouts or whatever, so do smaller transactions. because we can have partial recording of payments which are not unique, we have to do a thing where we read and check if it already exists before writing. this is not concurrency safe. Change-Id: Ia7d59499a43ce6d70cb2a23754edbdd1b643ef1a --- satellite/satellitedb/compensation.go | 89 +++++--- satellite/satellitedb/dbx/satellitedb.dbx | 7 +- satellite/satellitedb/dbx/satellitedb.dbx.go | 226 ++++++++++++++----- satellite/satellitedb/payouts.go | 2 +- 4 files changed, 227 insertions(+), 97 deletions(-) diff --git a/satellite/satellitedb/compensation.go b/satellite/satellitedb/compensation.go index 08549b1b9..fa770a950 100644 --- a/satellite/satellitedb/compensation.go +++ b/satellite/satellitedb/compensation.go @@ -47,27 +47,66 @@ func (comp *compensationDB) QueryTotalAmounts(ctx context.Context, nodeID storj. func (comp *compensationDB) RecordPeriod(ctx context.Context, paystubs []compensation.Paystub, payments []compensation.Payment) (err error) { defer mon.Task()(&ctx)(&err) - return Error.Wrap(comp.db.WithTx(ctx, func(ctx context.Context, tx *dbx.Tx) error { - if err := recordPaystubs(ctx, tx, paystubs); err != nil { - return err - } - if err := recordPayments(ctx, tx, payments); err != nil { - return err - } - return nil - })) + if err := comp.RecordPaystubs(ctx, paystubs); err != nil { + return err + } + if err := comp.RecordPayments(ctx, payments); err != nil { + return err + } + return nil +} + +func stringPointersEqual(a, b *string) bool { + if a == nil || b == nil { + return a == b + } + return *a == *b } func (comp *compensationDB) RecordPayments(ctx context.Context, payments []compensation.Payment) (err error) { defer mon.Task()(&ctx)(&err) - return Error.Wrap(comp.db.WithTx(ctx, func(ctx context.Context, tx *dbx.Tx) error { - return recordPayments(ctx, tx, payments) - })) + + for _, payment := range payments { + payment := payment // to satisfy linting + + err := comp.db.WithTx(ctx, func(ctx context.Context, tx *dbx.Tx) error { + existingPayments, err := tx.All_StoragenodePayment_By_NodeId_And_Period(ctx, + dbx.StoragenodePayment_NodeId(payment.NodeID.Bytes()), + dbx.StoragenodePayment_Period(payment.Period.String())) + if err != nil { + return Error.Wrap(err) + } + + // check if the payment already exists. we know period and node id already match. + for _, existingPayment := range existingPayments { + if existingPayment.Amount == payment.Amount.Value() && + stringPointersEqual(existingPayment.Receipt, payment.Receipt) && + stringPointersEqual(existingPayment.Notes, payment.Notes) { + return nil + } + } + + return Error.Wrap(tx.CreateNoReturn_StoragenodePayment(ctx, + dbx.StoragenodePayment_NodeId(payment.NodeID.Bytes()), + dbx.StoragenodePayment_Period(payment.Period.String()), + dbx.StoragenodePayment_Amount(payment.Amount.Value()), + dbx.StoragenodePayment_Create_Fields{ + Receipt: dbx.StoragenodePayment_Receipt_Raw(payment.Receipt), + Notes: dbx.StoragenodePayment_Notes_Raw(payment.Notes), + }, + )) + }) + if err != nil { + return err + } + } + + return nil } -func recordPaystubs(ctx context.Context, tx *dbx.Tx, paystubs []compensation.Paystub) error { +func (comp *compensationDB) RecordPaystubs(ctx context.Context, paystubs []compensation.Paystub) error { for _, paystub := range paystubs { - err := tx.CreateNoReturn_StoragenodePaystub(ctx, + err := comp.db.ReplaceNoReturn_StoragenodePaystub(ctx, dbx.StoragenodePaystub_Period(paystub.Period.String()), dbx.StoragenodePaystub_NodeId(paystub.NodeID.Bytes()), dbx.StoragenodePaystub_Codes(paystub.Codes.String()), @@ -96,25 +135,3 @@ func recordPaystubs(ctx context.Context, tx *dbx.Tx, paystubs []compensation.Pay } return nil } - -func recordPayments(ctx context.Context, tx *dbx.Tx, payments []compensation.Payment) error { - for _, payment := range payments { - opts := dbx.StoragenodePayment_Create_Fields{} - if payment.Receipt != nil { - opts.Receipt = dbx.StoragenodePayment_Receipt(*payment.Receipt) - } - if payment.Notes != nil { - opts.Notes = dbx.StoragenodePayment_Notes(*payment.Notes) - } - err := tx.CreateNoReturn_StoragenodePayment(ctx, - dbx.StoragenodePayment_NodeId(payment.NodeID.Bytes()), - dbx.StoragenodePayment_Period(payment.Period.String()), - dbx.StoragenodePayment_Amount(payment.Amount.Value()), - opts, - ) - if err != nil { - return err - } - } - return nil -} diff --git a/satellite/satellitedb/dbx/satellitedb.dbx b/satellite/satellitedb/dbx/satellitedb.dbx index 508badbc1..44b8aa851 100644 --- a/satellite/satellitedb/dbx/satellitedb.dbx +++ b/satellite/satellitedb/dbx/satellitedb.dbx @@ -666,7 +666,7 @@ model storagenode_paystub ( field distributed int64 // in micro-units of currency ) -create storagenode_paystub ( noreturn ) +create storagenode_paystub ( noreturn, replace ) read one ( select storagenode_paystub @@ -707,6 +707,11 @@ read all ( where storagenode_payment.node_id = ? ) +read all ( + select storagenode_payment + where storagenode_payment.node_id = ? + where storagenode_payment.period = ? +) //--- peer_identity ---// diff --git a/satellite/satellitedb/dbx/satellitedb.dbx.go b/satellite/satellitedb/dbx/satellitedb.dbx.go index e575d3799..93ba86c72 100644 --- a/satellite/satellitedb/dbx/satellitedb.dbx.go +++ b/satellite/satellitedb/dbx/satellitedb.dbx.go @@ -9409,7 +9409,7 @@ func (obj *pgxImpl) Create_StoragenodeBandwidthRollup(ctx context.Context, } -func (obj *pgxImpl) CreateNoReturn_StoragenodePaystub(ctx context.Context, +func (obj *pgxImpl) ReplaceNoReturn_StoragenodePaystub(ctx context.Context, storagenode_paystub_period StoragenodePaystub_Period_Field, storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, storagenode_paystub_codes StoragenodePaystub_Codes_Field, @@ -9458,7 +9458,7 @@ func (obj *pgxImpl) CreateNoReturn_StoragenodePaystub(ctx context.Context, __paid_val := storagenode_paystub_paid.value() __distributed_val := storagenode_paystub_distributed.value() - var __embed_stmt = __sqlbundle_Literal("INSERT INTO storagenode_paystubs ( period, node_id, created_at, codes, usage_at_rest, usage_get, usage_put, usage_get_repair, usage_put_repair, usage_get_audit, comp_at_rest, comp_get, comp_put, comp_get_repair, comp_put_repair, comp_get_audit, surge_percent, held, owed, disposed, paid, distributed ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )") + var __embed_stmt = __sqlbundle_Literal("INSERT INTO storagenode_paystubs ( period, node_id, created_at, codes, usage_at_rest, usage_get, usage_put, usage_get_repair, usage_put_repair, usage_get_audit, comp_at_rest, comp_get, comp_put, comp_get_repair, comp_put_repair, comp_get_audit, surge_percent, held, owed, disposed, paid, distributed ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ON CONFLICT ( period, node_id ) DO UPDATE SET period = EXCLUDED.period, node_id = EXCLUDED.node_id, created_at = EXCLUDED.created_at, codes = EXCLUDED.codes, usage_at_rest = EXCLUDED.usage_at_rest, usage_get = EXCLUDED.usage_get, usage_put = EXCLUDED.usage_put, usage_get_repair = EXCLUDED.usage_get_repair, usage_put_repair = EXCLUDED.usage_put_repair, usage_get_audit = EXCLUDED.usage_get_audit, comp_at_rest = EXCLUDED.comp_at_rest, comp_get = EXCLUDED.comp_get, comp_put = EXCLUDED.comp_put, comp_get_repair = EXCLUDED.comp_get_repair, comp_put_repair = EXCLUDED.comp_put_repair, comp_get_audit = EXCLUDED.comp_get_audit, surge_percent = EXCLUDED.surge_percent, held = EXCLUDED.held, owed = EXCLUDED.owed, disposed = EXCLUDED.disposed, paid = EXCLUDED.paid, distributed = EXCLUDED.distributed") var __values []interface{} __values = append(__values, __period_val, __node_id_val, __created_at_val, __codes_val, __usage_at_rest_val, __usage_get_val, __usage_put_val, __usage_get_repair_val, __usage_put_repair_val, __usage_get_audit_val, __comp_at_rest_val, __comp_get_val, __comp_put_val, __comp_get_repair_val, __comp_put_repair_val, __comp_get_audit_val, __surge_percent_val, __held_val, __owed_val, __disposed_val, __paid_val, __distributed_val) @@ -11454,6 +11454,52 @@ func (obj *pgxImpl) All_StoragenodePayment_By_NodeId(ctx context.Context, } +func (obj *pgxImpl) All_StoragenodePayment_By_NodeId_And_Period(ctx context.Context, + storagenode_payment_node_id StoragenodePayment_NodeId_Field, + storagenode_payment_period StoragenodePayment_Period_Field) ( + rows []*StoragenodePayment, err error) { + defer mon.Task()(&ctx)(&err) + + var __embed_stmt = __sqlbundle_Literal("SELECT storagenode_payments.id, storagenode_payments.created_at, storagenode_payments.node_id, storagenode_payments.period, storagenode_payments.amount, storagenode_payments.receipt, storagenode_payments.notes FROM storagenode_payments WHERE storagenode_payments.node_id = ? AND storagenode_payments.period = ?") + + var __values []interface{} + __values = append(__values, storagenode_payment_node_id.value(), storagenode_payment_period.value()) + + var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt) + obj.logStmt(__stmt, __values...) + + for { + rows, err = func() (rows []*StoragenodePayment, err error) { + __rows, err := obj.driver.QueryContext(ctx, __stmt, __values...) + if err != nil { + return nil, err + } + defer __rows.Close() + + for __rows.Next() { + storagenode_payment := &StoragenodePayment{} + err = __rows.Scan(&storagenode_payment.Id, &storagenode_payment.CreatedAt, &storagenode_payment.NodeId, &storagenode_payment.Period, &storagenode_payment.Amount, &storagenode_payment.Receipt, &storagenode_payment.Notes) + if err != nil { + return nil, err + } + rows = append(rows, storagenode_payment) + } + if err := __rows.Err(); err != nil { + return nil, err + } + return rows, nil + }() + if err != nil { + if obj.shouldRetry(err) { + continue + } + return nil, obj.makeErr(err) + } + return rows, nil + } + +} + func (obj *pgxImpl) Get_PeerIdentity_By_NodeId(ctx context.Context, peer_identity_node_id PeerIdentity_NodeId_Field) ( peer_identity *PeerIdentity, err error) { @@ -14786,7 +14832,7 @@ func (obj *pgxcockroachImpl) Create_StoragenodeBandwidthRollup(ctx context.Conte } -func (obj *pgxcockroachImpl) CreateNoReturn_StoragenodePaystub(ctx context.Context, +func (obj *pgxcockroachImpl) ReplaceNoReturn_StoragenodePaystub(ctx context.Context, storagenode_paystub_period StoragenodePaystub_Period_Field, storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, storagenode_paystub_codes StoragenodePaystub_Codes_Field, @@ -14835,7 +14881,7 @@ func (obj *pgxcockroachImpl) CreateNoReturn_StoragenodePaystub(ctx context.Conte __paid_val := storagenode_paystub_paid.value() __distributed_val := storagenode_paystub_distributed.value() - var __embed_stmt = __sqlbundle_Literal("INSERT INTO storagenode_paystubs ( period, node_id, created_at, codes, usage_at_rest, usage_get, usage_put, usage_get_repair, usage_put_repair, usage_get_audit, comp_at_rest, comp_get, comp_put, comp_get_repair, comp_put_repair, comp_get_audit, surge_percent, held, owed, disposed, paid, distributed ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )") + var __embed_stmt = __sqlbundle_Literal("UPSERT INTO storagenode_paystubs ( period, node_id, created_at, codes, usage_at_rest, usage_get, usage_put, usage_get_repair, usage_put_repair, usage_get_audit, comp_at_rest, comp_get, comp_put, comp_get_repair, comp_put_repair, comp_get_audit, surge_percent, held, owed, disposed, paid, distributed ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )") var __values []interface{} __values = append(__values, __period_val, __node_id_val, __created_at_val, __codes_val, __usage_at_rest_val, __usage_get_val, __usage_put_val, __usage_get_repair_val, __usage_put_repair_val, __usage_get_audit_val, __comp_at_rest_val, __comp_get_val, __comp_put_val, __comp_get_repair_val, __comp_put_repair_val, __comp_get_audit_val, __surge_percent_val, __held_val, __owed_val, __disposed_val, __paid_val, __distributed_val) @@ -16831,6 +16877,52 @@ func (obj *pgxcockroachImpl) All_StoragenodePayment_By_NodeId(ctx context.Contex } +func (obj *pgxcockroachImpl) All_StoragenodePayment_By_NodeId_And_Period(ctx context.Context, + storagenode_payment_node_id StoragenodePayment_NodeId_Field, + storagenode_payment_period StoragenodePayment_Period_Field) ( + rows []*StoragenodePayment, err error) { + defer mon.Task()(&ctx)(&err) + + var __embed_stmt = __sqlbundle_Literal("SELECT storagenode_payments.id, storagenode_payments.created_at, storagenode_payments.node_id, storagenode_payments.period, storagenode_payments.amount, storagenode_payments.receipt, storagenode_payments.notes FROM storagenode_payments WHERE storagenode_payments.node_id = ? AND storagenode_payments.period = ?") + + var __values []interface{} + __values = append(__values, storagenode_payment_node_id.value(), storagenode_payment_period.value()) + + var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt) + obj.logStmt(__stmt, __values...) + + for { + rows, err = func() (rows []*StoragenodePayment, err error) { + __rows, err := obj.driver.QueryContext(ctx, __stmt, __values...) + if err != nil { + return nil, err + } + defer __rows.Close() + + for __rows.Next() { + storagenode_payment := &StoragenodePayment{} + err = __rows.Scan(&storagenode_payment.Id, &storagenode_payment.CreatedAt, &storagenode_payment.NodeId, &storagenode_payment.Period, &storagenode_payment.Amount, &storagenode_payment.Receipt, &storagenode_payment.Notes) + if err != nil { + return nil, err + } + rows = append(rows, storagenode_payment) + } + if err := __rows.Err(); err != nil { + return nil, err + } + return rows, nil + }() + if err != nil { + if obj.shouldRetry(err) { + continue + } + return nil, obj.makeErr(err) + } + return rows, nil + } + +} + func (obj *pgxcockroachImpl) Get_PeerIdentity_By_NodeId(ctx context.Context, peer_identity_node_id PeerIdentity_NodeId_Field) ( peer_identity *PeerIdentity, err error) { @@ -19924,6 +20016,17 @@ func (rx *Rx) All_StoragenodePayment_By_NodeId(ctx context.Context, return tx.All_StoragenodePayment_By_NodeId(ctx, storagenode_payment_node_id) } +func (rx *Rx) All_StoragenodePayment_By_NodeId_And_Period(ctx context.Context, + storagenode_payment_node_id StoragenodePayment_NodeId_Field, + storagenode_payment_period StoragenodePayment_Period_Field) ( + rows []*StoragenodePayment, err error) { + var tx *Tx + if tx, err = rx.getTx(ctx); err != nil { + return + } + return tx.All_StoragenodePayment_By_NodeId_And_Period(ctx, storagenode_payment_node_id, storagenode_payment_period) +} + func (rx *Rx) All_StoragenodePaystub_By_NodeId(ctx context.Context, storagenode_paystub_node_id StoragenodePaystub_NodeId_Field) ( rows []*StoragenodePaystub, err error) { @@ -20048,37 +20151,6 @@ func (rx *Rx) CreateNoReturn_StoragenodePayment(ctx context.Context, } -func (rx *Rx) CreateNoReturn_StoragenodePaystub(ctx context.Context, - storagenode_paystub_period StoragenodePaystub_Period_Field, - storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, - storagenode_paystub_codes StoragenodePaystub_Codes_Field, - storagenode_paystub_usage_at_rest StoragenodePaystub_UsageAtRest_Field, - storagenode_paystub_usage_get StoragenodePaystub_UsageGet_Field, - storagenode_paystub_usage_put StoragenodePaystub_UsagePut_Field, - storagenode_paystub_usage_get_repair StoragenodePaystub_UsageGetRepair_Field, - storagenode_paystub_usage_put_repair StoragenodePaystub_UsagePutRepair_Field, - storagenode_paystub_usage_get_audit StoragenodePaystub_UsageGetAudit_Field, - storagenode_paystub_comp_at_rest StoragenodePaystub_CompAtRest_Field, - storagenode_paystub_comp_get StoragenodePaystub_CompGet_Field, - storagenode_paystub_comp_put StoragenodePaystub_CompPut_Field, - storagenode_paystub_comp_get_repair StoragenodePaystub_CompGetRepair_Field, - storagenode_paystub_comp_put_repair StoragenodePaystub_CompPutRepair_Field, - storagenode_paystub_comp_get_audit StoragenodePaystub_CompGetAudit_Field, - storagenode_paystub_surge_percent StoragenodePaystub_SurgePercent_Field, - storagenode_paystub_held StoragenodePaystub_Held_Field, - storagenode_paystub_owed StoragenodePaystub_Owed_Field, - storagenode_paystub_disposed StoragenodePaystub_Disposed_Field, - storagenode_paystub_paid StoragenodePaystub_Paid_Field, - storagenode_paystub_distributed StoragenodePaystub_Distributed_Field) ( - err error) { - var tx *Tx - if tx, err = rx.getTx(ctx); err != nil { - return - } - return tx.CreateNoReturn_StoragenodePaystub(ctx, storagenode_paystub_period, storagenode_paystub_node_id, storagenode_paystub_codes, storagenode_paystub_usage_at_rest, storagenode_paystub_usage_get, storagenode_paystub_usage_put, storagenode_paystub_usage_get_repair, storagenode_paystub_usage_put_repair, storagenode_paystub_usage_get_audit, storagenode_paystub_comp_at_rest, storagenode_paystub_comp_get, storagenode_paystub_comp_put, storagenode_paystub_comp_get_repair, storagenode_paystub_comp_put_repair, storagenode_paystub_comp_get_audit, storagenode_paystub_surge_percent, storagenode_paystub_held, storagenode_paystub_owed, storagenode_paystub_disposed, storagenode_paystub_paid, storagenode_paystub_distributed) - -} - func (rx *Rx) Create_ApiKey(ctx context.Context, api_key_id ApiKey_Id_Field, api_key_project_id ApiKey_ProjectId_Field, @@ -21011,6 +21083,37 @@ func (rx *Rx) ReplaceNoReturn_NodeApiVersion(ctx context.Context, } +func (rx *Rx) ReplaceNoReturn_StoragenodePaystub(ctx context.Context, + storagenode_paystub_period StoragenodePaystub_Period_Field, + storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, + storagenode_paystub_codes StoragenodePaystub_Codes_Field, + storagenode_paystub_usage_at_rest StoragenodePaystub_UsageAtRest_Field, + storagenode_paystub_usage_get StoragenodePaystub_UsageGet_Field, + storagenode_paystub_usage_put StoragenodePaystub_UsagePut_Field, + storagenode_paystub_usage_get_repair StoragenodePaystub_UsageGetRepair_Field, + storagenode_paystub_usage_put_repair StoragenodePaystub_UsagePutRepair_Field, + storagenode_paystub_usage_get_audit StoragenodePaystub_UsageGetAudit_Field, + storagenode_paystub_comp_at_rest StoragenodePaystub_CompAtRest_Field, + storagenode_paystub_comp_get StoragenodePaystub_CompGet_Field, + storagenode_paystub_comp_put StoragenodePaystub_CompPut_Field, + storagenode_paystub_comp_get_repair StoragenodePaystub_CompGetRepair_Field, + storagenode_paystub_comp_put_repair StoragenodePaystub_CompPutRepair_Field, + storagenode_paystub_comp_get_audit StoragenodePaystub_CompGetAudit_Field, + storagenode_paystub_surge_percent StoragenodePaystub_SurgePercent_Field, + storagenode_paystub_held StoragenodePaystub_Held_Field, + storagenode_paystub_owed StoragenodePaystub_Owed_Field, + storagenode_paystub_disposed StoragenodePaystub_Disposed_Field, + storagenode_paystub_paid StoragenodePaystub_Paid_Field, + storagenode_paystub_distributed StoragenodePaystub_Distributed_Field) ( + err error) { + var tx *Tx + if tx, err = rx.getTx(ctx); err != nil { + return + } + return tx.ReplaceNoReturn_StoragenodePaystub(ctx, storagenode_paystub_period, storagenode_paystub_node_id, storagenode_paystub_codes, storagenode_paystub_usage_at_rest, storagenode_paystub_usage_get, storagenode_paystub_usage_put, storagenode_paystub_usage_get_repair, storagenode_paystub_usage_put_repair, storagenode_paystub_usage_get_audit, storagenode_paystub_comp_at_rest, storagenode_paystub_comp_get, storagenode_paystub_comp_put, storagenode_paystub_comp_get_repair, storagenode_paystub_comp_put_repair, storagenode_paystub_comp_get_audit, storagenode_paystub_surge_percent, storagenode_paystub_held, storagenode_paystub_owed, storagenode_paystub_disposed, storagenode_paystub_paid, storagenode_paystub_distributed) + +} + func (rx *Rx) UpdateNoReturn_AccountingTimestamps_By_Name(ctx context.Context, accounting_timestamps_name AccountingTimestamps_Name_Field, update AccountingTimestamps_Update_Fields) ( @@ -21265,6 +21368,11 @@ type Methods interface { storagenode_payment_node_id StoragenodePayment_NodeId_Field) ( rows []*StoragenodePayment, err error) + All_StoragenodePayment_By_NodeId_And_Period(ctx context.Context, + storagenode_payment_node_id StoragenodePayment_NodeId_Field, + storagenode_payment_period StoragenodePayment_Period_Field) ( + rows []*StoragenodePayment, err error) + All_StoragenodePaystub_By_NodeId(ctx context.Context, storagenode_paystub_node_id StoragenodePaystub_NodeId_Field) ( rows []*StoragenodePaystub, err error) @@ -21323,30 +21431,6 @@ type Methods interface { optional StoragenodePayment_Create_Fields) ( err error) - CreateNoReturn_StoragenodePaystub(ctx context.Context, - storagenode_paystub_period StoragenodePaystub_Period_Field, - storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, - storagenode_paystub_codes StoragenodePaystub_Codes_Field, - storagenode_paystub_usage_at_rest StoragenodePaystub_UsageAtRest_Field, - storagenode_paystub_usage_get StoragenodePaystub_UsageGet_Field, - storagenode_paystub_usage_put StoragenodePaystub_UsagePut_Field, - storagenode_paystub_usage_get_repair StoragenodePaystub_UsageGetRepair_Field, - storagenode_paystub_usage_put_repair StoragenodePaystub_UsagePutRepair_Field, - storagenode_paystub_usage_get_audit StoragenodePaystub_UsageGetAudit_Field, - storagenode_paystub_comp_at_rest StoragenodePaystub_CompAtRest_Field, - storagenode_paystub_comp_get StoragenodePaystub_CompGet_Field, - storagenode_paystub_comp_put StoragenodePaystub_CompPut_Field, - storagenode_paystub_comp_get_repair StoragenodePaystub_CompGetRepair_Field, - storagenode_paystub_comp_put_repair StoragenodePaystub_CompPutRepair_Field, - storagenode_paystub_comp_get_audit StoragenodePaystub_CompGetAudit_Field, - storagenode_paystub_surge_percent StoragenodePaystub_SurgePercent_Field, - storagenode_paystub_held StoragenodePaystub_Held_Field, - storagenode_paystub_owed StoragenodePaystub_Owed_Field, - storagenode_paystub_disposed StoragenodePaystub_Disposed_Field, - storagenode_paystub_paid StoragenodePaystub_Paid_Field, - storagenode_paystub_distributed StoragenodePaystub_Distributed_Field) ( - err error) - Create_ApiKey(ctx context.Context, api_key_id ApiKey_Id_Field, api_key_project_id ApiKey_ProjectId_Field, @@ -21778,6 +21862,30 @@ type Methods interface { node_api_version_api_version NodeApiVersion_ApiVersion_Field) ( err error) + ReplaceNoReturn_StoragenodePaystub(ctx context.Context, + storagenode_paystub_period StoragenodePaystub_Period_Field, + storagenode_paystub_node_id StoragenodePaystub_NodeId_Field, + storagenode_paystub_codes StoragenodePaystub_Codes_Field, + storagenode_paystub_usage_at_rest StoragenodePaystub_UsageAtRest_Field, + storagenode_paystub_usage_get StoragenodePaystub_UsageGet_Field, + storagenode_paystub_usage_put StoragenodePaystub_UsagePut_Field, + storagenode_paystub_usage_get_repair StoragenodePaystub_UsageGetRepair_Field, + storagenode_paystub_usage_put_repair StoragenodePaystub_UsagePutRepair_Field, + storagenode_paystub_usage_get_audit StoragenodePaystub_UsageGetAudit_Field, + storagenode_paystub_comp_at_rest StoragenodePaystub_CompAtRest_Field, + storagenode_paystub_comp_get StoragenodePaystub_CompGet_Field, + storagenode_paystub_comp_put StoragenodePaystub_CompPut_Field, + storagenode_paystub_comp_get_repair StoragenodePaystub_CompGetRepair_Field, + storagenode_paystub_comp_put_repair StoragenodePaystub_CompPutRepair_Field, + storagenode_paystub_comp_get_audit StoragenodePaystub_CompGetAudit_Field, + storagenode_paystub_surge_percent StoragenodePaystub_SurgePercent_Field, + storagenode_paystub_held StoragenodePaystub_Held_Field, + storagenode_paystub_owed StoragenodePaystub_Owed_Field, + storagenode_paystub_disposed StoragenodePaystub_Disposed_Field, + storagenode_paystub_paid StoragenodePaystub_Paid_Field, + storagenode_paystub_distributed StoragenodePaystub_Distributed_Field) ( + err error) + UpdateNoReturn_AccountingTimestamps_By_Name(ctx context.Context, accounting_timestamps_name AccountingTimestamps_Name_Field, update AccountingTimestamps_Update_Fields) ( diff --git a/satellite/satellitedb/payouts.go b/satellite/satellitedb/payouts.go index 8f38d8a37..b016be4a4 100644 --- a/satellite/satellitedb/payouts.go +++ b/satellite/satellitedb/payouts.go @@ -155,7 +155,7 @@ func derefStringOr(v *string, def string) string { // TestCreatePaystub inserts storagenode_paystub into database. Only used for tests. func (db *snopayoutsDB) TestCreatePaystub(ctx context.Context, stub snopayouts.Paystub) (err error) { - return db.db.CreateNoReturn_StoragenodePaystub(ctx, + return db.db.ReplaceNoReturn_StoragenodePaystub(ctx, dbx.StoragenodePaystub_Period(stub.Period), dbx.StoragenodePaystub_NodeId(stub.NodeID.Bytes()), dbx.StoragenodePaystub_Codes(stub.Codes),