TCP: Improve behavior and documentation

This commit is contained in:
2026-03-04 15:30:07 +01:00
parent 5345b41e16
commit 2914d77dbd
11 changed files with 186 additions and 26 deletions
+34 -5
View File
@@ -307,6 +307,10 @@ bool TCPStreamPusherSocket::SendFrame(const uint8_t *data, size_t size, TCPFrame
if (z)
z->release();
}
if (ok && type == TCPFrameType::DATA)
data_sent.fetch_add(1, std::memory_order_relaxed);
return ok;
}
@@ -454,11 +458,19 @@ void TCPStreamPusherSocket::AckThread() {
cancel_ack_ok = ok;
if (!ok && error_text.empty())
last_ack_error = "CANCEL rejected";
} else if (ack_for == TCPFrameType::DATA && (!ok || fatal)) {
broken = true;
if (error_text.empty())
last_ack_error = "DATA fatal ACK";
logger.Error("Received fatal DATA ACK on " + endpoint + ": " + last_ack_error);
} else if (ack_for == TCPFrameType::DATA) {
data_acked_total.fetch_add(1, std::memory_order_relaxed);
last_processed_images.store(h.ack_processed_images, std::memory_order_relaxed);
if (ok && !fatal) {
data_acked_ok.fetch_add(1, std::memory_order_relaxed);
} else {
data_acked_bad.fetch_add(1, std::memory_order_relaxed);
broken = true; // mandatory DATA ACK mode: bad DATA ACK breaks stream
if (error_text.empty())
last_ack_error = "DATA ACK failed";
logger.Error("Received failing DATA ACK on " + endpoint + ": " + last_ack_error);
}
}
}
ack_cv.notify_all();
@@ -481,6 +493,12 @@ void TCPStreamPusherSocket::StartWriterThread() {
last_ack_code = TCPAckCode::None;
}
data_sent.store(0, std::memory_order_relaxed);
data_acked_ok.store(0, std::memory_order_relaxed);
data_acked_bad.store(0, std::memory_order_relaxed);
data_acked_total.store(0, std::memory_order_relaxed);
last_processed_images.store(0, std::memory_order_relaxed);
active = true;
send_future = std::async(std::launch::async, &TCPStreamPusherSocket::WriterThread, this);
completion_future = std::async(std::launch::async, &TCPStreamPusherSocket::CompletionThread, this);
@@ -572,3 +590,14 @@ std::string TCPStreamPusherSocket::GetLastAckError() const {
std::unique_lock ul(ack_state_mutex);
return last_ack_error;
}
ImagePusherAckProgress TCPStreamPusherSocket::GetDataAckProgress() const {
ImagePusherAckProgress p;
p.data_sent = data_sent.load(std::memory_order_relaxed);
p.data_acked_ok = data_acked_ok.load(std::memory_order_relaxed);
p.data_acked_bad = data_acked_bad.load(std::memory_order_relaxed);
p.data_acked_total = data_acked_total.load(std::memory_order_relaxed);
p.data_ack_pending = (p.data_sent >= p.data_acked_total) ? (p.data_sent - p.data_acked_total) : 0;
p.last_processed_images = last_processed_images.load(std::memory_order_relaxed);
return p;
}