use std::time::Duration;
#[cfg(feature = "bench-profile")]
mod enabled {
use std::{
cell::RefCell,
sync::atomic::{AtomicBool, Ordering},
time::Duration,
};
use tiberius::BulkLoadStats;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct DirectWriteProfile {
pub measure_batch: Duration,
pub row_range_split: Duration,
pub append_encode: Duration,
pub send_total: Duration,
pub rows: u64,
pub batches: u64,
pub row_ranges: u64,
pub encoded_bytes: u64,
pub max_row_range_bytes: u64,
pub nvarchar_utf16_bytes: u64,
pub varbinary_bytes: u64,
pub null_cells: u64,
pub packet_write_calls: u64,
pub packets_written: u64,
pub packet_payload_bytes: u64,
pub max_packet_payload_bytes: u64,
pub max_buffered_bytes_before_write: u64,
pub buffered_bytes_after_last_write: u64,
pub finalized_packet_payload_bytes: u64,
pub bulk_write_packets_elapsed: Duration,
pub bulk_write_to_wire_calls: u64,
pub bulk_write_to_wire_elapsed: Duration,
pub bulk_write_to_wire_payload_bytes: u64,
pub bulk_max_write_to_wire_elapsed: Duration,
pub bulk_max_write_to_wire_payload_bytes: u64,
pub bulk_flush_calls: u64,
pub bulk_flush_elapsed: Duration,
pub bulk_max_flush_elapsed: Duration,
pub bulk_finalize_elapsed: Duration,
pub bulk_finalize_write_to_wire_elapsed: Duration,
pub bulk_finalize_flush_elapsed: Duration,
pub bulk_finalize_result_elapsed: Duration,
pub bulk_connection_write_calls: u64,
pub bulk_connection_write_payload_bytes: u64,
pub bulk_connection_write_ready_elapsed: Duration,
pub bulk_connection_write_encode_elapsed: Duration,
pub bulk_connection_write_flush_elapsed: Duration,
pub bulk_connection_write_max_ready_elapsed: Duration,
pub bulk_connection_write_max_encode_elapsed: Duration,
pub bulk_connection_write_max_flush_elapsed: Duration,
pub bulk_connection_write_max_payload_bytes: u64,
pub bulk_direct_packet_write_calls: u64,
pub bulk_direct_packet_payload_bytes: u64,
pub bulk_direct_packet_header_bytes: u64,
pub bulk_direct_packet_max_payload_bytes: u64,
pub bulk_direct_packet_final_calls: u64,
pub bulk_direct_packet_final_payload_bytes: u64,
pub bulk_direct_packet_final_header_bytes: u64,
pub bulk_direct_packet_raw_stream_calls: u64,
pub bulk_direct_packet_tls_stream_calls: u64,
pub bulk_direct_packet_low_level_write_calls: u64,
pub bulk_direct_packet_low_level_write_bytes: u64,
pub bulk_direct_packet_max_low_level_write_bytes: u64,
pub bulk_direct_packet_write_elapsed: Duration,
pub bulk_direct_packet_max_write_elapsed: Duration,
pub bulk_direct_packet_header_write_calls: u64,
pub bulk_direct_packet_header_write_bytes: u64,
pub bulk_direct_packet_header_max_write_bytes: u64,
pub bulk_direct_packet_header_write_elapsed: Duration,
pub bulk_direct_packet_header_max_write_elapsed: Duration,
pub bulk_direct_packet_header_partial_writes: u64,
pub bulk_direct_packet_payload_write_calls: u64,
pub bulk_direct_packet_payload_write_bytes: u64,
pub bulk_direct_packet_payload_max_write_bytes: u64,
pub bulk_direct_packet_payload_write_elapsed: Duration,
pub bulk_direct_packet_payload_max_write_elapsed: Duration,
pub bulk_direct_packet_payload_partial_writes: u64,
pub bulk_direct_packet_poll_write_polls: u64,
pub bulk_direct_packet_poll_write_pending_count: u64,
pub bulk_direct_packet_poll_write_pending_elapsed: Duration,
pub bulk_direct_packet_poll_write_max_pending_elapsed: Duration,
pub bulk_direct_packet_poll_write_ready_count: u64,
pub bulk_direct_packet_poll_write_ready_elapsed: Duration,
pub bulk_direct_packet_poll_write_max_ready_elapsed: Duration,
pub bulk_direct_packet_flush_calls: u64,
pub bulk_direct_packet_flush_elapsed: Duration,
pub bulk_direct_packet_max_flush_elapsed: Duration,
pub bulk_direct_packet_flush_pending_count: u64,
pub bulk_direct_packet_flush_pending_elapsed: Duration,
pub bulk_direct_packet_flush_max_pending_elapsed: Duration,
}
impl DirectWriteProfile {
pub fn send_without_append_encode(&self) -> Duration {
self.send_total.saturating_sub(self.append_encode)
}
}
thread_local! {
static DIRECT_PROFILE: RefCell<Option<DirectWriteProfile>> = const { RefCell::new(None) };
}
static DIRECT_DATE_FAST_PATH_DISABLED: AtomicBool = AtomicBool::new(false);
static DIRECT_FIXED_WIDTH_FAST_PATH_DISABLED: AtomicBool = AtomicBool::new(false);
#[derive(Debug)]
pub struct DirectDateFastPathOverride {
previous: bool,
}
#[derive(Debug)]
pub struct DirectFixedWidthFastPathOverride {
previous: bool,
}
impl Drop for DirectDateFastPathOverride {
fn drop(&mut self) {
DIRECT_DATE_FAST_PATH_DISABLED.store(self.previous, Ordering::Relaxed);
}
}
impl Drop for DirectFixedWidthFastPathOverride {
fn drop(&mut self) {
DIRECT_FIXED_WIDTH_FAST_PATH_DISABLED.store(self.previous, Ordering::Relaxed);
}
}
pub fn disable_direct_date_fast_path_for_scope() -> DirectDateFastPathOverride {
DirectDateFastPathOverride {
previous: DIRECT_DATE_FAST_PATH_DISABLED.swap(true, Ordering::Relaxed),
}
}
pub fn disable_direct_fixed_width_fast_path_for_scope() -> DirectFixedWidthFastPathOverride {
DirectFixedWidthFastPathOverride {
previous: DIRECT_FIXED_WIDTH_FAST_PATH_DISABLED.swap(true, Ordering::Relaxed),
}
}
pub(crate) fn direct_date_fast_path_disabled() -> bool {
DIRECT_DATE_FAST_PATH_DISABLED.load(Ordering::Relaxed)
}
pub(crate) fn direct_fixed_width_fast_path_disabled() -> bool {
DIRECT_FIXED_WIDTH_FAST_PATH_DISABLED.load(Ordering::Relaxed)
}
pub fn start_direct_write_profile() {
DIRECT_PROFILE.with(|profile| {
*profile.borrow_mut() = Some(DirectWriteProfile::default());
});
}
pub fn finish_direct_write_profile() -> Option<DirectWriteProfile> {
DIRECT_PROFILE.with(|profile| profile.borrow_mut().take())
}
pub(crate) fn record_measure_batch(elapsed: Duration) {
with_profile(|profile| profile.measure_batch += elapsed);
}
pub(crate) fn record_row_range_split(elapsed: Duration) {
with_profile(|profile| profile.row_range_split += elapsed);
}
pub(crate) fn record_append_encode(elapsed: Duration) {
with_profile(|profile| profile.append_encode += elapsed);
}
pub(crate) fn record_send_total(elapsed: Duration) {
with_profile(|profile| profile.send_total += elapsed);
}
pub(crate) fn record_accepted_batch(rows: usize) {
with_profile(|profile| {
profile.rows = profile.rows.saturating_add(usize_to_u64_saturating(rows));
profile.batches = profile.batches.saturating_add(1);
});
}
pub(crate) fn record_row_range(encoded_bytes: usize) {
with_profile(|profile| {
let encoded_bytes = usize_to_u64_saturating(encoded_bytes);
profile.row_ranges = profile.row_ranges.saturating_add(1);
profile.encoded_bytes = profile.encoded_bytes.saturating_add(encoded_bytes);
profile.max_row_range_bytes = profile.max_row_range_bytes.max(encoded_bytes);
});
}
pub(crate) fn record_nvarchar_utf16_bytes(encoded_bytes: usize) {
with_profile(|profile| {
profile.nvarchar_utf16_bytes = profile
.nvarchar_utf16_bytes
.saturating_add(usize_to_u64_saturating(encoded_bytes));
});
}
pub(crate) fn record_varbinary_bytes(encoded_bytes: usize) {
with_profile(|profile| {
profile.varbinary_bytes = profile
.varbinary_bytes
.saturating_add(usize_to_u64_saturating(encoded_bytes));
});
}
pub(crate) fn record_null_cell() {
with_profile(|profile| {
profile.null_cells = profile.null_cells.saturating_add(1);
});
}
pub(crate) fn record_bulk_load_stats(stats: BulkLoadStats) {
let packet = stats.packet;
let timing = stats.write_timing;
let connection = timing.connection_write;
let direct = timing.direct_packet_write;
with_profile(|profile| {
profile.packet_write_calls = profile
.packet_write_calls
.saturating_add(packet.write_packets_calls);
profile.packets_written = profile
.packets_written
.saturating_add(packet.packets_written);
profile.packet_payload_bytes = profile
.packet_payload_bytes
.saturating_add(packet.packet_payload_bytes);
profile.max_packet_payload_bytes = profile
.max_packet_payload_bytes
.max(usize_to_u64_saturating(packet.max_packet_payload_bytes));
profile.max_buffered_bytes_before_write =
profile
.max_buffered_bytes_before_write
.max(usize_to_u64_saturating(
packet.max_buffered_bytes_before_write,
));
profile.buffered_bytes_after_last_write =
usize_to_u64_saturating(packet.buffered_bytes_after_last_write);
profile.finalized_packet_payload_bytes = profile
.finalized_packet_payload_bytes
.saturating_add(usize_to_u64_saturating(
packet.finalized_packet_payload_bytes,
));
profile.bulk_write_packets_elapsed += timing.write_packets_elapsed;
profile.bulk_write_to_wire_calls = profile
.bulk_write_to_wire_calls
.saturating_add(timing.write_to_wire_calls);
profile.bulk_write_to_wire_elapsed += timing.write_to_wire_elapsed;
profile.bulk_write_to_wire_payload_bytes = profile
.bulk_write_to_wire_payload_bytes
.saturating_add(timing.write_to_wire_payload_bytes);
profile.bulk_max_write_to_wire_elapsed = profile
.bulk_max_write_to_wire_elapsed
.max(timing.max_write_to_wire_elapsed);
profile.bulk_max_write_to_wire_payload_bytes = profile
.bulk_max_write_to_wire_payload_bytes
.max(usize_to_u64_saturating(
timing.max_write_to_wire_payload_bytes,
));
profile.bulk_flush_calls = profile.bulk_flush_calls.saturating_add(timing.flush_calls);
profile.bulk_flush_elapsed += timing.flush_elapsed;
profile.bulk_max_flush_elapsed =
profile.bulk_max_flush_elapsed.max(timing.max_flush_elapsed);
profile.bulk_finalize_elapsed += timing.finalize_elapsed;
profile.bulk_finalize_write_to_wire_elapsed += timing.finalize_write_to_wire_elapsed;
profile.bulk_finalize_flush_elapsed += timing.finalize_flush_elapsed;
profile.bulk_finalize_result_elapsed += timing.finalize_result_elapsed;
profile.bulk_connection_write_calls = profile
.bulk_connection_write_calls
.saturating_add(connection.calls);
profile.bulk_connection_write_payload_bytes = profile
.bulk_connection_write_payload_bytes
.saturating_add(connection.payload_bytes);
profile.bulk_connection_write_ready_elapsed += connection.ready_elapsed;
profile.bulk_connection_write_encode_elapsed += connection.encode_elapsed;
profile.bulk_connection_write_flush_elapsed += connection.flush_elapsed;
profile.bulk_connection_write_max_ready_elapsed = profile
.bulk_connection_write_max_ready_elapsed
.max(connection.max_ready_elapsed);
profile.bulk_connection_write_max_encode_elapsed = profile
.bulk_connection_write_max_encode_elapsed
.max(connection.max_encode_elapsed);
profile.bulk_connection_write_max_flush_elapsed = profile
.bulk_connection_write_max_flush_elapsed
.max(connection.max_flush_elapsed);
profile.bulk_connection_write_max_payload_bytes = profile
.bulk_connection_write_max_payload_bytes
.max(usize_to_u64_saturating(connection.max_payload_bytes));
profile.bulk_direct_packet_write_calls = profile
.bulk_direct_packet_write_calls
.saturating_add(direct.calls);
profile.bulk_direct_packet_payload_bytes = profile
.bulk_direct_packet_payload_bytes
.saturating_add(direct.payload_bytes);
profile.bulk_direct_packet_header_bytes = profile
.bulk_direct_packet_header_bytes
.saturating_add(direct.header_bytes);
profile.bulk_direct_packet_max_payload_bytes = profile
.bulk_direct_packet_max_payload_bytes
.max(usize_to_u64_saturating(direct.max_payload_bytes));
profile.bulk_direct_packet_final_calls = profile
.bulk_direct_packet_final_calls
.saturating_add(direct.final_calls);
profile.bulk_direct_packet_final_payload_bytes = profile
.bulk_direct_packet_final_payload_bytes
.saturating_add(direct.final_payload_bytes);
profile.bulk_direct_packet_final_header_bytes = profile
.bulk_direct_packet_final_header_bytes
.saturating_add(direct.final_header_bytes);
profile.bulk_direct_packet_raw_stream_calls = profile
.bulk_direct_packet_raw_stream_calls
.saturating_add(direct.raw_stream_calls);
profile.bulk_direct_packet_tls_stream_calls = profile
.bulk_direct_packet_tls_stream_calls
.saturating_add(direct.tls_stream_calls);
profile.bulk_direct_packet_low_level_write_calls = profile
.bulk_direct_packet_low_level_write_calls
.saturating_add(direct.write_calls);
profile.bulk_direct_packet_low_level_write_bytes = profile
.bulk_direct_packet_low_level_write_bytes
.saturating_add(direct.write_bytes);
profile.bulk_direct_packet_max_low_level_write_bytes = profile
.bulk_direct_packet_max_low_level_write_bytes
.max(usize_to_u64_saturating(direct.max_write_bytes));
profile.bulk_direct_packet_write_elapsed += direct.write_elapsed;
profile.bulk_direct_packet_max_write_elapsed = profile
.bulk_direct_packet_max_write_elapsed
.max(direct.max_write_elapsed);
profile.bulk_direct_packet_header_write_calls = profile
.bulk_direct_packet_header_write_calls
.saturating_add(direct.header_write_calls);
profile.bulk_direct_packet_header_write_bytes = profile
.bulk_direct_packet_header_write_bytes
.saturating_add(direct.header_write_bytes);
profile.bulk_direct_packet_header_max_write_bytes = profile
.bulk_direct_packet_header_max_write_bytes
.max(usize_to_u64_saturating(direct.header_max_write_bytes));
profile.bulk_direct_packet_header_write_elapsed += direct.header_write_elapsed;
profile.bulk_direct_packet_header_max_write_elapsed = profile
.bulk_direct_packet_header_max_write_elapsed
.max(direct.header_max_write_elapsed);
profile.bulk_direct_packet_header_partial_writes = profile
.bulk_direct_packet_header_partial_writes
.saturating_add(direct.header_partial_writes);
profile.bulk_direct_packet_payload_write_calls = profile
.bulk_direct_packet_payload_write_calls
.saturating_add(direct.payload_write_calls);
profile.bulk_direct_packet_payload_write_bytes = profile
.bulk_direct_packet_payload_write_bytes
.saturating_add(direct.payload_write_bytes);
profile.bulk_direct_packet_payload_max_write_bytes = profile
.bulk_direct_packet_payload_max_write_bytes
.max(usize_to_u64_saturating(direct.payload_max_write_bytes));
profile.bulk_direct_packet_payload_write_elapsed += direct.payload_write_elapsed;
profile.bulk_direct_packet_payload_max_write_elapsed = profile
.bulk_direct_packet_payload_max_write_elapsed
.max(direct.payload_max_write_elapsed);
profile.bulk_direct_packet_payload_partial_writes = profile
.bulk_direct_packet_payload_partial_writes
.saturating_add(direct.payload_partial_writes);
profile.bulk_direct_packet_poll_write_polls = profile
.bulk_direct_packet_poll_write_polls
.saturating_add(direct.poll_write_polls);
profile.bulk_direct_packet_poll_write_pending_count = profile
.bulk_direct_packet_poll_write_pending_count
.saturating_add(direct.poll_write_pending_count);
profile.bulk_direct_packet_poll_write_pending_elapsed +=
direct.poll_write_pending_elapsed;
profile.bulk_direct_packet_poll_write_max_pending_elapsed = profile
.bulk_direct_packet_poll_write_max_pending_elapsed
.max(direct.poll_write_max_pending_elapsed);
profile.bulk_direct_packet_poll_write_ready_count = profile
.bulk_direct_packet_poll_write_ready_count
.saturating_add(direct.poll_write_ready_count);
profile.bulk_direct_packet_poll_write_ready_elapsed += direct.poll_write_ready_elapsed;
profile.bulk_direct_packet_poll_write_max_ready_elapsed = profile
.bulk_direct_packet_poll_write_max_ready_elapsed
.max(direct.poll_write_max_ready_elapsed);
profile.bulk_direct_packet_flush_calls = profile
.bulk_direct_packet_flush_calls
.saturating_add(direct.flush_calls);
profile.bulk_direct_packet_flush_elapsed += direct.flush_elapsed;
profile.bulk_direct_packet_max_flush_elapsed = profile
.bulk_direct_packet_max_flush_elapsed
.max(direct.max_flush_elapsed);
profile.bulk_direct_packet_flush_pending_count = profile
.bulk_direct_packet_flush_pending_count
.saturating_add(direct.flush_pending_count);
profile.bulk_direct_packet_flush_pending_elapsed += direct.flush_pending_elapsed;
profile.bulk_direct_packet_flush_max_pending_elapsed = profile
.bulk_direct_packet_flush_max_pending_elapsed
.max(direct.flush_max_pending_elapsed);
});
}
fn with_profile(update: impl FnOnce(&mut DirectWriteProfile)) {
DIRECT_PROFILE.with(|profile| {
if let Some(profile) = profile.borrow_mut().as_mut() {
update(profile);
}
});
}
fn usize_to_u64_saturating(value: usize) -> u64 {
u64::try_from(value).unwrap_or(u64::MAX)
}
}
#[cfg(not(feature = "bench-profile"))]
mod disabled {
use std::time::Duration;
pub(crate) fn record_measure_batch(_elapsed: Duration) {}
pub(crate) fn record_row_range_split(_elapsed: Duration) {}
pub(crate) fn record_append_encode(_elapsed: Duration) {}
pub(crate) fn record_send_total(_elapsed: Duration) {}
pub(crate) fn record_accepted_batch(_rows: usize) {}
pub(crate) fn record_row_range(_encoded_bytes: usize) {}
pub(crate) fn record_nvarchar_utf16_bytes(_encoded_bytes: usize) {}
pub(crate) fn record_varbinary_bytes(_encoded_bytes: usize) {}
pub(crate) fn record_null_cell() {}
pub(crate) fn direct_date_fast_path_disabled() -> bool {
false
}
pub(crate) fn direct_fixed_width_fast_path_disabled() -> bool {
false
}
}
#[cfg(not(feature = "bench-profile"))]
pub(crate) use disabled::*;
#[cfg(feature = "bench-profile")]
pub use enabled::{
DirectDateFastPathOverride, DirectFixedWidthFastPathOverride, DirectWriteProfile,
disable_direct_date_fast_path_for_scope, disable_direct_fixed_width_fast_path_for_scope,
finish_direct_write_profile, start_direct_write_profile,
};
#[cfg(feature = "bench-profile")]
pub(crate) use enabled::{
direct_date_fast_path_disabled, direct_fixed_width_fast_path_disabled, record_accepted_batch,
record_append_encode, record_bulk_load_stats, record_measure_batch, record_null_cell,
record_nvarchar_utf16_bytes, record_row_range, record_row_range_split, record_send_total,
record_varbinary_bytes,
};
pub(crate) fn record_elapsed<T>(start: std::time::Instant, record: fn(Duration), value: T) -> T {
record(start.elapsed());
value
}
#[cfg(all(test, feature = "bench-profile"))]
mod tests {
use std::time::Duration;
#[test]
fn direct_profile_accumulates_and_resets_current_thread_data() {
super::start_direct_write_profile();
super::record_measure_batch(Duration::from_millis(2));
super::record_row_range_split(Duration::from_millis(3));
super::record_append_encode(Duration::from_millis(5));
super::record_send_total(Duration::from_millis(13));
super::record_accepted_batch(7);
super::record_row_range(11);
super::record_nvarchar_utf16_bytes(17);
super::record_varbinary_bytes(19);
super::record_null_cell();
super::record_bulk_load_stats(tiberius::BulkLoadStats {
packet: tiberius::BulkLoadPacketStats {
write_packets_calls: 23,
packets_written: 29,
packet_payload_bytes: 31,
max_packet_payload_bytes: 37,
max_buffered_bytes_before_write: 41,
buffered_bytes_after_last_write: 43,
finalized_packet_payload_bytes: 47,
},
write_timing: tiberius::BulkLoadWriteTimingStats {
write_packets_elapsed: Duration::from_millis(53),
write_to_wire_calls: 59,
write_to_wire_elapsed: Duration::from_millis(61),
write_to_wire_payload_bytes: 67,
max_write_to_wire_elapsed: Duration::from_millis(71),
max_write_to_wire_payload_bytes: 73,
flush_calls: 79,
flush_elapsed: Duration::from_millis(83),
max_flush_elapsed: Duration::from_millis(89),
finalize_elapsed: Duration::from_millis(97),
finalize_write_to_wire_elapsed: Duration::from_millis(101),
finalize_flush_elapsed: Duration::from_millis(103),
finalize_result_elapsed: Duration::from_millis(107),
connection_write: tiberius::BulkLoadConnectionWriteStats {
calls: 109,
payload_bytes: 113,
ready_elapsed: Duration::from_millis(127),
encode_elapsed: Duration::from_millis(131),
flush_elapsed: Duration::from_millis(137),
max_ready_elapsed: Duration::from_millis(139),
max_encode_elapsed: Duration::from_millis(149),
max_flush_elapsed: Duration::from_millis(151),
max_payload_bytes: 157,
},
direct_packet_write: tiberius::BulkLoadDirectPacketWriteStats {
calls: 163,
payload_bytes: 167,
header_bytes: 173,
max_payload_bytes: 179,
final_calls: 181,
final_payload_bytes: 191,
final_header_bytes: 193,
raw_stream_calls: 197,
tls_stream_calls: 199,
write_calls: 179,
write_bytes: 181,
max_write_bytes: 191,
write_elapsed: Duration::from_millis(193),
max_write_elapsed: Duration::from_millis(197),
header_write_calls: 211,
header_write_bytes: 223,
header_max_write_bytes: 227,
header_write_elapsed: Duration::from_millis(229),
header_max_write_elapsed: Duration::from_millis(233),
header_partial_writes: 239,
payload_write_calls: 241,
payload_write_bytes: 251,
payload_max_write_bytes: 257,
payload_write_elapsed: Duration::from_millis(263),
payload_max_write_elapsed: Duration::from_millis(269),
payload_partial_writes: 271,
poll_write_polls: 277,
poll_write_pending_count: 281,
poll_write_pending_elapsed: Duration::from_millis(283),
poll_write_max_pending_elapsed: Duration::from_millis(293),
poll_write_ready_count: 307,
poll_write_ready_elapsed: Duration::from_millis(311),
poll_write_max_ready_elapsed: Duration::from_millis(313),
flush_calls: 199,
flush_elapsed: Duration::from_millis(211),
max_flush_elapsed: Duration::from_millis(223),
flush_pending_count: 317,
flush_pending_elapsed: Duration::from_millis(331),
flush_max_pending_elapsed: Duration::from_millis(337),
},
},
});
let profile = super::finish_direct_write_profile().unwrap();
assert_eq!(profile.measure_batch, Duration::from_millis(2));
assert_eq!(profile.row_range_split, Duration::from_millis(3));
assert_eq!(profile.append_encode, Duration::from_millis(5));
assert_eq!(profile.send_total, Duration::from_millis(13));
assert_eq!(
profile.send_without_append_encode(),
Duration::from_millis(8)
);
assert_eq!(profile.rows, 7);
assert_eq!(profile.batches, 1);
assert_eq!(profile.row_ranges, 1);
assert_eq!(profile.encoded_bytes, 11);
assert_eq!(profile.max_row_range_bytes, 11);
assert_eq!(profile.nvarchar_utf16_bytes, 17);
assert_eq!(profile.varbinary_bytes, 19);
assert_eq!(profile.null_cells, 1);
assert_eq!(profile.packet_write_calls, 23);
assert_eq!(profile.packets_written, 29);
assert_eq!(profile.packet_payload_bytes, 31);
assert_eq!(profile.max_packet_payload_bytes, 37);
assert_eq!(profile.max_buffered_bytes_before_write, 41);
assert_eq!(profile.buffered_bytes_after_last_write, 43);
assert_eq!(profile.finalized_packet_payload_bytes, 47);
assert_eq!(
profile.bulk_write_packets_elapsed,
Duration::from_millis(53)
);
assert_eq!(profile.bulk_write_to_wire_calls, 59);
assert_eq!(
profile.bulk_write_to_wire_elapsed,
Duration::from_millis(61)
);
assert_eq!(profile.bulk_write_to_wire_payload_bytes, 67);
assert_eq!(
profile.bulk_max_write_to_wire_elapsed,
Duration::from_millis(71)
);
assert_eq!(profile.bulk_max_write_to_wire_payload_bytes, 73);
assert_eq!(profile.bulk_flush_calls, 79);
assert_eq!(profile.bulk_flush_elapsed, Duration::from_millis(83));
assert_eq!(profile.bulk_max_flush_elapsed, Duration::from_millis(89));
assert_eq!(profile.bulk_finalize_elapsed, Duration::from_millis(97));
assert_eq!(
profile.bulk_finalize_write_to_wire_elapsed,
Duration::from_millis(101)
);
assert_eq!(
profile.bulk_finalize_flush_elapsed,
Duration::from_millis(103)
);
assert_eq!(
profile.bulk_finalize_result_elapsed,
Duration::from_millis(107)
);
assert_eq!(profile.bulk_connection_write_calls, 109);
assert_eq!(profile.bulk_connection_write_payload_bytes, 113);
assert_eq!(
profile.bulk_connection_write_ready_elapsed,
Duration::from_millis(127)
);
assert_eq!(
profile.bulk_connection_write_encode_elapsed,
Duration::from_millis(131)
);
assert_eq!(
profile.bulk_connection_write_flush_elapsed,
Duration::from_millis(137)
);
assert_eq!(
profile.bulk_connection_write_max_ready_elapsed,
Duration::from_millis(139)
);
assert_eq!(
profile.bulk_connection_write_max_encode_elapsed,
Duration::from_millis(149)
);
assert_eq!(
profile.bulk_connection_write_max_flush_elapsed,
Duration::from_millis(151)
);
assert_eq!(profile.bulk_connection_write_max_payload_bytes, 157);
assert_eq!(profile.bulk_direct_packet_write_calls, 163);
assert_eq!(profile.bulk_direct_packet_payload_bytes, 167);
assert_eq!(profile.bulk_direct_packet_header_bytes, 173);
assert_eq!(profile.bulk_direct_packet_max_payload_bytes, 179);
assert_eq!(profile.bulk_direct_packet_final_calls, 181);
assert_eq!(profile.bulk_direct_packet_final_payload_bytes, 191);
assert_eq!(profile.bulk_direct_packet_final_header_bytes, 193);
assert_eq!(profile.bulk_direct_packet_raw_stream_calls, 197);
assert_eq!(profile.bulk_direct_packet_tls_stream_calls, 199);
assert_eq!(profile.bulk_direct_packet_low_level_write_calls, 179);
assert_eq!(profile.bulk_direct_packet_low_level_write_bytes, 181);
assert_eq!(profile.bulk_direct_packet_max_low_level_write_bytes, 191);
assert_eq!(
profile.bulk_direct_packet_write_elapsed,
Duration::from_millis(193)
);
assert_eq!(
profile.bulk_direct_packet_max_write_elapsed,
Duration::from_millis(197)
);
assert_eq!(profile.bulk_direct_packet_header_write_calls, 211);
assert_eq!(profile.bulk_direct_packet_header_write_bytes, 223);
assert_eq!(profile.bulk_direct_packet_header_max_write_bytes, 227);
assert_eq!(
profile.bulk_direct_packet_header_write_elapsed,
Duration::from_millis(229)
);
assert_eq!(
profile.bulk_direct_packet_header_max_write_elapsed,
Duration::from_millis(233)
);
assert_eq!(profile.bulk_direct_packet_header_partial_writes, 239);
assert_eq!(profile.bulk_direct_packet_payload_write_calls, 241);
assert_eq!(profile.bulk_direct_packet_payload_write_bytes, 251);
assert_eq!(profile.bulk_direct_packet_payload_max_write_bytes, 257);
assert_eq!(
profile.bulk_direct_packet_payload_write_elapsed,
Duration::from_millis(263)
);
assert_eq!(
profile.bulk_direct_packet_payload_max_write_elapsed,
Duration::from_millis(269)
);
assert_eq!(profile.bulk_direct_packet_payload_partial_writes, 271);
assert_eq!(profile.bulk_direct_packet_poll_write_polls, 277);
assert_eq!(profile.bulk_direct_packet_poll_write_pending_count, 281);
assert_eq!(
profile.bulk_direct_packet_poll_write_pending_elapsed,
Duration::from_millis(283)
);
assert_eq!(
profile.bulk_direct_packet_poll_write_max_pending_elapsed,
Duration::from_millis(293)
);
assert_eq!(profile.bulk_direct_packet_poll_write_ready_count, 307);
assert_eq!(
profile.bulk_direct_packet_poll_write_ready_elapsed,
Duration::from_millis(311)
);
assert_eq!(
profile.bulk_direct_packet_poll_write_max_ready_elapsed,
Duration::from_millis(313)
);
assert_eq!(profile.bulk_direct_packet_flush_calls, 199);
assert_eq!(
profile.bulk_direct_packet_flush_elapsed,
Duration::from_millis(211)
);
assert_eq!(
profile.bulk_direct_packet_max_flush_elapsed,
Duration::from_millis(223)
);
assert_eq!(profile.bulk_direct_packet_flush_pending_count, 317);
assert_eq!(
profile.bulk_direct_packet_flush_pending_elapsed,
Duration::from_millis(331)
);
assert_eq!(
profile.bulk_direct_packet_flush_max_pending_elapsed,
Duration::from_millis(337)
);
assert!(super::finish_direct_write_profile().is_none());
}
}