private void StartProcessingTransactions() { _shouldContinue = true; _singleConsumer = new Thread(() => { while (_shouldContinue) { try { // this call is blocking if nothing to process var persistentTransaction = TransactionLog.StartProcessing(); if (persistentTransaction != null && persistentTransaction.TransactionStatus != TransactionStaus.Canceled) { var data = persistentTransaction.Data; var transaction = SerializationHelper.ObjectFromBytes <Transaction>(data, SerializationMode.ProtocolBuffers, false); if (transaction is MixedTransaction mixedTransaction) { foreach (var item in mixedTransaction.ItemsToPut) { var itemData = SerializationHelper.ObjectToBytes(item, SerializationMode.ProtocolBuffers, null); Dbg.Trace( $"storing persistent block for object {item} transaction={persistentTransaction.Id}"); _storage.StoreBlock(itemData, item.GlobalKey, unchecked ((int)persistentTransaction.Id)); } foreach (var item in mixedTransaction.ItemsToDelete) { Dbg.Trace($"deleting persistent block {persistentTransaction.Id}"); _storage.DeleteBlock(item.GlobalKey, unchecked ((int)persistentTransaction.Id)); } } if (transaction is PutTransaction putTransaction) { foreach (var item in putTransaction.Items) { var itemData = SerializationHelper.ObjectToBytes(item, SerializationMode.ProtocolBuffers, null); Dbg.Trace( $"storing persistent block for object {item} transaction={persistentTransaction.Id}"); _storage.StoreBlock(itemData, item.GlobalKey, unchecked ((int)persistentTransaction.Id)); } } if (transaction is DeleteTransaction deleteTransaction) { foreach (var item in deleteTransaction.ItemsToDelete) { Dbg.Trace($"deleting persistent block {persistentTransaction.Id}"); _storage.DeleteBlock(item.GlobalKey, unchecked ((int)persistentTransaction.Id)); } } TransactionLog.EndProcessing(persistentTransaction); } else { return; } } catch (Exception e) { Dbg.Trace(e.Message); //TODO add proper logging } } }); _singleConsumer.Start(); }