TCP: Improve behavior and documentation
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user