{"action":"created","comment":{"url":"https://api.github.com/repos/ravendb/ravendb/pulls/comments/209285864","pull_request_review_id":145274546,"id":209285864,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwOTI4NTg2NA==","diff_hunk":"@@ -0,0 +1,252 @@\n+﻿using System;\n+using System.Collections.Generic;\n+using System.Reflection;\n+using System.Runtime.CompilerServices;\n+using Sparrow.Global;\n+\n+namespace Sparrow\n+{\n+    public interface IFragmentAllocatorOptions : IAllocatorOptions\n+    {\n+        int ReuseBlocksBiggerThan { get; }\n+        int BlockSize { get; }\n+\n+        IAllocatorComposer<Pointer> CreateAllocator();\n+    }\n+\n+    public static class FragmentAllocator\n+    {\n+        public struct Default : IFragmentAllocatorOptions, INativeOptions\n+        {\n+            public bool UseSecureMemory => false;\n+            public bool ElectricFenceEnabled => false;\n+            public bool Zeroed => false;\n+\n+            public int ReuseBlocksBiggerThan => 128 * Constants.Size.Kilobyte;\n+            public int BlockSize => 4 * Constants.Size.Megabyte;\n+\n+            public IAllocatorComposer<Pointer> CreateAllocator()\n+            {\n+                var allocator = new Allocator<NativeAllocator<Default>>();\n+                allocator.Initialize(default(Default));\n+                return allocator;\n+            }\n+        }\n+    }\n+\n+    /// <summary>\n+    /// The FragmentAllocator will hold all the memory it can during the process, he will even reuse fragments when big enough without releasing them to the underlying allocator.\n+    /// </summary>\n+    /// <typeparam name=\"TOptions\">The options to use for the allocator.</typeparam>\n+    /// <remarks>The Options object must be properly implemented to achieve performance improvements. (use constants as much as you can on configuration)</remarks>\n+    public unsafe struct FragmentAllocator<TOptions> : IAllocator<FragmentAllocator<TOptions>, Pointer>\n+        where TOptions : struct, IFragmentAllocatorOptions\n+    {\n+        private TOptions _options;\n+        private IAllocatorComposer<Pointer> _internalAllocator;\n+\n+        // The start of the current arena chunk\n+        private Pointer _currentBuffer;\n+        // The current position over the current arena chunk\n+        private byte* _ptrCurrent;\n+        \n+        // How many bytes has this arena handed out to the customers.\n+        private long _used;\n+\n+        private SortedList<int, Pointer> _internalReadyToUseMemorySegments;\n+    \n+        // Buffers that has been used and cannot be cleaned until a reset happens.\n+        private List<Pointer> _allocatedSegments;\n+\n+        public long TotalAllocated\n+        {\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            get;\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            private set;\n+        }\n+\n+        public long Allocated\n+        {\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            get;\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            private set;\n+        }\n+        public long InUse\n+        {\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            get;\n+            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n+            private set;\n+        }\n+\n+        public void Initialize(ref FragmentAllocator<TOptions> allocator)\n+        {\n+            // Initialize the struct pointers structure used to navigate over the allocated memory.    \n+            allocator._internalReadyToUseMemorySegments = new SortedList<int, Pointer>(new DuplicateKeyComparer<int>());\n+            allocator._allocatedSegments = new List<Pointer>();\n+\n+            allocator.TotalAllocated = 0;\n+            allocator.Allocated = 0;\n+            allocator.InUse = 0;\n+        }\n+\n+        public void Configure<TConfig>(ref FragmentAllocator<TOptions> allocator, ref TConfig configuration) where TConfig : struct, IAllocatorOptions\n+        {\n+            if (!typeof(TOptions).GetTypeInfo().IsAssignableFrom(typeof(TConfig)))\n+                throw new NotSupportedException($\"{nameof(TConfig)} is not compatible with {nameof(TOptions)}\");\n+\n+            // This cast will get evicted by the JIT. \n+            allocator._options = (TOptions)(object)configuration;\n+            allocator._internalAllocator = allocator._options.CreateAllocator();\n+        }\n+\n+        public Pointer Allocate(ref FragmentAllocator<TOptions> allocator, int size)\n+        {\n+            if (size <= allocator._options.BlockSize)\n+            {                \n+                if (allocator._used + size > allocator._currentBuffer.Size || !allocator._currentBuffer.IsValid)\n+                {\n+                    // PERF: This should be considered cold code.\n+                    // TODO: Check the code layout.\n+                    AllocateSegment(ref allocator, size);\n+                }\n+\n+                Pointer ptr = new Pointer(allocator._ptrCurrent, size);\n+                allocator._ptrCurrent += size;\n+                allocator._used += size;\n+                allocator.TotalAllocated += size;\n+                allocator.InUse += size;\n+\n+                return ptr;\n+            }\n+\n+            // The allocation is too big to fit, the memory will be used afterwards as a segment when released.\n+            // PERF: For this kind of allocations we dont care if we hit cold code.\n+            Pointer segment = allocator._internalAllocator.Allocate(size);\n+            allocator._used += segment.Size;\n+            allocator.TotalAllocated += segment.Size;\n+            allocator.InUse += segment.Size;\n+\n+            allocator._allocatedSegments.Add(segment);\n+            return segment;\n+        }\n+\n+        /// <summary>\n+        /// Comparer for comparing two keys, handling equality as beeing greater\n+        /// Use this Comparer e.g. with SortedLists or SortedDictionaries, that don't allow duplicate keys\n+        /// </summary>\n+        /// <typeparam name=\"TKey\"></typeparam>\n+        public class DuplicateKeyComparer<TKey> : IComparer<TKey> where TKey : IComparable\n+        {\n+            public int Compare(TKey x, TKey y)\n+            {\n+                int result = x.CompareTo(y);\n+\n+                if (result == 0)\n+                    return 1;   // Handle equality as beeing greater\n+               return result;\n+            }\n+        }\n+\n+        private void AllocateSegment(ref FragmentAllocator<TOptions> allocator, int size)\n+        {\n+            int bytesLeft = (int)(allocator._currentBuffer.Size - allocator._used);\n+            if (bytesLeft > allocator._options.ReuseBlocksBiggerThan)\n+            {\n+                // The allocation is bigger than ReuseBlocksBiggerThan and therefore we can leave this one available to be used later.\n+                allocator._internalReadyToUseMemorySegments.Add(bytesLeft, new Pointer(allocator._ptrCurrent, bytesLeft));\n+            }\n+\n+            // TODO: Time the impact of using a heap structure instead of a SortedList.\n+            // Get the biggest segment on the Heap and if size < the biggest one, we avoid the allocation.\n+            Pointer segment;\n+            if (allocator._internalReadyToUseMemorySegments.Count > 0 && allocator._internalReadyToUseMemorySegments.Values[0].Size >= size)","path":"src/Sparrow/Allocators.Fragment.cs","position":165,"original_position":165,"commit_id":"27dae2c474bded53d6ba4058cc9245717ca75750","original_commit_id":"27dae2c474bded53d6ba4058cc9245717ca75750","user":{"login":"redknightlois","id":1045411,"node_id":"MDQ6VXNlcjEwNDU0MTE=","avatar_url":"https://avatars1.githubusercontent.com/u/1045411?v=4","gravatar_id":"","url":"https://api.github.com/users/redknightlois","html_url":"https://github.com/redknightlois","followers_url":"https://api.github.com/users/redknightlois/followers","following_url":"https://api.github.com/users/redknightlois/following{/other_user}","gists_url":"https://api.github.com/users/redknightlois/gists{/gist_id}","starred_url":"https://api.github.com/users/redknightlois/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redknightlois/subscriptions","organizations_url":"https://api.github.com/users/redknightlois/orgs","repos_url":"https://api.github.com/users/redknightlois/repos","events_url":"https://api.github.com/users/redknightlois/events{/privacy}","received_events_url":"https://api.github.com/users/redknightlois/received_events","type":"User","site_admin":false},"body":"That's right. Also reflected that there is no test yet that stresses that condition because there was another bug there too. \r\n","created_at":"2018-08-10T14:51:24Z","updated_at":"2018-08-10T14:51:24Z","html_url":"https://github.com/ravendb/ravendb/pull/7310#discussion_r209285864","pull_request_url":"https://api.github.com/repos/ravendb/ravendb/pulls/7310","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/comments/209285864"},"html":{"href":"https://github.com/ravendb/ravendb/pull/7310#discussion_r209285864"},"pull_request":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/7310"}},"in_reply_to_id":209171753},"pull_request":{"url":"https://api.github.com/repos/ravendb/ravendb/pulls/7310","id":207461556,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA3NDYxNTU2","html_url":"https://github.com/ravendb/ravendb/pull/7310","diff_url":"https://github.com/ravendb/ravendb/pull/7310.diff","patch_url":"https://github.com/ravendb/ravendb/pull/7310.patch","issue_url":"https://api.github.com/repos/ravendb/ravendb/issues/7310","number":7310,"state":"open","locked":false,"title":"[DO-NOT-MERGE] For review only: Generalized Allocators","user":{"login":"redknightlois","id":1045411,"node_id":"MDQ6VXNlcjEwNDU0MTE=","avatar_url":"https://avatars1.githubusercontent.com/u/1045411?v=4","gravatar_id":"","url":"https://api.github.com/users/redknightlois","html_url":"https://github.com/redknightlois","followers_url":"https://api.github.com/users/redknightlois/followers","following_url":"https://api.github.com/users/redknightlois/following{/other_user}","gists_url":"https://api.github.com/users/redknightlois/gists{/gist_id}","starred_url":"https://api.github.com/users/redknightlois/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redknightlois/subscriptions","organizations_url":"https://api.github.com/users/redknightlois/orgs","repos_url":"https://api.github.com/users/redknightlois/repos","events_url":"https://api.github.com/users/redknightlois/events{/privacy}","received_events_url":"https://api.github.com/users/redknightlois/received_events","type":"User","site_admin":false},"body":"This is the first working implementation of Generalized Allocators, includes stress testing facilities, crude leaks detection, ByteString implementation using the new allocators, Spanified Memory Access, Spanified Pointer Types...\r\n\r\nBecause this is going to be the foundation of memory management at Voron and in some fashion the POC for spanification of the core we must get this right from day 1. Please take your time to review, and anything that crosses your mind even if you think it could be a dumb comment, do it anyway :) ... \r\n\r\nAll release FastTests work, Debug fails because of memory leaks detected by the allocators. Many things missing.\r\n\r\nCopy for review anyone you think it should take a look into this. cc @ayende, @arekpalinski, @ppekrol.\r\n\r\nPS: I left the history in case anyone wants to look into the design history. If you think it is better to collapse the history, let me know and I will squash it. ","created_at":"2018-08-09T22:29:50Z","updated_at":"2018-08-10T14:51:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ravendb/ravendb/pulls/7310/commits","review_comments_url":"https://api.github.com/repos/ravendb/ravendb/pulls/7310/comments","review_comment_url":"https://api.github.com/repos/ravendb/ravendb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ravendb/ravendb/issues/7310/comments","statuses_url":"https://api.github.com/repos/ravendb/ravendb/statuses/27dae2c474bded53d6ba4058cc9245717ca75750","head":{"label":"Corvalius:allocators","ref":"allocators","sha":"27dae2c474bded53d6ba4058cc9245717ca75750","user":{"login":"Corvalius","id":1424411,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MjQ0MTE=","avatar_url":"https://avatars3.githubusercontent.com/u/1424411?v=4","gravatar_id":"","url":"https://api.github.com/users/Corvalius","html_url":"https://github.com/Corvalius","followers_url":"https://api.github.com/users/Corvalius/followers","following_url":"https://api.github.com/users/Corvalius/following{/other_user}","gists_url":"https://api.github.com/users/Corvalius/gists{/gist_id}","starred_url":"https://api.github.com/users/Corvalius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Corvalius/subscriptions","organizations_url":"https://api.github.com/users/Corvalius/orgs","repos_url":"https://api.github.com/users/Corvalius/repos","events_url":"https://api.github.com/users/Corvalius/events{/privacy}","received_events_url":"https://api.github.com/users/Corvalius/received_events","type":"Organization","site_admin":false},"repo":{"id":18448801,"node_id":"MDEwOlJlcG9zaXRvcnkxODQ0ODgwMQ==","name":"ravendb","full_name":"Corvalius/ravendb","owner":{"login":"Corvalius","id":1424411,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MjQ0MTE=","avatar_url":"https://avatars3.githubusercontent.com/u/1424411?v=4","gravatar_id":"","url":"https://api.github.com/users/Corvalius","html_url":"https://github.com/Corvalius","followers_url":"https://api.github.com/users/Corvalius/followers","following_url":"https://api.github.com/users/Corvalius/following{/other_user}","gists_url":"https://api.github.com/users/Corvalius/gists{/gist_id}","starred_url":"https://api.github.com/users/Corvalius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Corvalius/subscriptions","organizations_url":"https://api.github.com/users/Corvalius/orgs","repos_url":"https://api.github.com/users/Corvalius/repos","events_url":"https://api.github.com/users/Corvalius/events{/privacy}","received_events_url":"https://api.github.com/users/Corvalius/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Corvalius/ravendb","description":"A linq enabled document database for .NET","fork":true,"url":"https://api.github.com/repos/Corvalius/ravendb","forks_url":"https://api.github.com/repos/Corvalius/ravendb/forks","keys_url":"https://api.github.com/repos/Corvalius/ravendb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Corvalius/ravendb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Corvalius/ravendb/teams","hooks_url":"https://api.github.com/repos/Corvalius/ravendb/hooks","issue_events_url":"https://api.github.com/repos/Corvalius/ravendb/issues/events{/number}","events_url":"https://api.github.com/repos/Corvalius/ravendb/events","assignees_url":"https://api.github.com/repos/Corvalius/ravendb/assignees{/user}","branches_url":"https://api.github.com/repos/Corvalius/ravendb/branches{/branch}","tags_url":"https://api.github.com/repos/Corvalius/ravendb/tags","blobs_url":"https://api.github.com/repos/Corvalius/ravendb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Corvalius/ravendb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Corvalius/ravendb/git/refs{/sha}","trees_url":"https://api.github.com/repos/Corvalius/ravendb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Corvalius/ravendb/statuses/{sha}","languages_url":"https://api.github.com/repos/Corvalius/ravendb/languages","stargazers_url":"https://api.github.com/repos/Corvalius/ravendb/stargazers","contributors_url":"https://api.github.com/repos/Corvalius/ravendb/contributors","subscribers_url":"https://api.github.com/repos/Corvalius/ravendb/subscribers","subscription_url":"https://api.github.com/repos/Corvalius/ravendb/subscription","commits_url":"https://api.github.com/repos/Corvalius/ravendb/commits{/sha}","git_commits_url":"https://api.github.com/repos/Corvalius/ravendb/git/commits{/sha}","comments_url":"https://api.github.com/repos/Corvalius/ravendb/comments{/number}","issue_comment_url":"https://api.github.com/repos/Corvalius/ravendb/issues/comments{/number}","contents_url":"https://api.github.com/repos/Corvalius/ravendb/contents/{+path}","compare_url":"https://api.github.com/repos/Corvalius/ravendb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Corvalius/ravendb/merges","archive_url":"https://api.github.com/repos/Corvalius/ravendb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Corvalius/ravendb/downloads","issues_url":"https://api.github.com/repos/Corvalius/ravendb/issues{/number}","pulls_url":"https://api.github.com/repos/Corvalius/ravendb/pulls{/number}","milestones_url":"https://api.github.com/repos/Corvalius/ravendb/milestones{/number}","notifications_url":"https://api.github.com/repos/Corvalius/ravendb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Corvalius/ravendb/labels{/name}","releases_url":"https://api.github.com/repos/Corvalius/ravendb/releases{/id}","deployments_url":"https://api.github.com/repos/Corvalius/ravendb/deployments","created_at":"2014-04-04T18:48:26Z","updated_at":"2017-07-14T13:21:49Z","pushed_at":"2018-08-09T22:21:50Z","git_url":"git://github.com/Corvalius/ravendb.git","ssh_url":"git@github.com:Corvalius/ravendb.git","clone_url":"https://github.com/Corvalius/ravendb.git","svn_url":"https://github.com/Corvalius/ravendb","homepage":"http://ayende.com/Blog/","size":447860,"stargazers_count":2,"watchers_count":2,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"ravendb:v4.1","ref":"v4.1","sha":"c17b23ae0352ac1cd84f388343237080dd97c576","user":{"login":"ravendb","id":213792,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxMzc5Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/213792?v=4","gravatar_id":"","url":"https://api.github.com/users/ravendb","html_url":"https://github.com/ravendb","followers_url":"https://api.github.com/users/ravendb/followers","following_url":"https://api.github.com/users/ravendb/following{/other_user}","gists_url":"https://api.github.com/users/ravendb/gists{/gist_id}","starred_url":"https://api.github.com/users/ravendb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ravendb/subscriptions","organizations_url":"https://api.github.com/users/ravendb/orgs","repos_url":"https://api.github.com/users/ravendb/repos","events_url":"https://api.github.com/users/ravendb/events{/privacy}","received_events_url":"https://api.github.com/users/ravendb/received_events","type":"Organization","site_admin":false},"repo":{"id":542714,"node_id":"MDEwOlJlcG9zaXRvcnk1NDI3MTQ=","name":"ravendb","full_name":"ravendb/ravendb","owner":{"login":"ravendb","id":213792,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxMzc5Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/213792?v=4","gravatar_id":"","url":"https://api.github.com/users/ravendb","html_url":"https://github.com/ravendb","followers_url":"https://api.github.com/users/ravendb/followers","following_url":"https://api.github.com/users/ravendb/following{/other_user}","gists_url":"https://api.github.com/users/ravendb/gists{/gist_id}","starred_url":"https://api.github.com/users/ravendb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ravendb/subscriptions","organizations_url":"https://api.github.com/users/ravendb/orgs","repos_url":"https://api.github.com/users/ravendb/repos","events_url":"https://api.github.com/users/ravendb/events{/privacy}","received_events_url":"https://api.github.com/users/ravendb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ravendb/ravendb","description":"ACID Document Database","fork":false,"url":"https://api.github.com/repos/ravendb/ravendb","forks_url":"https://api.github.com/repos/ravendb/ravendb/forks","keys_url":"https://api.github.com/repos/ravendb/ravendb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ravendb/ravendb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ravendb/ravendb/teams","hooks_url":"https://api.github.com/repos/ravendb/ravendb/hooks","issue_events_url":"https://api.github.com/repos/ravendb/ravendb/issues/events{/number}","events_url":"https://api.github.com/repos/ravendb/ravendb/events","assignees_url":"https://api.github.com/repos/ravendb/ravendb/assignees{/user}","branches_url":"https://api.github.com/repos/ravendb/ravendb/branches{/branch}","tags_url":"https://api.github.com/repos/ravendb/ravendb/tags","blobs_url":"https://api.github.com/repos/ravendb/ravendb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ravendb/ravendb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ravendb/ravendb/git/refs{/sha}","trees_url":"https://api.github.com/repos/ravendb/ravendb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ravendb/ravendb/statuses/{sha}","languages_url":"https://api.github.com/repos/ravendb/ravendb/languages","stargazers_url":"https://api.github.com/repos/ravendb/ravendb/stargazers","contributors_url":"https://api.github.com/repos/ravendb/ravendb/contributors","subscribers_url":"https://api.github.com/repos/ravendb/ravendb/subscribers","subscription_url":"https://api.github.com/repos/ravendb/ravendb/subscription","commits_url":"https://api.github.com/repos/ravendb/ravendb/commits{/sha}","git_commits_url":"https://api.github.com/repos/ravendb/ravendb/git/commits{/sha}","comments_url":"https://api.github.com/repos/ravendb/ravendb/comments{/number}","issue_comment_url":"https://api.github.com/repos/ravendb/ravendb/issues/comments{/number}","contents_url":"https://api.github.com/repos/ravendb/ravendb/contents/{+path}","compare_url":"https://api.github.com/repos/ravendb/ravendb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ravendb/ravendb/merges","archive_url":"https://api.github.com/repos/ravendb/ravendb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ravendb/ravendb/downloads","issues_url":"https://api.github.com/repos/ravendb/ravendb/issues{/number}","pulls_url":"https://api.github.com/repos/ravendb/ravendb/pulls{/number}","milestones_url":"https://api.github.com/repos/ravendb/ravendb/milestones{/number}","notifications_url":"https://api.github.com/repos/ravendb/ravendb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ravendb/ravendb/labels{/name}","releases_url":"https://api.github.com/repos/ravendb/ravendb/releases{/id}","deployments_url":"https://api.github.com/repos/ravendb/ravendb/deployments","created_at":"2010-03-02T11:05:30Z","updated_at":"2018-08-10T12:16:20Z","pushed_at":"2018-08-10T12:16:17Z","git_url":"git://github.com/ravendb/ravendb.git","ssh_url":"git@github.com:ravendb/ravendb.git","clone_url":"https://github.com/ravendb/ravendb.git","svn_url":"https://github.com/ravendb/ravendb","homepage":"https://ravendb.net","size":446869,"stargazers_count":1982,"watchers_count":1982,"language":"C#","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":689,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":689,"open_issues":8,"watchers":1982,"default_branch":"v4.1"}},"_links":{"self":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/7310"},"html":{"href":"https://github.com/ravendb/ravendb/pull/7310"},"issue":{"href":"https://api.github.com/repos/ravendb/ravendb/issues/7310"},"comments":{"href":"https://api.github.com/repos/ravendb/ravendb/issues/7310/comments"},"review_comments":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/7310/comments"},"review_comment":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ravendb/ravendb/pulls/7310/commits"},"statuses":{"href":"https://api.github.com/repos/ravendb/ravendb/statuses/27dae2c474bded53d6ba4058cc9245717ca75750"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"redknightlois"}}