diff --git a/common/DiffractionExperiment.cpp b/common/DiffractionExperiment.cpp index 88fd6e22..2a8c0150 100644 --- a/common/DiffractionExperiment.cpp +++ b/common/DiffractionExperiment.cpp @@ -1647,3 +1647,8 @@ int64_t DiffractionExperiment::GetDarkMaskNumberOfFrames() const { bool DiffractionExperiment::IsRotationIndexing() const { return GetGoniometer().has_value() && indexing.GetRotationIndexing(); } + +DiffractionExperiment &DiffractionExperiment::RunNumber(uint64_t input) { + series_id = input; + return *this; +} diff --git a/common/DiffractionExperiment.h b/common/DiffractionExperiment.h index ffd2149e..e1dda665 100644 --- a/common/DiffractionExperiment.h +++ b/common/DiffractionExperiment.h @@ -157,6 +157,7 @@ public: DiffractionExperiment& PoniRot3_rad(float input); DiffractionExperiment& FluorescenceSpectrum(const XrayFluorescenceSpectrum& input); DiffractionExperiment& DetectIceRings(bool input); + DiffractionExperiment& RunNumber(uint64_t input); IndexingSettings GetIndexingSettings() const; DiffractionExperiment& ImportIndexingSettings(const IndexingSettings &input); diff --git a/image_pusher/TCPStreamPusher.cpp b/image_pusher/TCPStreamPusher.cpp index 02c357eb..52c0f582 100644 --- a/image_pusher/TCPStreamPusher.cpp +++ b/image_pusher/TCPStreamPusher.cpp @@ -607,6 +607,14 @@ void TCPStreamPusher::PersistentAckThread(Connection* c) { const bool fatal = (h.flags & TCP_ACK_FLAG_FATAL) != 0; const auto code = static_cast(h.ack_code); + // Validate run number: discard stale ACKs from a previous run on a persistent connection + if (h.run_number != run_number) { + logger.Warning("Discarding ACK with stale run_number " + std::to_string(h.run_number) + + " (expected " + std::to_string(run_number) + ") on socket " + + std::to_string(c->socket_number)); + continue; + } + { std::unique_lock ul(c->ack_mutex); c->last_ack_code = code; diff --git a/tests/TCPImagePusherTest.cpp b/tests/TCPImagePusherTest.cpp index 991d4b40..05586959 100644 --- a/tests/TCPImagePusherTest.cpp +++ b/tests/TCPImagePusherTest.cpp @@ -16,6 +16,7 @@ TEST_CASE("TCPImageCommTest_2Writers_WithAck", "[TCP]") { x.Raw(); x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(false).IncidentEnergy_keV(12.4) .ImagesPerTrigger(nframes).Compression(CompressionAlgorithm::NO_COMPRESSION); + x.RunNumber(567); std::mt19937 g1(1387); std::uniform_int_distribution dist; @@ -45,6 +46,7 @@ TEST_CASE("TCPImageCommTest_2Writers_WithAck", "[TCP]") { StartMessage start{ .images_per_file = images_per_file, + .run_number = x.GetRunNumber(), .write_master_file = true }; EndMessage end{}; @@ -100,6 +102,7 @@ TEST_CASE("TCPImageCommTest_2Writers_WithAck", "[TCP]") { ack.image_number = 0; ack.processed_images = 0; ack.error_code = TCPAckCode::None; + REQUIRE(ack.run_number == x.GetRunNumber()); REQUIRE(puller[w]->SendAck(ack)); seen_start = true; continue;