예제 #1
0
 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);
                 }
             }
         }
     }
 }
예제 #2
0
        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);
        }
예제 #3
0
 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
     }
 }
예제 #4
0
        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);
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
 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;
 }
예제 #7
0
 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;
 }
예제 #8
0
 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));
 }