3b416c7fb2
Timer-driven library tasks fire on every replica, so a library refresh or a database optimise runs once per pod against the same shared library. - add IScanLeaderLease with a Redis TTL implementation and a no-op default - skip timer-driven runs of the gated tasks on instances without the lease - treat an unreachable Redis as holding the lease so tasks never stop running - leave manual and API-triggered runs ungated
38 lines
1.3 KiB
C#
38 lines
1.3 KiB
C#
namespace MediaBrowser.Controller.ScheduledTasks;
|
|
|
|
/// <summary>
|
|
/// Configuration options for scan-leader election, which gates periodic library-mutating
|
|
/// scheduled tasks to a single leader instance in a multi-pod deployment.
|
|
/// </summary>
|
|
public sealed class ScanLeaderOptions
|
|
{
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether scan-leader election is enabled. When disabled,
|
|
/// every instance runs its periodic tasks as before.
|
|
/// </summary>
|
|
public bool Enabled { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the duration in seconds for which the scan-leader lease is held before it must
|
|
/// be renewed. A leader that stops renewing loses the lease after this duration.
|
|
/// </summary>
|
|
public int LeaseDurationSeconds { get; set; } = 60;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the set of scheduled task keys whose periodic (timer-driven) execution is gated
|
|
/// to the scan leader. Tasks not listed here run on every instance, and manual or API-triggered
|
|
/// runs are never gated.
|
|
/// </summary>
|
|
public string[] GatedTaskKeys { get; set; } =
|
|
{
|
|
"RefreshLibrary",
|
|
"RefreshPeople",
|
|
"RefreshChapterImages",
|
|
"AudioNormalization",
|
|
"TaskExtractMediaSegments",
|
|
"KeyframeExtraction",
|
|
"CleanupUserDataTask",
|
|
"OptimizeDatabaseTask"
|
|
};
|
|
}
|