diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-03-20 00:31:22 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-03-22 13:29:58 +0100 |
| commit | e32e6654b983bf4928b6f27a627b1e6305188cf6 (patch) | |
| tree | 28da2444bfe057fce97522df3eb7fa136eebf901 | |
| parent | 650f919fdda3632262ddbf98d1a37a5e98eaedda (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.cc | 7 | ||||
| -rw-r--r-- | src/lib/j2k_sync_encoder_thread.h | 5 | ||||
| -rw-r--r-- | src/lib/remote_j2k_encoder_thread.cc | 12 | ||||
| -rw-r--r-- | src/lib/remote_j2k_encoder_thread.h | 4 |
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 */ |
