示例#1
0
        private void ReplayWriteAction(WriteActivityEntry activityEntry, ref Transaction tx)
        {
            switch (activityEntry.ActionType)
            {
            case DebugActionType.Add:
                tx.ReadTree(activityEntry.TreeName).Add(activityEntry.Key, activityEntry.ValueStream);
                break;

            case DebugActionType.Delete:
                tx.ReadTree(activityEntry.TreeName).Delete(activityEntry.Key);
                break;

            case DebugActionType.MultiAdd:
                tx.ReadTree(activityEntry.TreeName).MultiAdd(activityEntry.Key, new Slice(Encoding.UTF8.GetBytes(activityEntry.Value.ToString())));
                break;

            case DebugActionType.MultiDelete:
                tx.ReadTree(activityEntry.TreeName).MultiDelete(activityEntry.Key, new Slice(Encoding.UTF8.GetBytes(activityEntry.Value.ToString())));
                break;

            case DebugActionType.CreateTree:
                _env.CreateTree(tx, activityEntry.TreeName);
                break;

            case DebugActionType.Increment:
                var buffer = new byte[sizeof(long)];
                activityEntry.ValueStream.Read(buffer, 0, buffer.Length);
                var delta = EndianBitConverter.Little.ToInt64(buffer, 0);
                tx.ReadTree(activityEntry.TreeName).Increment(activityEntry.Key, delta);
                break;

            default:     //precaution against newly added action types
                throw new InvalidOperationException("unsupported tree action type");
            }
        }
示例#2
0
 public void RecordWriteAction(DebugActionType actionType, Transaction tx, Slice key, string treeName, object value)
 {
     if (IsRecording)
     {
         var newAction = new WriteActivityEntry(actionType, tx.Id, key, treeName, value);
         WriteQueue.Enqueue(newAction);
         WriteAndFlush(newAction);
     }
 }
示例#3
0
            public static BaseActivityEntry FromCsvLine(string csvLine, bool recordOnlyValueLength)
            {
                var firstToken = csvLine.Substring(0, csvLine.IndexOf(",", StringComparison.Ordinal));

                if (firstToken.StartsWith("Flush"))
                {
                    return(FlushActivityEntry.FromCsvLine(csvLine));
                }
                if (firstToken.StartsWith("Transaction"))
                {
                    return(TransactionActivityEntry.FromCsvLine(csvLine, recordOnlyValueLength));
                }
                return(WriteActivityEntry.FromCsvLine(csvLine, recordOnlyValueLength));
            }
示例#4
0
            public new static WriteActivityEntry FromCsvLine(string csvLine, bool recordOnlyValueLength)
            {
                var columnArray = csvLine.Split(new[] { ',' }).ToList();

                if (columnArray.Count != 5)
                {
                    throw new ArgumentException("invalid csv data - check that you do not have commas in data");
                }

                try
                {
                    var type = GenericUtil.ParseEnum <DebugActionType>(columnArray[0]);

                    if (type == DebugActionType.CreateTree)
                    {
                        var activityEntry = new WriteActivityEntry(
                            type,
                            long.Parse(columnArray[1]),
                            Slice.Empty,
                            columnArray[2],
                            null);
                        return(activityEntry);
                    }

                    if (type == DebugActionType.Delete)
                    {
                        var activityEntry = new WriteActivityEntry(
                            type,
                            long.Parse(columnArray[1]),
                            columnArray[3],
                            columnArray[2],
                            null);

                        return(activityEntry);
                    }

                    var random = new Random();

                    object value;
                    switch (type)
                    {
                    case DebugActionType.Increment:
                        var delta = long.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(columnArray[4])));
                        value = new MemoryStream(EndianBitConverter.Little.GetBytes(delta));
                        break;

                    case DebugActionType.MultiAdd:
                    case DebugActionType.MultiDelete:
                        value = new Slice(Convert.FromBase64String(columnArray[4]));
                        break;

                    default:
                        if (recordOnlyValueLength)
                        {
                            var length = long.Parse(columnArray[4]);
                            var bytes  = new byte[length];
                            random.NextBytes(bytes);

                            value = new MemoryStream(bytes);
                        }
                        else
                        {
                            value = new MemoryStream(Convert.FromBase64String(columnArray[4]));
                        }
                        break;
                    }

                    var entry = new WriteActivityEntry(
                        type,
                        long.Parse(columnArray[1]),
                        columnArray[3],
                        columnArray[2],
                        value);

                    return(entry);
                }
                catch (Exception e)
                {
                    throw new ArgumentException("Unable to parse the argument", e);
                }
            }
示例#5
0
            public static new WriteActivityEntry FromCsvLine(string csvLine, bool recordOnlyValueLength)
            {
                var columnArray = csvLine.Split(new[] { ',' }).ToList();
                if (columnArray.Count != 5)
                    throw new ArgumentException("invalid csv data - check that you do not have commas in data");

                try
                {
                    var type = GenericUtil.ParseEnum<DebugActionType>(columnArray[0]);

                    if (type == DebugActionType.CreateTree)
                    {
                        var activityEntry = new WriteActivityEntry(
                            type,
                            long.Parse(columnArray[1]),
                            Slice.Empty,
                            columnArray[2],
                            null);
                        return activityEntry;
                    }

                    if (type == DebugActionType.Delete)
                    {
                        var activityEntry = new WriteActivityEntry(
                            type,
                            long.Parse(columnArray[1]),
                            (Slice)columnArray[3],
                            columnArray[2],
                            null);

                        return activityEntry;
                    }

                    var random = new Random();

                    object value;
                    switch (type)
                    {
                        case DebugActionType.Increment:
                            var delta = long.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(columnArray[4])));
                            value = new MemoryStream(EndianBitConverter.Little.GetBytes(delta));
                            break;
                        case DebugActionType.MultiAdd:
                        case DebugActionType.MultiDelete:
                               value = new Slice(Convert.FromBase64String(columnArray[4]));
                            break;
                        default:
                            if (recordOnlyValueLength)
                            {
                                var length = long.Parse(columnArray[4]);
                                var bytes = new byte[length];
                                random.NextBytes(bytes);

                                value = new MemoryStream(bytes);
                            }
                            else
                                value = new MemoryStream(Convert.FromBase64String(columnArray[4]));
                            break;
                    }

                    var entry = new WriteActivityEntry(
                        type,
                        long.Parse(columnArray[1]),
                        (Slice)columnArray[3],
                        columnArray[2],
                        value);

                    return entry;
                }
                catch (Exception e)
                {
                    throw new ArgumentException("Unable to parse the argument", e);
                }
            }
示例#6
0
        private void ReplayWriteAction(WriteActivityEntry activityEntry, ref Transaction tx)
        {
            var tree = tx.ReadTree(activityEntry.TreeName);

            switch (activityEntry.ActionType)
            {
                case DebugActionType.Add:
                    tree.Add(activityEntry.Key, activityEntry.ValueStream);
                    break;
                case DebugActionType.Delete:
                    tree.Delete(activityEntry.Key);
                    break;
                case DebugActionType.MultiAdd:
                    tree.MultiAdd(activityEntry.Key, new Slice(Encoding.UTF8.GetBytes(activityEntry.Value.ToString())));
                    break;
                case DebugActionType.MultiDelete:
                    tree.MultiDelete(activityEntry.Key, new Slice(Encoding.UTF8.GetBytes(activityEntry.Value.ToString())));
                    break;
                case DebugActionType.CreateTree:
                    _env.CreateTree(tx, activityEntry.TreeName);
                    break;
                case DebugActionType.Increment:
                    var buffer = new byte[sizeof(long)];
                    activityEntry.ValueStream.Read(buffer, 0, buffer.Length);
                    var delta = EndianBitConverter.Little.ToInt64(buffer, 0);
                    tree.Increment(activityEntry.Key, delta);
                    break;
                case DebugActionType.AddStruct:
                    tree.Add(activityEntry.Key, activityEntry.ValueStream);
                    break;
                case DebugActionType.RenameTree:
                    _env.RenameTree(tx, activityEntry.TreeName, activityEntry.Key.ToString());
                    break;
                default: //precaution against newly added action types
                    throw new InvalidOperationException("unsupported tree action type: " + activityEntry.ActionType);
            }
        }
示例#7
0
 public void RecordWriteAction(DebugActionType actionType, Transaction tx, Slice key, string treeName, object value)
 {
     if (IsRecording)
     {
         var newAction = new WriteActivityEntry(actionType, tx.Id, key, treeName, value);
         WriteQueue.Enqueue(newAction);
         WriteAndFlush(newAction);
     }
 }