From 45af241429e60784cee01ecb61492d084f3d2788 Mon Sep 17 00:00:00 2001 From: Bryan Stitt Date: Thu, 13 Jul 2023 15:44:00 -0700 Subject: [PATCH] less db transactions --- web3_proxy/src/frontend/users/authentication.rs | 16 ++++++++++------ web3_proxy/src/frontend/users/payment_stripe.rs | 12 +++++------- web3_proxy/src/frontend/users/subuser.rs | 7 +++---- web3_proxy/src/stats/mod.rs | 4 ++-- web3_proxy/tests/common/mysql.rs | 2 -- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/web3_proxy/src/frontend/users/authentication.rs b/web3_proxy/src/frontend/users/authentication.rs index 27c42b83..2cb95a8b 100644 --- a/web3_proxy/src/frontend/users/authentication.rs +++ b/web3_proxy/src/frontend/users/authentication.rs @@ -316,11 +316,11 @@ pub async fn user_login_post( txn.commit().await?; - let txn = db_conn.begin().await?; - // First, optionally catch a referral code from the parameters if there is any trace!(?payload.referral_code); if let Some(referral_code) = payload.referral_code.as_ref() { + let txn = db_conn.begin().await?; + // If it is not inside, also check in the database trace!("Using register referral code: {:?}", referral_code); let user_referrer = referrer::Entity::find() @@ -340,20 +340,23 @@ pub async fn user_login_post( credits_applied_for_referrer: sea_orm::Set(Decimal::new(0, 10)), ..Default::default() }; + used_referral.insert(&txn).await?; + + txn.commit().await?; } - txn.commit().await?; (caller, vec![caller_key], StatusCode::CREATED) } Some(caller) => { // Let's say that a user that exists can actually also redeem a key in retrospect... - let txn = db_conn.begin().await?; // TODO: Move this into a common variable outside ... // First, optionally catch a referral code from the parameters if there is any if let Some(referral_code) = payload.referral_code.as_ref() { // If it is not inside, also check in the database - trace!("Using referral code: {:?}", referral_code); + let txn = db_conn.begin().await?; + + trace!(?referral_code, "Using"); let user_referrer = referrer::Entity::find() .filter(referrer::Column::ReferralCode.eq(referral_code)) .one(&txn) @@ -374,8 +377,9 @@ pub async fn user_login_post( ..Default::default() }; used_referral.insert(&txn).await?; + + txn.commit().await?; } - txn.commit().await?; // the user is already registered let user_rpc_keys = rpc_key::Entity::find() diff --git a/web3_proxy/src/frontend/users/payment_stripe.rs b/web3_proxy/src/frontend/users/payment_stripe.rs index 1e45b089..8ae3b3f5 100644 --- a/web3_proxy/src/frontend/users/payment_stripe.rs +++ b/web3_proxy/src/frontend/users/payment_stripe.rs @@ -2,10 +2,7 @@ use crate::app::Web3ProxyApp; use crate::errors::{Web3ProxyError, Web3ProxyErrorContext, Web3ProxyResponse}; use crate::premium::grant_premium_tier; use anyhow::Context; -use axum::{ - response::IntoResponse, - Extension, -}; +use axum::{response::IntoResponse, Extension}; use axum_macros::debug_handler; use entities::{stripe_increase_balance_receipt, user, user_tier}; use http::HeaderMap; @@ -114,7 +111,6 @@ pub async fn user_balance_stripe_post( }; // In all these cases, we should record the transaction, but not increase the balance - let txn = db_conn.begin().await?; // Assert that it's usd if intent.currency.to_string() != "usd" || recipient.is_none() { @@ -125,13 +121,15 @@ pub async fn user_balance_stripe_post( currency=%intent.currency, %recipient_user_id, %intent.id, "Please refund this transaction!", ); - let _ = insert_receipt_model.save(&txn).await; - txn.commit().await?; + let _ = insert_receipt_model.save(db_conn).await; + return Ok("Received Webhook".into_response()); } // Otherwise, also increase the balance ... match recipient { Some(recipient) => { + let txn = db_conn.begin().await?; + let _ = insert_receipt_model.save(&txn).await; let user_tier = user_tier::Entity::find_by_id(recipient.user_tier_id) diff --git a/web3_proxy/src/frontend/users/subuser.rs b/web3_proxy/src/frontend/users/subuser.rs index 345e370b..19be184d 100644 --- a/web3_proxy/src/frontend/users/subuser.rs +++ b/web3_proxy/src/frontend/users/subuser.rs @@ -259,7 +259,6 @@ pub async fn modify_subuser( let db_conn = app.db_conn()?; let (subuser, _subuser_rpc_keys, _status_code) = match subuser { None => { - let txn = db_conn.begin().await?; // First add a user; the only thing we need from them is an address // everything else is optional let subuser = user::ActiveModel { @@ -267,6 +266,8 @@ pub async fn modify_subuser( ..Default::default() }; + let txn = db_conn.begin().await?; + let subuser = subuser.insert(&txn).await?; // create the user's first api key @@ -323,7 +324,6 @@ pub async fn modify_subuser( .await .web3_context("failed using the db to check for a subuser")?; - let txn = db_conn.begin().await?; let mut action = "no action"; match subuser_entry_secondary_user { @@ -348,7 +348,7 @@ pub async fn modify_subuser( role: sea_orm::Set(new_role.clone()), ..Default::default() }; - active_subuser_entry_secondary_user.insert(&txn).await?; + active_subuser_entry_secondary_user.insert(db_conn).await?; action = "added"; } _ => { @@ -360,7 +360,6 @@ pub async fn modify_subuser( // Do nothing in this case } }; - txn.commit().await?; let response = ( StatusCode::OK, diff --git a/web3_proxy/src/stats/mod.rs b/web3_proxy/src/stats/mod.rs index 301fa453..9f5da9db 100644 --- a/web3_proxy/src/stats/mod.rs +++ b/web3_proxy/src/stats/mod.rs @@ -354,11 +354,11 @@ impl BufferedRpcQueryStats { // Apply all the referral logic; let's keep it simple and flat for now if self.paid_credits_used > 0.into() { + let mut invalidate_caches = false; + // Start a transaction let txn = db_conn.begin().await?; - let mut invalidate_caches = false; - // Calculate if we are above the usage threshold, and apply a bonus // Optimally we would read this from the balance, but if we do it like this, we only have to lock a single table (much safer w.r.t. deadlocks) // referral_entity.credits_applied_for_referrer * (Decimal::from(10) checks (atomically using this table only), whether the user has brought in >$100 to the referer diff --git a/web3_proxy/tests/common/mysql.rs b/web3_proxy/tests/common/mysql.rs index e6fd0140..e4989693 100644 --- a/web3_proxy/tests/common/mysql.rs +++ b/web3_proxy/tests/common/mysql.rs @@ -10,8 +10,6 @@ use tokio::{ use tracing::{info, trace, warn}; use web3_proxy::relational_db::get_migrated_db; -use migration::sea_orm::prelude; - /// on drop, the mysql docker container will be shut down pub struct TestMysql { pub url: Option,