private unsafe void BeginMainIndexCheckpoint(
            int version,
            IDevice device,
            out ulong numBytesWritten)
        {
            long totalSize = state[version].size * sizeof(HashBucket);

            int numChunks = 1;

            if (totalSize > uint.MaxValue)
            {
                numChunks = (int)Math.Ceiling((double)totalSize / (long)uint.MaxValue);
                numChunks = (int)Math.Pow(2, Math.Ceiling(Math.Log(numChunks, 2)));
            }

            uint chunkSize = (uint)(totalSize / numChunks);

            mainIndexCheckpointCallbackCount = numChunks;
            mainIndexCheckpointSemaphore     = new SemaphoreSlim(0);
            HashBucket *start = state[version].tableAligned;

            numBytesWritten = 0;
            for (int index = 0; index < numChunks; index++)
            {
                long chunkStartBucket = (long)start + (index * chunkSize);
                HashIndexPageAsyncFlushResult result = default;
                result.chunkIndex = index;
                device.WriteAsync((IntPtr)chunkStartBucket, numBytesWritten, chunkSize, AsyncPageFlushCallback, result);
                numBytesWritten += chunkSize;
            }
        }
Пример #2
0
        private unsafe void BeginMainIndexCheckpoint(
            int version,
            IDevice device,
            out ulong numBytesWritten)
        {
            int  numChunks = 1;
            long totalSize = state[version].size * sizeof(HashBucket);

            Debug.Assert(totalSize < (long)uint.MaxValue); // required since numChunks = 1

            uint chunkSize = (uint)(totalSize / numChunks);

            mainIndexCheckpointCallbackCount = numChunks;
            mainIndexCheckpointSemaphore     = new SemaphoreSlim(0);
            HashBucket *start = state[version].tableAligned;

            numBytesWritten = 0;
            for (int index = 0; index < numChunks; index++)
            {
                long chunkStartBucket = (long)start + (index * chunkSize);
                HashIndexPageAsyncFlushResult result = default;
                result.chunkIndex = index;
                device.WriteAsync((IntPtr)chunkStartBucket, numBytesWritten, chunkSize, AsyncPageFlushCallback, result);
                numBytesWritten += chunkSize;
            }
        }
Пример #3
0
        internal unsafe void BeginMainIndexCheckpoint(int version, IDevice device, out ulong numBytesWritten, bool useReadCache = false, SkipReadCache skipReadCache = default)
        {
            long totalSize = state[version].size * sizeof(HashBucket);

            int numChunks = 1;

            if (useReadCache && (totalSize > (1L << 25)))
            {
                numChunks = (int)Math.Ceiling((double)totalSize / (1L << 25));
                numChunks = (int)Math.Pow(2, Math.Ceiling(Math.Log(numChunks, 2)));
            }
            else if (totalSize > uint.MaxValue)
            {
                numChunks = (int)Math.Ceiling((double)totalSize / (long)uint.MaxValue);
                numChunks = (int)Math.Pow(2, Math.Ceiling(Math.Log(numChunks, 2)));
            }

            uint chunkSize = (uint)(totalSize / numChunks);

            mainIndexCheckpointCallbackCount = numChunks;
            mainIndexCheckpointSemaphore     = new SemaphoreSlim(0);
            HashBucket *start = state[version].tableAligned;

            numBytesWritten = 0;
            for (int index = 0; index < numChunks; index++)
            {
                IntPtr chunkStartBucket = (IntPtr)((byte *)start + (index * chunkSize));
                HashIndexPageAsyncFlushResult result = default;
                result.chunkIndex = index;
                if (!useReadCache)
                {
                    device.WriteAsync(chunkStartBucket, numBytesWritten, chunkSize, AsyncPageFlushCallback, result);
                }
                else
                {
                    result.mem = new SectorAlignedMemory((int)chunkSize, (int)device.SectorSize);
                    bool prot = false;
                    if (!epoch.ThisInstanceProtected())
                    {
                        prot = true;
                        epoch.Resume();
                    }
                    Buffer.MemoryCopy((void *)chunkStartBucket, result.mem.aligned_pointer, chunkSize, chunkSize);
                    for (int j = 0; j < chunkSize; j += sizeof(HashBucket))
                    {
                        skipReadCache((HashBucket *)(result.mem.aligned_pointer + j));
                    }
                    if (prot)
                    {
                        epoch.Suspend();
                    }

                    device.WriteAsync((IntPtr)result.mem.aligned_pointer, numBytesWritten, chunkSize, AsyncPageFlushCallback, result);
                }
                numBytesWritten += chunkSize;
            }
        }
Пример #4
0
        private void BeginMainIndexCheckpoint(
            int version,
            IDevice device,
            out ulong numBytesWritten)
        {
            long totalSize = state[version].size * sizeof(HashBucket);
            int  numChunks = (int)(totalSize >> 23);

            if (numChunks == 0)
            {
                numChunks = 1;
            }

            uint chunkSize = (uint)(totalSize / numChunks);

            mainIndexCheckpointEvent = new CountdownEvent(1);
            HashBucket *start          = state[version].tableAligned;
            int         startNumChunks = 1;

            var sw = new Stopwatch();

            HashIndexPageAsyncFlushResult result = new HashIndexPageAsyncFlushResult
            {
                start       = start,
                numChunks   = numChunks,
                numIssued   = startNumChunks,
                numFinished = 0,
                chunkSize   = chunkSize,
                device      = device,
                sw          = sw
            };

            numBytesWritten = 0;

            sw.Start();
            for (int index = 0; index < startNumChunks; index++)
            {
                long chunkStartBucket = (long)start + (index * chunkSize);
                //sw.Restart();
                device.WriteAsync((IntPtr)chunkStartBucket, ((ulong)index) * chunkSize, chunkSize, AsyncPageFlushCallback, result);
                //sw.Stop();
                //Console.WriteLine("Initial WriteAsync {0}: {1}", index, sw.ElapsedMilliseconds);
            }
            numBytesWritten = ((ulong)numChunks) * chunkSize;
        }
Пример #5
0
        private void BeginMainIndexCheckpoint(
            int version,
            IDevice device,
            out ulong numBytesWritten)
        {
            long totalSize = state[version].size * sizeof(HashBucket);
            int  numChunks = (int)(totalSize >> 23);

            if (numChunks == 0)
            {
                numChunks = 1;
            }

            uint chunkSize = (uint)(totalSize / numChunks);

            mainIndexCheckpointEvent = new CountdownEvent(1);
            HashBucket *start          = state[version].tableAligned;
            int         startNumChunks = 1;

            HashIndexPageAsyncFlushResult result = new HashIndexPageAsyncFlushResult
            {
                start       = start,
                numChunks   = numChunks,
                numIssued   = startNumChunks,
                numFinished = 0,
                chunkSize   = chunkSize,
                device      = device
            };

            numBytesWritten = 0;

            for (int index = 0; index < startNumChunks; index++)
            {
                long chunkStartBucket = (long)start + (index * chunkSize);
                device.WriteAsync((IntPtr)chunkStartBucket, ((ulong)index) * chunkSize, chunkSize, AsyncPageFlushCallback, result);
            }
            numBytesWritten = ((ulong)numChunks) * chunkSize;
        }