private void SplitWrites(List<OutstandingWrite> writes) { for (var index = 0; index < writes.Count; index++) { var write = writes[index]; try { _cancellationToken.ThrowIfCancellationRequested(); using (var tx = _env.NewTransaction(TransactionFlags.ReadWrite)) { HandleOperations(tx, new List<OutstandingWrite> { write }, _cancellationToken); tx.Commit(); write.Completed(); } } catch (Exception e) { if (e is SEHException) { e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult)); } write.Errored(e); } } }
private void HandleActualWrites(OutstandingWrite mine, CancellationToken token) { List<OutstandingWrite> writes = null; try { writes = BuildBatchGroup(mine); var completedSuccessfully = false; using (var tx = _env.NewTransaction(TransactionFlags.ReadWrite)) { HandleOperations(tx, writes, _cancellationToken); try { tx.Commit(); if (ShouldRecordToDebugJournal) _debugJournal.Flush(); completedSuccessfully = true; } catch (Exception e) { if (e is SEHException) { e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult)); } // if we have an error during the commit, we can't recover, just fail them all. foreach (var write in writes) { write.Errored(e); } } } if (completedSuccessfully) { foreach (var write in writes) write.Completed(); } } catch (Exception e) { if (e is SEHException) { e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult)); } HandleWriteFailure(writes, mine, e); } }