public void Insert(ulong transactionId, string resource, out ulong pageId, out byte segmentId, BrightstarProfiler profiler) { using (profiler.Step("ResourceTable.Insert")) { var byteCount = Encoding.UTF8.GetByteCount(resource); var resourceBytes = new byte[byteCount + 4]; BitConverter.GetBytes(byteCount).CopyTo(resourceBytes, 0); Encoding.UTF8.GetBytes(resource, 0, resource.Length, resourceBytes, 4); lock (_writeLock) { if (_nextSegment == _pointerSegment) { StartNewPage(transactionId, profiler); } pageId = _currentPage; segmentId = _nextSegment; for (int i = 0; i < (byteCount + 4); i += _segmentSize) { _pageStore.Write(transactionId, _currentPage, resourceBytes, i, _nextSegment * _segmentSize, _segmentSize < (byteCount + 4 - i) ? _segmentSize : (byteCount + 4 - i), profiler); _nextSegment++; if (_nextSegment == _pointerSegment) { StartNewPage(transactionId, profiler); } } } } }
public ulong Write(IPageStore pageStore, ulong transactionId, BrightstarProfiler profiler) { ulong rootPage = pageStore.Create(); ulong currentPage = rootPage; var buff = new byte[pageStore.PageSize]; int offset = 0; foreach (var graphIndexEntry in _allEntries) { int entrySize = String.IsNullOrEmpty(graphIndexEntry.Uri) ? 1 : 3 + Encoding.UTF8.GetByteCount(graphIndexEntry.Uri); if (offset + entrySize > pageStore.PageSize - 9) { ulong nextPage = pageStore.Create(); buff[offset] = 0xff; BitConverter.GetBytes(nextPage).CopyTo(buff, pageStore.PageSize - 8); pageStore.Write(transactionId, currentPage, buff, profiler: profiler); currentPage = nextPage; offset = 0; } else { if (String.IsNullOrEmpty(graphIndexEntry.Uri)) { // Record an empty entry buff[offset++] = 2; } else { if (graphIndexEntry.IsDeleted) { buff[offset++] = 1; } else { buff[offset++] = 0; } var uriBytes = Encoding.UTF8.GetBytes(graphIndexEntry.Uri); BitConverter.GetBytes(uriBytes.Length).CopyTo(buff, offset); offset += 4; uriBytes.CopyTo(buff, offset); offset += uriBytes.Length; } } } buff[offset] = 0xff; BitConverter.GetBytes(0ul).CopyTo(buff, pageStore.PageSize - 8); pageStore.Write(transactionId, currentPage, buff, profiler: profiler); return(rootPage); }
private void MarkDirty(ulong txnId, INode node, BrightstarProfiler profiler) { using (profiler.Step("MarkDirty")) { if (!node.IsDirty) { //_nodeCache.Remove(node.PageId); _nodeCache.Remove(node); if (!_pageStore.IsWriteable(node.PageId)) { node.PageId = _pageStore.Create(); } node.IsDirty = true; _modifiedNodes[node.PageId] = node; } _pageStore.Write(txnId, node.PageId, node.GetData(), profiler: profiler); //Task.Factory.StartNew(() => _pageStore.Write(txnId, node.PageId, node.GetData(), profiler:null)); // Not passing through the profiler because it is not thread-safe } }
public ulong Write(IPageStore pageStore, ulong transactionId, BrightstarProfiler profiler) { ulong startPageId = pageStore.Create(); ulong currentPageId = startPageId; byte[] currentPage = new byte[pageStore.PageSize]; int offset = 0; foreach (var entry in _shortValueMappings) { byte[] encodedPrefix = Encoding.UTF8.GetBytes(entry.Key); byte[] encodedUri = Encoding.UTF8.GetBytes(entry.Value); int totalLength = encodedUri.Length + encodedPrefix.Length + 4; if (offset + totalLength > (pageStore.PageSize - 10)) { // Not enough room for the entry and the next page pointer // So create a new page for this entry and write a pointer to it // onto the current page ulong nextPage = pageStore.Create(); BitConverter.GetBytes(ushort.MaxValue).CopyTo(currentPage, offset); offset += 2; BitConverter.GetBytes(nextPage).CopyTo(currentPage, offset); pageStore.Write(transactionId, currentPageId, currentPage, profiler: profiler); currentPageId = nextPage; currentPage = new byte[pageStore.PageSize]; offset = 0; } BitConverter.GetBytes((ushort)encodedPrefix.Length).CopyTo(currentPage, offset); offset += 2; encodedPrefix.CopyTo(currentPage, offset); offset += encodedPrefix.Length; BitConverter.GetBytes((ushort)encodedUri.Length).CopyTo(currentPage, offset); offset += 2; encodedUri.CopyTo(currentPage, offset); offset += encodedUri.Length; } // Write the end marker BitConverter.GetBytes(ushort.MaxValue).CopyTo(currentPage, offset); offset += 2; BitConverter.GetBytes(0ul).CopyTo(currentPage, offset); pageStore.Write(transactionId, currentPageId, currentPage, profiler: profiler); return(startPageId); }
private ulong Save(BrightstarProfiler profiler) { using (profiler.Step("Store.Save")) { _resourceTable.Commit(_currentTxnId + 1, profiler); var txnId = _currentTxnId + 1; var graphIndexId = _graphIndex.Save(txnId, profiler); var prefixManagerId = _prefixManager.Save(txnId, profiler); var resourceIndexId = _resourceIndex.Save(txnId, profiler); var subjectRelatedResourceIndexId = _subjectRelatedResourceIndex.Save(txnId, profiler); var objectRelatedResourceIndexId = _objectRelatedResourceIndex.Save(txnId, profiler); var buff = CreateStoreHeader(graphIndexId, prefixManagerId, resourceIndexId, subjectRelatedResourceIndexId, objectRelatedResourceIndexId); var page = _pageStore.Create(); _pageStore.Write(txnId, page, buff, profiler: profiler); _pageStore.Write(txnId, page, buff, 0, 128, profiler: profiler); _pageStore.Commit(txnId, profiler); return(page); } }
public ulong Write(IPageStore pageStore, ulong transactionId, BrightstarProfiler profiler) { ulong rootPage = pageStore.Create(); ulong currentPage = rootPage; var buff = new byte[pageStore.PageSize]; int offset = 0; foreach (var graphIndexEntry in _allEntries) { int entrySize = String.IsNullOrEmpty(graphIndexEntry.Uri) ? 1 : 3 + Encoding.UTF8.GetByteCount(graphIndexEntry.Uri); if (offset + entrySize > pageStore.PageSize - 9) { ulong nextPage = pageStore.Create(); buff[offset] = 0xff; BitConverter.GetBytes(nextPage).CopyTo(buff, pageStore.PageSize - 8); pageStore.Write(transactionId, currentPage, buff, profiler: profiler); currentPage = nextPage; offset = 0; } else { if (String.IsNullOrEmpty(graphIndexEntry.Uri)) { // Record an empty entry buff[offset++] = 2; } else { if (graphIndexEntry.IsDeleted) { buff[offset++] = 1; } else { buff[offset++] = 0; } var uriBytes = Encoding.UTF8.GetBytes(graphIndexEntry.Uri); BitConverter.GetBytes(uriBytes.Length).CopyTo(buff, offset); offset += 4; uriBytes.CopyTo(buff, offset); offset += uriBytes.Length; } } } buff[offset] = 0xff; BitConverter.GetBytes(0ul).CopyTo(buff, pageStore.PageSize - 8); pageStore.Write(transactionId, currentPage, buff, profiler: profiler); return rootPage; }
public ulong Write(IPageStore pageStore, ulong transactionId, BrightstarProfiler profiler) { ulong startPageId = pageStore.Create(); ulong currentPageId = startPageId; byte[] currentPage = new byte[pageStore.PageSize]; int offset = 0; foreach (var entry in _shortValueMappings) { byte[] encodedPrefix = Encoding.UTF8.GetBytes(entry.Key); byte[] encodedUri = Encoding.UTF8.GetBytes(entry.Value); int totalLength = encodedUri.Length + encodedPrefix.Length + 4; if (offset + totalLength > (pageStore.PageSize - 10)) { // Not enough room for the entry and the next page pointer // So create a new page for this entry and write a pointer to it // onto the current page ulong nextPage = pageStore.Create(); BitConverter.GetBytes(ushort.MaxValue).CopyTo(currentPage, offset); offset += 2; BitConverter.GetBytes(nextPage).CopyTo(currentPage, offset); pageStore.Write(transactionId, currentPageId, currentPage, profiler: profiler); currentPageId = nextPage; currentPage = new byte[pageStore.PageSize]; offset = 0; } BitConverter.GetBytes((ushort)encodedPrefix.Length).CopyTo(currentPage, offset); offset += 2; encodedPrefix.CopyTo(currentPage, offset); offset += encodedPrefix.Length; BitConverter.GetBytes((ushort)encodedUri.Length).CopyTo(currentPage, offset); offset += 2; encodedUri.CopyTo(currentPage, offset); offset += encodedUri.Length; } // Write the end marker BitConverter.GetBytes(ushort.MaxValue).CopyTo(currentPage, offset); offset += 2; BitConverter.GetBytes(0ul).CopyTo(currentPage, offset); pageStore.Write(transactionId, currentPageId, currentPage, profiler: profiler); return startPageId; }
private KeyValuePair <byte[], ulong> WriteNode(ulong txnId, LeafNode node, BrightstarProfiler profiler = null) { _pageStore.Write(txnId, node.PageId, node.GetData(), profiler: profiler); return(new KeyValuePair <byte[], ulong>(node.LeftmostKey, node.PageId)); }