Skip to content

Commit e3a0525

Browse files
committed
units-for-slot deposit assets:
- sentry - db - campaign - test max query limit with deposit assets - primitives - sentry - add default for Query
1 parent 42713f4 commit e3a0525

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

primitives/src/sentry.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1157,9 +1157,10 @@ pub mod units_for_slot {
11571157

11581158
use crate::Address;
11591159

1160-
#[derive(Debug, Clone, Serialize, Deserialize)]
1160+
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
11611161
#[serde(rename_all = "camelCase")]
11621162
pub struct Query {
1163+
#[serde(default)]
11631164
pub deposit_assets: HashSet<Address>,
11641165
}
11651166

sentry/src/db/campaign.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ pub async fn update_campaign(pool: &DbPool, campaign: &Campaign) -> Result<Campa
216216
Ok(Campaign::from(&updated_row))
217217
}
218218

219+
/// Get Campaigns for GET `/v5/units-for-slot` route.
220+
///
221+
/// This method was tested with **5099** deposit assets and it does not reach the postgres query limit.
219222
pub async fn units_for_slot_get_campaigns(
220223
pool: &DbPool,
221224
deposit_assets: Option<&HashSet<Address>>,
@@ -905,4 +908,68 @@ mod test {
905908
vec![campaign_new_id.clone(), campaign.clone()]
906909
);
907910
}
911+
912+
#[tokio::test]
913+
async fn test_units_for_slot_query_max_length_with_deposit_assets() {
914+
use primitives::test_util::{CREATOR, PUBLISHER};
915+
let database = DATABASE_POOL.get().await.expect("Should get a DB pool");
916+
917+
setup_test_migrations(database.pool.clone())
918+
.await
919+
.expect("Migrations should succeed");
920+
921+
let token_addr = *CREATOR;
922+
// generate addresses
923+
let generate = |for_byte: usize| {
924+
(0..255_u8)
925+
.map(|byte| {
926+
let mut bytes = token_addr.to_bytes();
927+
bytes[for_byte] = byte;
928+
929+
Address::from_bytes(&bytes)
930+
})
931+
.collect::<Vec<_>>()
932+
};
933+
let mut generated = vec![];
934+
generated.extend(generate(19));
935+
generated.extend(generate(18));
936+
generated.extend(generate(17));
937+
generated.extend(generate(16));
938+
generated.extend(generate(15));
939+
generated.extend(generate(14));
940+
generated.extend(generate(13));
941+
generated.extend(generate(12));
942+
generated.extend(generate(11));
943+
generated.extend(generate(10));
944+
generated.extend(generate(9));
945+
generated.extend(generate(8));
946+
generated.extend(generate(7));
947+
generated.extend(generate(6));
948+
generated.extend(generate(5));
949+
generated.extend(generate(4));
950+
generated.extend(generate(3));
951+
generated.extend(generate(2));
952+
generated.extend(generate(1));
953+
generated.extend(generate(0));
954+
955+
// start from the largest to the smallest and if it successes with the largest value,
956+
// then we just break the look.
957+
// Otherwise continues to try out other amount of deposit assets before it succeeds.
958+
for i in (0..generated.len()).rev() {
959+
let deposit_assets = generated[0..i].iter().copied().collect::<HashSet<_>>();
960+
961+
962+
match units_for_slot_get_campaigns(
963+
&database,
964+
Some(&deposit_assets),
965+
*PUBLISHER,
966+
Utc::now(),
967+
)
968+
.await
969+
{
970+
Ok(_success) => break,
971+
Err(_err) => panic!("Failed with {} deposit assets", i),
972+
};
973+
}
974+
}
908975
}

0 commit comments

Comments
 (0)