/// <summary> /// Async method to cause write of the current grain state data into backing store. /// </summary> public async Task WriteStateAsync() { const string what = "WriteState"; try { Stopwatch sw = Stopwatch.StartNew(); await store.WriteStateAsync(name, grainRef, grainState); sw.Stop(); StorageStatisticsGroup.OnStorageWrite(store, name, grainRef, sw.Elapsed); } catch (Exception exc) { StorageStatisticsGroup.OnStorageWriteError(store, name, grainRef); string errMsgToLog = MakeErrorMsg(what, exc); store.Log.Error((int)ErrorCode.StorageProvider_WriteFailed, errMsgToLog, exc); // If error is not specialization of OrleansException, wrap it if (!(exc is OrleansException)) { throw new OrleansException(errMsgToLog, exc); } throw; } }
/// <summary> /// Async method to cause write of the current grain state data into backing store. /// </summary> public async Task WriteStateAsync() { const string what = "WriteState"; Stopwatch sw = Stopwatch.StartNew(); GrainReference grainRef = baseGrain.GrainReference; Exception errorOccurred; try { await store.WriteStateAsync(grainTypeName, grainRef, statefulGrain.GrainState); StorageStatisticsGroup.OnStorageWrite(store, grainTypeName, grainRef, sw.Elapsed); errorOccurred = null; } catch (Exception exc) { errorOccurred = exc; } // Note, we can't do this inside catch block above, because await is not permitted there. if (errorOccurred != null) { StorageStatisticsGroup.OnStorageWriteError(store, grainTypeName, grainRef); string errMsgToLog = MakeErrorMsg(what, errorOccurred); store.Log.Error((int)ErrorCode.StorageProvider_WriteFailed, errMsgToLog, errorOccurred); // If error is not specialization of OrleansException, wrap it if (!(errorOccurred is OrleansException)) { errorOccurred = new OrleansException(errMsgToLog, errorOccurred); } #if REREAD_STATE_AFTER_WRITE_FAILED // Force rollback to previously stored state try { sw.Restart(); store.Log.Warn(ErrorCode.StorageProvider_ForceReRead, "Forcing re-read of last good state for grain Type={0}", grainTypeName); await store.ReadStateAsync(grainTypeName, grainRef, grain.GrainState); StorageStatisticsGroup.OnStorageRead(store, grainTypeName, grainRef, sw.Elapsed); } catch (Exception exc) { StorageStatisticsGroup.OnStorageReadError(store, grainTypeName, grainRef); // Should we ignore this secondary error, and just return the original one? errMsgToLog = MakeErrorMsg("re-read state from store after write error", exc); errorOccurred = new OrleansException(errMsgToLog, exc); } #endif } sw.Stop(); if (errorOccurred != null) { throw errorOccurred; } }