@@ -12,7 +12,7 @@ use std::time::{Duration, Instant};
12
12
use crate :: components:: metrics:: { Gauge , MetricsRegistry } ;
13
13
use crate :: components:: store:: PoolWaitStats ;
14
14
use crate :: data:: graphql:: shape_hash:: shape_hash;
15
- use crate :: prelude:: { info, o, warn, Logger } ;
15
+ use crate :: prelude:: { debug , info, o, warn, Logger } ;
16
16
use crate :: util:: stats:: { MovingStats , BIN_SIZE , WINDOW_SIZE } ;
17
17
18
18
const ZERO_DURATION : Duration = Duration :: from_millis ( 0 ) ;
@@ -51,6 +51,8 @@ lazy_static! {
51
51
static ref LOAD_MANAGEMENT_DISABLED : bool = * LOAD_THRESHOLD == ZERO_DURATION ;
52
52
53
53
static ref KILL_RATE_UPDATE_INTERVAL : Duration = Duration :: from_millis( 1000 ) ;
54
+
55
+ static ref SIMULATE : bool = env:: var( "GRAPH_LOAD_SIMULATE" ) . is_ok( ) ;
54
56
}
55
57
56
58
struct QueryEffort {
@@ -297,7 +299,7 @@ impl LoadManager {
297
299
}
298
300
299
301
if self . jailed_queries . read ( ) . unwrap ( ) . contains ( & shape_hash) {
300
- return true ;
302
+ return ! * SIMULATE ;
301
303
}
302
304
303
305
let ( overloaded, wait_ms) = self . overloaded ( ) ;
@@ -326,17 +328,30 @@ impl LoadManager {
326
328
// effort in an overload situation gets killed
327
329
warn ! ( self . logger, "Jailing query" ;
328
330
"query" => query,
331
+ "wait_ms" => wait_ms. as_millis( ) ,
329
332
"query_effort_ms" => query_effort,
330
333
"total_effort_ms" => total_effort,
331
334
"ratio" => format!( "{:.4}" , query_effort/total_effort) ) ;
332
335
self . jailed_queries . write ( ) . unwrap ( ) . insert ( shape_hash) ;
333
- return true ;
336
+ return ! * SIMULATE ;
334
337
}
335
338
336
339
// Kill random queries in case we have no queries, or not enough queries
337
340
// that cause at least 20% of the effort
338
341
let kill_rate = self . update_kill_rate ( kill_rate, last_update, overloaded, wait_ms) ;
339
- thread_rng ( ) . gen_bool ( ( kill_rate * query_effort / total_effort) . min ( 1.0 ) . max ( 0.0 ) )
342
+ let decline =
343
+ thread_rng ( ) . gen_bool ( ( kill_rate * query_effort / total_effort) . min ( 1.0 ) . max ( 0.0 ) ) ;
344
+ if * SIMULATE && decline {
345
+ debug ! ( self . logger, "Declining query" ;
346
+ "query" => query,
347
+ "wait_ms" => wait_ms. as_millis( ) ,
348
+ "query_effort_ms" => query_effort,
349
+ "total_effort_ms" => total_effort,
350
+ "kill_rate" => format!( "{:.4}" , query_effort/total_effort) ,
351
+ ) ;
352
+ return false ;
353
+ }
354
+ return decline;
340
355
}
341
356
342
357
fn overloaded ( & self ) -> ( bool , Duration ) {
0 commit comments