状況によっては、システム内のすべての分散処理タスクがハングし、タスクが完了しないことがあります。これは、Sitecore.Processing.Poolsデータベース内のGenericProcessing_GetStateストアド プロシージャのバグに関連しています。このストアド プロシージャは、特定の処理プールの状態を返すのではなく、テーブル内のすべてのプール アイテムの状態を返します。これは、タスクBの処理プールにアイテムがある場合、タスクAを終了できないことを意味します。
ログ ファイルでは、この動作はDEBUGレベルのロギングがオンになっている場合にのみ見られ、次のログ メッセージが記録されます:
DEBUG TaskAgent (<MachineName> 3556 1): Picked task with Id 1d845ab5-d31d-4ccc-9e82-a7de496ef36a DEBUG DistributedWorkExecutor (<MachineName> 3556 1): Start execution. DEBUG InteractionCursorScheduler (<MachineName> 3556 1): Get next batch from cursor. DEBUG InteractionCursorScheduler (<MachineName> 3556 1): Get cursor through split. DEBUG InteractionCursorScheduler (<MachineName> 3556 1): No cursor to work on. Return. DEBUG BinaryKeyInteractionProcessingPoolScheduler: Get next batch from pool. DEBUG TaskAgent (<MachineName> 3556 1): Complete task 1d845ab5-d31d-4ccc-9e82-a7de496ef36a. DEBUG TaskAgent (<MachineName> 3556 1): Picked task with Id 1d845ab5-d31d-4ccc-9e82-a7de496ef36a.
注意:これらのメッセージの間に他のログ エントリが存在する可能性があります。注意すべき重要なパターンは、タスクの完了後、TaskAgentが同じIDを持つタスクを取得することです(最後の2つのログ エントリ)。
また、Sitecore.Processing.Tasks データベースでは、TaskId 列が上記のログ エントリに記載されているタスク IDと等しいすべてのカーソル エントリ(ProcessingCursors テーブル)において、IsCompleted 列がtrueに設定されます。これは、処理するものがない場合でも、同じ処理タスクが無期限に取得されることを意味します。
この事象を確認するもう一つの方法は、Pathアナライザーとエクスペリエンス アナリティクスが新しいデータを表示しなくなることです。その理由は、これらの機能が処理プールを利用してデータを計算しているためです。
この問題を解決するには、Sitecore.Processing.Pools データベースのGenericProcessingPool テーブルをクリアする必要があります。以下のスクリプトを(<Sitecore.Processing.pools database>を貴社のSitecore.Processing.Pools データベース名に置き換えて)実行してください:
USE [<Sitecore.Processing.pools database>] DELETE FROM [xdb_processing_pools].[GenericProcessingPool]
GenericProcessingPool テーブルがクリアされた後、分散処理タスクを再起動してください。