Example #1
0
        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();
        }