예제 #1
0
파일: Program.cs 프로젝트: zzms/estore
        static void ReadAggIndexTest(ChunkManager chunkManager, int singleFileIndexCount, int dataUnitSize, int indexCountForSingleAgg)
        {
            var queryCount    = 1000;
            var parallelLevel = 4;

            chunkManager.Load(x =>
            {
                var index = new StreamIndex();
                index.ReadFrom(x);
                return(index);
            });

            var waitHandle       = new ManualResetEvent(false);
            var totalExpectCount = parallelLevel * queryCount * indexCountForSingleAgg;
            var totalFoundCount  = 0;
            var watch            = Stopwatch.StartNew();

            for (var i = 0; i < parallelLevel; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    var baseAggNumber = new Random().Next(98000);
                    var foundCount    = ReadIndex(chunkManager, dataUnitSize, singleFileIndexCount, indexCountForSingleAgg, baseAggNumber, queryCount);
                    var currentCount  = Interlocked.Add(ref totalFoundCount, foundCount);
                    if (currentCount == totalExpectCount)
                    {
                        waitHandle.Set();
                    }
                });
            }
            waitHandle.WaitOne();

            Console.WriteLine("Read single chunk success, parallelLevel: {0}, aggCount: {1}, timeSpent: {2}ms", parallelLevel, totalFoundCount / indexCountForSingleAgg, watch.ElapsedMilliseconds);
        }
예제 #2
0
파일: Program.cs 프로젝트: zzms/estore
        static int ReadIndex(ChunkManager chunkManager, int dataUnitSize, int singleFileIndexCount, int eventIndexOfEachAgg, int baseAggNumber, int queryCount)
        {
            var format     = "{0}{1:00000000000000}";
            var aggPrefix  = "aggregate_";
            var foundCount = 0;

            for (var aggNumber = baseAggNumber; aggNumber < (baseAggNumber + queryCount); aggNumber++)
            {
                var position       = aggNumber * eventIndexOfEachAgg * dataUnitSize;
                var chunk          = chunkManager.GetChunkFor(position);
                var expectSourceId = string.Format(format, aggPrefix, aggNumber);
                var indexList      = new List <StreamIndex>();
                var start          = chunk.ChunkHeader.GetLocalDataPosition(position);

                for (var i = start; i < singleFileIndexCount * dataUnitSize; i += dataUnitSize)
                {
                    try
                    {
                        var streamIndex = chunk.TryReadAt(i, x =>
                        {
                            var index = new StreamIndex();
                            index.ReadFrom(x);
                            return(index);
                        }, false);
                        if (streamIndex.SourceId == expectSourceId)
                        {
                            indexList.Add(streamIndex);
                        }
                        else if (indexList.Count > 0)
                        {
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("i: {0}, ex: {1}", i, ex));
                        break;
                    }
                }

                foundCount += indexList.Count;
            }

            return(foundCount);
        }
예제 #3
0
파일: Program.cs 프로젝트: zzms/estore
        static void CreateChunks(string root, string path, ChunkManager chunkManager, int singleFileIndexCount, int dataUnitSize, int totalAggNumber, int indexCountForSingleAgg)
        {
            if (Directory.Exists(root))
            {
                Directory.Delete(root, true);
            }
            Directory.CreateDirectory(root);

            if (Directory.Exists(path))
            {
                Directory.Delete(path, true);
            }
            Directory.CreateDirectory(path);

            var chunkWriter = new ChunkWriter(chunkManager);

            chunkWriter.Open();

            var watch     = Stopwatch.StartNew();
            var format    = "{0}{1:00000000000000}";
            var aggPrefix = "aggregate_";

            for (var i = 0; i < totalAggNumber; i++)
            {
                var sourceId = string.Format(format, aggPrefix, i);
                for (var j = 0; j < indexCountForSingleAgg; j++)
                {
                    var record = new StreamIndex()
                    {
                        SourceId     = sourceId,
                        CommandId    = ObjectId.GenerateNewStringId(),
                        Version      = j + 1,
                        BodyPosition = 10000L
                    };
                    chunkWriter.Write(record);
                }
            }

            chunkWriter.Close();

            Console.WriteLine("Create event index success, aggCount: {0}, totalEventIndexCount: {1}, timeSpent: {2}ms", totalAggNumber, totalAggNumber * indexCountForSingleAgg, watch.ElapsedMilliseconds);
        }
예제 #4
0
        public override string ToString()
        {
            var filterParameters = new StringBuilder(100);

            if (Resource != null)
            {
                FilterUtility.ConcatenateParameter(filterParameters, "filename", Resource.Path);
            }

            if (!string.IsNullOrWhiteSpace(FormatName))
            {
                FilterUtility.ConcatenateParameter(filterParameters, "f", FormatName);
            }

            if (SeekPoint.HasValue)
            {
                FilterUtility.ConcatenateParameter(filterParameters, "sp", SeekPoint.GetValueOrDefault());
            }

            if (!string.IsNullOrWhiteSpace(Streams))
            {
                FilterUtility.ConcatenateParameter(filterParameters, "s", Streams);
            }

            if (StreamIndex.HasValue)
            {
                FilterUtility.ConcatenateParameter(filterParameters, "si", StreamIndex.GetValueOrDefault());
            }

            if (Loop.HasValue)
            {
                FilterUtility.ConcatenateParameter(filterParameters, "loop", Loop.GetValueOrDefault());
            }

            return(FilterUtility.JoinTypeAndParameters(this, filterParameters));
        }
예제 #5
0
 /// <inheritdoc />
 public override int GetHashCode() =>
 PresentationTime.GetHashCode() ^
 StreamIndex.GetHashCode();