private void OnQueuedReadThreadExecute() { try { Trace.TraceInformation("QueuedReadThread started: {0}", m_DatabaseInstanceID); using (var stream = new BufferedStream(new FileStream(m_Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.RandomAccess), 1024 * 1024)) { //int handle; WaitHandle[] handles = new WaitHandle[] { m_Quit, m_Event }; var pagedReader = new PagedStreamReader(stream, 4096); while (WaitHandle.WaitAny(handles) == 1) // (handle = WaitHandle.WaitAny(handles)) == 0) { Thread.Sleep(200); //Wait to consolidate if more requests are coming in. QueuedReadRequest[] requests = null; lock (m_SyncObject) { if (m_Queue.Count > 0) { requests = m_Queue.ToArray(); m_Queue.Clear(); } else { m_Event.Reset(); } } if (requests == null) { continue; } LinkedList <LogRowIndex> indicesList = new LinkedList <LogRowIndex>(); Dictionary <LogRowIndex, List <RequestPoints> > indexToRequestPoints = new Dictionary <LogRowIndex, List <RequestPoints> >(); foreach (var readRequest in requests) { var indices = m_Indexes.GetItemRows(readRequest.ItemID, readRequest.StartIndex, readRequest.Count); var requestPoints = new RequestPoints(readRequest); foreach (var logRowIndex in indices) { if (!indexToRequestPoints.TryGetValue(logRowIndex, out var list)) { list = new List <RequestPoints>(); indexToRequestPoints.Add(logRowIndex, list); } list.Add(requestPoints); } indicesList.AddSorted(indices); } foreach (var logRowIndex in indicesList) { var point = LogRowDataFactory.CreateDataPoint(pagedReader, logRowIndex); var list = indexToRequestPoints[logRowIndex]; foreach (var rp in list) { if (rp.Add(point)) { rp.Send(m_DatabaseInstanceID); } } } foreach (var index in indexToRequestPoints) { index.Value.ForEach(points => points.Send(m_DatabaseInstanceID)); } } } Trace.TraceInformation("QueuedReadThread ended: {0}", m_DatabaseInstanceID); } catch (Exception ex) { m_Log.Fatal(ex.Message, ex); throw; } }
/// <summary> /// Get all rows in an item /// </summary> /// <param name="itemId"></param> /// <returns></returns> private LogRowData[] GetItemRows(string itemId) { LogRowIndex[] indexes = m_LogIndexes.GetItemRows(itemId); return(m_LogDataCache.GetData(indexes).ToArray()); }