Skip to content

Commit 67aae90

Browse files
committed
Auto merge of #1757 - jtgeibel:reduce-duplicate-db_conn, r=smarnach
Remove duplicate calls to `db_conn` in a single endpoint These endpoints are obtaining two separate connections for each request. If there is a backlog of requests, then these endpoints will wait in line multiple times for a database connection. Any request with an auth token or cookie will also obtain and drop a connection in the `CurrentUser` middleware. We could consider caching and reusing this database connection as well.
2 parents c82c9e4 + 4f605ef commit 67aae90

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

src/controllers/krate/follow.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
use diesel::associations::Identifiable;
44

55
use crate::controllers::prelude::*;
6+
use crate::db::DieselPooledConn;
67
use crate::models::{Crate, Follow};
78
use crate::schema::*;
89

9-
fn follow_target(req: &mut dyn Request) -> CargoResult<Follow> {
10+
fn follow_target(req: &dyn Request, conn: &DieselPooledConn<'_>) -> CargoResult<Follow> {
1011
let user = req.user()?;
11-
let conn = req.db_conn()?;
1212
let crate_name = &req.params()["crate_id"];
1313
let crate_id = Crate::by_name(crate_name)
1414
.select(crates::id)
15-
.first(&*conn)?;
15+
.first(&**conn)?;
1616
Ok(Follow {
1717
user_id: user.id,
1818
crate_id,
@@ -21,8 +21,8 @@ fn follow_target(req: &mut dyn Request) -> CargoResult<Follow> {
2121

2222
/// Handles the `PUT /crates/:crate_id/follow` route.
2323
pub fn follow(req: &mut dyn Request) -> CargoResult<Response> {
24-
let follow = follow_target(req)?;
2524
let conn = req.db_conn()?;
25+
let follow = follow_target(req, &conn)?;
2626
diesel::insert_into(follows::table)
2727
.values(&follow)
2828
.on_conflict_do_nothing()
@@ -33,8 +33,8 @@ pub fn follow(req: &mut dyn Request) -> CargoResult<Response> {
3333

3434
/// Handles the `DELETE /crates/:crate_id/follow` route.
3535
pub fn unfollow(req: &mut dyn Request) -> CargoResult<Response> {
36-
let follow = follow_target(req)?;
3736
let conn = req.db_conn()?;
37+
let follow = follow_target(req, &conn)?;
3838
diesel::delete(&follow).execute(&*conn)?;
3939

4040
ok_true()
@@ -44,8 +44,8 @@ pub fn unfollow(req: &mut dyn Request) -> CargoResult<Response> {
4444
pub fn following(req: &mut dyn Request) -> CargoResult<Response> {
4545
use diesel::dsl::exists;
4646

47-
let follow = follow_target(req)?;
4847
let conn = req.db_conn()?;
48+
let follow = follow_target(req, &conn)?;
4949
let following = diesel::select(exists(follows::table.find(follow.id()))).get_result(&*conn)?;
5050

5151
#[derive(Serialize)]

src/controllers/token.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,20 @@ pub fn new(req: &mut dyn Request) -> CargoResult<Response> {
6565
}
6666

6767
let user = req.user()?;
68+
let conn = req.db_conn()?;
6869

6970
let max_token_per_user = 500;
7071
let count = ApiToken::belonging_to(user)
7172
.count()
72-
.get_result::<i64>(&*req.db_conn()?)?;
73+
.get_result::<i64>(&*conn)?;
7374
if count >= max_token_per_user {
7475
return Err(bad_request(&format!(
7576
"maximum tokens per user is: {}",
7677
max_token_per_user
7778
)));
7879
}
7980

80-
let api_token = ApiToken::insert(&*req.db_conn()?, user.id, name)?;
81+
let api_token = ApiToken::insert(&*conn, user.id, name)?;
8182

8283
#[derive(Serialize)]
8384
struct R {

0 commit comments

Comments
 (0)