summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-03-20 00:31:22 +0100
committerCarl Hetherington <cth@carlh.net>2025-03-22 13:29:58 +0100
commite32e6654b983bf4928b6f27a627b1e6305188cf6 (patch)
tree28da2444bfe057fce97522df3eb7fa136eebf901
parent650f919fdda3632262ddbf98d1a37a5e98eaedda (diff)
Move remote backoff sleep to before we pop a frame from the queue.
Otherwise in the case of failure it can take a while for the frame to become available again for a functioning thread to encode.
-rw-r--r--src/lib/j2k_sync_encoder_thread.cc7
-rw-r--r--src/lib/j2k_sync_encoder_thread.h5
-rw-r--r--src/lib/remote_j2k_encoder_thread.cc12
-rw-r--r--src/lib/remote_j2k_encoder_thread.h4
4 files changed, 20 insertions, 8 deletions
diff --git a/src/lib/j2k_sync_encoder_thread.cc b/src/lib/j2k_sync_encoder_thread.cc
index ef6834f60..158c12b11 100644
--- a/src/lib/j2k_sync_encoder_thread.cc
+++ b/src/lib/j2k_sync_encoder_thread.cc
@@ -25,6 +25,8 @@
#include "j2k_sync_encoder_thread.h"
#include <dcp/scope_guard.h>
+#include "i18n.h"
+
J2KSyncEncoderThread::J2KSyncEncoderThread(J2KEncoder& encoder)
: J2KEncoderThread(encoder)
@@ -40,6 +42,11 @@ try
log_thread_start();
while (true) {
+ if (auto wait = backoff()) {
+ LOG_ERROR(N_("Encoder thread sleeping (due to backoff) for %1s"), wait);
+ boost::this_thread::sleep(boost::posix_time::seconds(wait));
+ }
+
LOG_TIMING("encoder-sleep thread=%1", thread_id());
auto frame = _encoder.pop();
diff --git a/src/lib/j2k_sync_encoder_thread.h b/src/lib/j2k_sync_encoder_thread.h
index 45222279e..06bb1fcef 100644
--- a/src/lib/j2k_sync_encoder_thread.h
+++ b/src/lib/j2k_sync_encoder_thread.h
@@ -26,6 +26,11 @@ public:
virtual void log_thread_start() const = 0;
virtual std::shared_ptr<dcp::ArrayData> encode(DCPVideo const& frame) = 0;
+ /** @return number of seconds we should wait between attempts to use this thread
+ * for encoding. Used to avoid flooding non-responsive network servers with
+ * requests.
+ */
+ virtual int backoff() const { return 0; }
};
diff --git a/src/lib/remote_j2k_encoder_thread.cc b/src/lib/remote_j2k_encoder_thread.cc
index 49d80953d..2abaf94ba 100644
--- a/src/lib/remote_j2k_encoder_thread.cc
+++ b/src/lib/remote_j2k_encoder_thread.cc
@@ -61,22 +61,18 @@ RemoteJ2KEncoderThread::encode(DCPVideo const& frame)
}
} catch (std::exception& e) {
LOG_ERROR(
- N_("Remote encode of %1 on %2 failed (%3); thread sleeping for %4s"),
+ N_("Remote encode of %1 on %2 failed (%3)"),
frame.index(), _server.host_name(), e.what(), _remote_backoff
);
} catch (...) {
LOG_ERROR(
- N_("Remote encode of %1 on %2 failed; thread sleeping for %4s"),
+ N_("Remote encode of %1 on %2 failed"),
frame.index(), _server.host_name(), _remote_backoff
);
}
- if (!encoded) {
- if (_remote_backoff < 60) {
- /* back off more */
- _remote_backoff += 10;
- }
- boost::this_thread::sleep(boost::posix_time::seconds(_remote_backoff));
+ if (!encoded && _remote_backoff < 60) {
+ _remote_backoff += 10;
}
return encoded;
diff --git a/src/lib/remote_j2k_encoder_thread.h b/src/lib/remote_j2k_encoder_thread.h
index f3fe7f94a..5b203946c 100644
--- a/src/lib/remote_j2k_encoder_thread.h
+++ b/src/lib/remote_j2k_encoder_thread.h
@@ -14,6 +14,10 @@ public:
return _server;
}
+ int backoff() const override {
+ return _remote_backoff;
+ }
+
private:
EncodeServerDescription _server;
/** Number of seconds that we currently wait between attempts to connect to the server */