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; } }
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; } }
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; } }
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; }
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; }