mirror of
https://github.com/telemt/telemt.git
synced 2026-06-10 04:51:42 +03:00
Atomically claim pressure eviction budget in MR
This commit is contained in:
@@ -38,10 +38,7 @@ fn format_maestro_line(message: impl AsRef<str>, colors_enabled: bool) -> String
|
|||||||
pub(crate) fn print_maestro_line(message: impl AsRef<str>) {
|
pub(crate) fn print_maestro_line(message: impl AsRef<str>) {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{}",
|
"{}",
|
||||||
format_maestro_line(
|
format_maestro_line(message, MAESTRO_COLORS_ENABLED.load(Ordering::Relaxed))
|
||||||
message,
|
|
||||||
MAESTRO_COLORS_ENABLED.load(Ordering::Relaxed)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1702,7 +1702,8 @@ fn select_server_hello_cipher_suite_falls_back_to_offered_tls13_suite() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn select_server_hello_cipher_suite_keeps_preferred_for_malformed_clienthello() {
|
fn select_server_hello_cipher_suite_keeps_preferred_for_malformed_clienthello() {
|
||||||
let mut ch = build_client_hello_with_ciphers_and_exts(&[[0x13, 0x03]], Vec::new(), "example.com");
|
let mut ch =
|
||||||
|
build_client_hello_with_ciphers_and_exts(&[[0x13, 0x03]], Vec::new(), "example.com");
|
||||||
ch.truncate(12);
|
ch.truncate(12);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
select_server_hello_cipher_suite(&ch, [0x13, 0x01]),
|
select_server_hello_cipher_suite(&ch, [0x13, 0x01]),
|
||||||
|
|||||||
@@ -1525,8 +1525,7 @@ where
|
|||||||
config.censorship.tls_new_session_tickets,
|
config.censorship.tls_new_session_tickets,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
let selected_cipher_suite =
|
let selected_cipher_suite = tls::select_server_hello_cipher_suite(handshake, [0x13, 0x01]);
|
||||||
tls::select_server_hello_cipher_suite(handshake, [0x13, 0x01]);
|
|
||||||
tls::build_server_hello_with_cipher(
|
tls::build_server_hello_with_cipher(
|
||||||
&validated_secret,
|
&validated_secret,
|
||||||
&validation_digest,
|
&validation_digest,
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ pub(super) fn maybe_evict_idle_candidate_on_pressure_in(
|
|||||||
}
|
}
|
||||||
*seen_pressure_seq = latest_pressure_seq;
|
*seen_pressure_seq = latest_pressure_seq;
|
||||||
|
|
||||||
if latest_pressure_seq == registry.pressure_consumed_seq.load(Ordering::Relaxed) {
|
let consumed_pressure_seq = registry.pressure_consumed_seq.load(Ordering::Relaxed);
|
||||||
|
if latest_pressure_seq == consumed_pressure_seq {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,9 +107,13 @@ pub(super) fn maybe_evict_idle_candidate_on_pressure_in(
|
|||||||
let mut ordered = registry.ordered.lock();
|
let mut ordered = registry.ordered.lock();
|
||||||
loop {
|
loop {
|
||||||
let Some((mark_order_seq, candidate_conn_id)) = ordered.iter().next().copied() else {
|
let Some((mark_order_seq, candidate_conn_id)) = ordered.iter().next().copied() else {
|
||||||
registry
|
// Empty queues consume the event so later candidates cannot replay stale pressure.
|
||||||
.pressure_consumed_seq
|
let _ = registry.pressure_consumed_seq.compare_exchange(
|
||||||
.store(latest_pressure_seq, Ordering::Relaxed);
|
consumed_pressure_seq,
|
||||||
|
latest_pressure_seq,
|
||||||
|
Ordering::Relaxed,
|
||||||
|
Ordering::Relaxed,
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
let Some(candidate_meta) = registry.by_conn_id.get(&candidate_conn_id) else {
|
let Some(candidate_meta) = registry.by_conn_id.get(&candidate_conn_id) else {
|
||||||
@@ -138,15 +143,27 @@ pub(super) fn maybe_evict_idle_candidate_on_pressure_in(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Claim the global pressure budget before removal; otherwise racing sessions
|
||||||
|
// can observe the next FIFO item and spend the same event more than once.
|
||||||
|
if registry
|
||||||
|
.pressure_consumed_seq
|
||||||
|
.compare_exchange(
|
||||||
|
consumed_pressure_seq,
|
||||||
|
latest_pressure_seq,
|
||||||
|
Ordering::Relaxed,
|
||||||
|
Ordering::Relaxed,
|
||||||
|
)
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if let Some((_, meta)) = registry.by_conn_id.remove(&conn_id) {
|
if let Some((_, meta)) = registry.by_conn_id.remove(&conn_id) {
|
||||||
registry
|
registry
|
||||||
.ordered
|
.ordered
|
||||||
.lock()
|
.lock()
|
||||||
.remove(&(meta.mark_order_seq, conn_id));
|
.remove(&(meta.mark_order_seq, conn_id));
|
||||||
}
|
}
|
||||||
registry
|
|
||||||
.pressure_consumed_seq
|
|
||||||
.store(latest_pressure_seq, Ordering::Relaxed);
|
|
||||||
stats.increment_relay_pressure_evict_total();
|
stats.increment_relay_pressure_evict_total();
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,10 +226,7 @@ fn replay_profiled_server_hello_extension(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_profiled_server_hello_extensions(
|
fn build_profiled_server_hello_extensions(cached: &CachedTlsData, rng: &SecureRandom) -> Vec<u8> {
|
||||||
cached: &CachedTlsData,
|
|
||||||
rng: &SecureRandom,
|
|
||||||
) -> Vec<u8> {
|
|
||||||
let capacity = cached
|
let capacity = cached
|
||||||
.server_hello_template
|
.server_hello_template
|
||||||
.extensions
|
.extensions
|
||||||
@@ -612,7 +609,10 @@ mod tests {
|
|||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(server_hello_extension_types(&response), vec![0x002b, 0x0033]);
|
assert_eq!(
|
||||||
|
server_hello_extension_types(&response),
|
||||||
|
vec![0x002b, 0x0033]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user