我有一个状态全服务,它正在扫描可靠的集合并对其执行某些操作。 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资源管理器中看到以下消息:
答案 0 :(得分:0)
如屏幕截图所示,错误发生在辅助副本中,通过消息,看起来像是在尝试切换角色,其中主要成为辅助副本,反之亦然。
SwapPrimary 重新配置发生在升级必须放下实例以带来新版本时,并且当它在主副本上发生时,其中一个辅助提升为主要版本。
正如您所看到的,这只是一个警告,可能发生的是您的代码在循环之间花费的时间太长,直到您再次检查取消,可能GetAllCacheItemsWithExpiration()
花费的时间太长或者交换发生时,代码仍在处理之后。
您可以尝试:
GetAllCacheItemsWithExpiration()
在上一种情况下,您可能希望从状态服务中实施OnChangeRoleAsync(ReplicaRole newRole, CancellationToken cancellationToken)
覆盖以跟踪角色更改,请参阅更多详细信息here
See this docs to understand more about the Reconfiguration in Azure Service Fabric