示例#1
0
 public KeyCheckpointFileAsyncEnumerator <TKey, TValue> GetAsyncEnumerator <TKey, TValue>(
     IStateSerializer <TKey> keySerializer,
     string traceType,
     Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
 {
     return(this.KeyCheckpointFile.GetAsyncEnumerator <TKey, TValue>(keySerializer, traceType, priorityHint));
 }
示例#2
0
        private void SetInformationTest(bool isLongPath, Kernel32Types.PRIORITY_HINT priorityHintOne, Kernel32Types.PRIORITY_HINT priorityHintTwo)
        {
            var folderPath = this.testPath;

            if (isLongPath == true)
            {
                folderPath = this.ExtendPath(folderPath);
            }

            var filePath = Path.Combine(folderPath, this.testFileName);

            Assert.IsTrue(!isLongPath || filePath.Length > 260, "file path must be greater than max path size.");

            FabricDirectory.CreateDirectory(folderPath);

            using (FileStream fileStream = FabricFile.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
            {
                var fileHandle = fileStream.SafeFileHandle;

                // Verify that the default is Normal.
                this.VerifyPriorityHint(fileHandle, Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal);

                this.SetPriorityHint(fileHandle, priorityHintOne);
                this.VerifyPriorityHint(fileHandle, priorityHintOne);

                if (priorityHintTwo != Kernel32Types.PRIORITY_HINT.MaximumIoPriorityHintType)
                {
                    this.SetPriorityHint(fileHandle, priorityHintTwo);
                    this.VerifyPriorityHint(fileHandle, priorityHintTwo);
                }
            }
        }
示例#3
0
        /// <summary>
        /// Reserved for private static ValueCheckpointFile.OpenAsync().
        /// </summary>
        private ValueCheckpointFile(string filename, Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
        {
            // Open the file for read with asynchronous flag and 4096 cache size (C# default).
            this.ReaderPool = new StreamPool(
                () => FabricFile.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous | FileOptions.RandomAccess));

            this.priorityHint = priorityHint;
        }
示例#4
0
 /// <summary>
 /// Create a new value checkpoint file with the given filename.
 /// </summary>
 /// <param name="filename">Path to the checkpoint file.</param>
 /// <param name="fileId">File Id of the checkpoint file.</param>
 /// <param name="traceType">trace id</param>
 /// <param name="priorityHint">The priority hint.</param>
 public ValueCheckpointFile(string filename, uint fileId, string traceType, Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
     : this(filename, priorityHint)
 {
     this.traceType  = traceType;
     this.Properties = new ValueCheckpointFileProperties()
     {
         FileId = fileId,
     };
 }
示例#5
0
 public KeyCheckpointFileAsyncEnumerator <TKey, TValue> GetAsyncEnumerator <TKey, TValue>(
     IStateSerializer <TKey> keySerializer,
     string traceType,
     Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
 {
     return(new KeyCheckpointFileAsyncEnumerator <TKey, TValue>(
                this,
                keySerializer,
                this.Properties.KeysHandle.Offset,
                this.Properties.KeysHandle.EndOffset,
                traceType,
                priorityHint));
 }
示例#6
0
        private void SetPriorityHint(SafeFileHandle fileHandle, Kernel32Types.PRIORITY_HINT priorityHint)
        {
            Kernel32Types.FileInformation fileInformation = new Kernel32Types.FileInformation();
            fileInformation.FILE_IO_PRIORITY_HINT_INFO.PriorityHint = priorityHint;

            bool isSet = FabricFile.SetFileInformationByHandle(
                fileHandle,
                Kernel32Types.FILE_INFO_BY_HANDLE_CLASS.FileIoPriorityHintInfo,
                ref fileInformation,
                Marshal.SizeOf(fileInformation.FILE_IO_PRIORITY_HINT_INFO));

            Assert.IsTrue(isSet);
        }
示例#7
0
        /// <summary>
        /// Reserved for private static ValueCheckpointFile.OpenAsync().
        /// </summary>
        private ValueCheckpointFile(string filename, Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
        {
            // Open the file for read with asynchronous flag and 4096 cache size (C# default).

            // Because of the issue at https://github.com/dotnet/corefx/issues/6007
            // where asynchonous reads can internally be synchronous reads with wait calls, we can be
            // bottlenecked by the limited number of I/O completion ports in overlapped I/O
            // causing a lot of blocked threads and extreme slowdown when met with a large number
            // of concurrent reads. Due to this, we chose to disable the FileOptions.Asynchronous option.
            this.ReaderPool = new StreamPool(
                () => FabricFile.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess));

            this.priorityHint = priorityHint;
        }
示例#8
0
        private void VerifyPriorityHint(SafeFileHandle fileHandle, Kernel32Types.PRIORITY_HINT priorityHint)
        {
            NTTypes.IO_STATUS_BLOCK statusBlock = new NTTypes.IO_STATUS_BLOCK();
            NTTypes.FILE_IO_PRIORITY_HINT_INFORMATION ioPriorityHintInfo = new NTTypes.FILE_IO_PRIORITY_HINT_INFORMATION();
            IntPtr ioPriorityHintInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ioPriorityHintInfo));

            IntPtr queryStatus       = FabricFile.NtQueryInformationFile(fileHandle, ref statusBlock, ioPriorityHintInfoPtr, (uint)Marshal.SizeOf(ioPriorityHintInfo), NTTypes.FILE_INFORMATION_CLASS.FileIoPriorityHintInformation);
            bool   isQuerySuccessful = (queryStatus == IntPtr.Zero) && (statusBlock.Status == 0);

            Assert.IsTrue(isQuerySuccessful);

            ioPriorityHintInfo = (NTTypes.FILE_IO_PRIORITY_HINT_INFORMATION)Marshal.PtrToStructure(ioPriorityHintInfoPtr, typeof(NTTypes.FILE_IO_PRIORITY_HINT_INFORMATION));
            Assert.AreEqual <int>((int)ioPriorityHintInfo.PriorityHint, (int)priorityHint);
        }
示例#9
0
        public static void SetIoPriorityHint(SafeFileHandle safeFileHandle, Kernel32Types.PRIORITY_HINT priorityHintInfo)
        {
            Kernel32Types.FileInformation fileInformation = new Kernel32Types.FileInformation();
            fileInformation.FILE_IO_PRIORITY_HINT_INFO.PriorityHint = priorityHintInfo;

            bool isSet = FabricFile.SetFileInformationByHandle(
                safeFileHandle,
                Kernel32Types.FILE_INFO_BY_HANDLE_CLASS.FileIoPriorityHintInfo,
                ref fileInformation,
                Marshal.SizeOf(fileInformation.FILE_IO_PRIORITY_HINT_INFO));

            if (isSet == false)
            {
                int status = Marshal.GetLastWin32Error();
                Assert(false, "SetFileInformationByHandle failed: ErrorCode: {0}", status);
            }
        }
        public KeyCheckpointFileAsyncEnumerator(
            KeyCheckpointFile keyCheckpointFile,
            IStateSerializer <TKey> keySerializer,
            long startOffset,
            long endOffset,
            string traceType,
            Kernel32Types.PRIORITY_HINT priorityHint = Kernel32Types.PRIORITY_HINT.IoPriorityHintNormal)
        {
            this.traceType         = traceType;
            this.keyCheckpointFile = keyCheckpointFile;
            this.stateZero         = true;
            this.index             = -1;
            this.keySerializer     = keySerializer;
            this.startOffset       = startOffset;
            this.endOffset         = endOffset;

            this.priorityHint = priorityHint;
        }
示例#11
0
 public void SetIoPriority(Kernel32Types.PRIORITY_HINT priorityHint)
 {
     this.priorityHint = priorityHint;
 }
示例#12
0
 public void SetValueFileIoPriority(Kernel32Types.PRIORITY_HINT priorityHint)
 {
     this.ValueCheckpointFile.SetIoPriority(priorityHint);
 }
示例#13
0
 private void SetInformationTest(bool isLongPath, Kernel32Types.PRIORITY_HINT priorityHint)
 {
     this.SetInformationTest(isLongPath, priorityHint, Kernel32Types.PRIORITY_HINT.MaximumIoPriorityHintType);
 }