cancellationToken.IsCancellationRequested在服务结构的滚动升级中未实现

时间:2018-05-15 20:41:34

标签: azure-service-fabric

我有一个状态全服务,它正在扫描可靠的集合并对其执行某些操作。 RunAsync中的代码如下:

while (!cancellationToken.IsCancellationRequested)
        {
            try
            {
                var cacheItemsWithExpiration = await this.cacheStore.GetAllCacheItemsWithExpiration(); // Call to reliable collection

                // some processing on cacheItemsWithExpiration
            }
            catch (Exception ex)
            {
                this.telemetryHelper.TrackException(ex); // Telemetry logging
            }
        }

现在在滚动升级期间,GetAllCacheItemsWithExpiration方法会抛出错误"主状态管理器当前不可读"

现在根据编写的代码,在异常之后,while循环应该退出,因为我认为升级将发送取消。但不知何故,它陷入了循环并继续登录例外。

我在Service Fabric资源管理器中看到以下消息:

enter image description here

1 个答案:

答案 0 :(得分:0)

如屏幕截图所示,错误发生在辅助副本中,通过消息,看起来像是在尝试切换角色,其中主要成为辅助副本,反之亦然。

SwapPrimary 重新配置发生在升级必须放下实例以带来新版本时,并且当它在主副本上发生时,其中一个辅助提升为主要版本。

正如您所看到的,这只是一个警告,可能发生的是您的代码在循环之间花费的时间太长,直到您再次检查取消,可能GetAllCacheItemsWithExpiration()花费的时间太长或者交换发生时,代码仍在处理之后。

您可以尝试:

  • 检查取消令牌是否被正确取消
  • 检查方法GetAllCacheItemsWithExpiration()
  • 中的取消
  • 返回方法后检查取消
  • 检查可能导致进程暂停一段时间的任何地方

在上一种情况下,您可能希望从状态服务中实施OnChangeRoleAsync(ReplicaRole newRole, CancellationToken cancellationToken)覆盖以跟踪角色更改,请参阅更多详细信息here

See this docs to understand more about the Reconfiguration in Azure Service Fabric