{"action":"created","comment":{"url":"https://api.github.com/repos/infinispan/infinispan/pulls/comments/78145349","id":78145349,"diff_hunk":"@@ -39,7 +39,7 @@\n \n    private static final int NUM_NODES = 2;\n \n-   private static final int NUM_OWNERS = 1;\n+   private static final int NUM_OWNERS = 2;","path":"client/hotrod-client/src/test/java/org/infinispan/client/hotrod/event/ClientEventsOOMTest.java","position":5,"original_position":5,"commit_id":"381f61b13c3e9848f807aba359332b269700ddd6","original_commit_id":"381f61b13c3e9848f807aba359332b269700ddd6","user":{"login":"danberindei","id":504907,"avatar_url":"https://avatars.githubusercontent.com/u/504907?v=3","gravatar_id":"","url":"https://api.github.com/users/danberindei","html_url":"https://github.com/danberindei","followers_url":"https://api.github.com/users/danberindei/followers","following_url":"https://api.github.com/users/danberindei/following{/other_user}","gists_url":"https://api.github.com/users/danberindei/gists{/gist_id}","starred_url":"https://api.github.com/users/danberindei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danberindei/subscriptions","organizations_url":"https://api.github.com/users/danberindei/orgs","repos_url":"https://api.github.com/users/danberindei/repos","events_url":"https://api.github.com/users/danberindei/events{/privacy}","received_events_url":"https://api.github.com/users/danberindei/received_events","type":"User","site_admin":false},"body":"Shouldn't we make the cache replicated instead?","created_at":"2016-09-09T08:30:40Z","updated_at":"2016-09-09T08:30:40Z","html_url":"https://github.com/infinispan/infinispan/pull/4530#discussion_r78145349","pull_request_url":"https://api.github.com/repos/infinispan/infinispan/pulls/4530","_links":{"self":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/comments/78145349"},"html":{"href":"https://github.com/infinispan/infinispan/pull/4530#discussion_r78145349"},"pull_request":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/4530"}}},"pull_request":{"url":"https://api.github.com/repos/infinispan/infinispan/pulls/4530","id":82713661,"html_url":"https://github.com/infinispan/infinispan/pull/4530","diff_url":"https://github.com/infinispan/infinispan/pull/4530.diff","patch_url":"https://github.com/infinispan/infinispan/pull/4530.patch","issue_url":"https://api.github.com/repos/infinispan/infinispan/issues/4530","number":4530,"state":"open","locked":false,"title":"Reduce dependency on JBoss Marshalling","user":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"body":"Grab yourself a cup of your favourite drink ☕ and then have a read :)\r\n\r\nThis is a preview of the changes coming at the marshalling layer. Eventually I'll tidy up the commits but here's a summary of the changes so that you can direct your attention to right location.\r\n\r\nThe biggest change of this PR is the switch from a single marshaller based on JBoss Marshalling to two marshallers: internal and external. Internal is the one used for primitive types, common types (String) and Infinispan Externalizers. When internal marhaller can't find how to marshall a type, it delegates the work to the external marshaller, whose default implementation uses JBoss Marshalling. This reduces our dependency on JBoss Marshalling as its only used as last resort for Serializable types for which there are no Infinispan Externalizers, or classes with JBoss Marshalling Externalizers.\r\n\r\nA key aspect of this PR is that I've tried to work within the boundaries of existing interfaces. So there are no interface changes for externalizers nor marshaller. This work has been deferred until we study Will's requirements for off-heap.\r\n\r\nHere are the changes in more detail:\r\n* Internal marshaller provides `ObjectOutput`/`ObjectInput` implementations backed by a simple `byte[]` which gets expanded as needed.\r\n* Encoding itself is currently defined in a separate stateless implementation. This separation between the marshalled state holder and the encoding was done with the idea of trying different encodings, but this separation makes some aspects awkward (e.g. encoding impl having to rely on `ObjectOutput`/`ObjectInput` implementation details). Until we have time to experiment with internal encodings, it might make sense to bring encoding and state into a single `ObjectOutput`/`ObjectInput` implementation.\r\n* Added extra checks to `BaseStoreFunctionalTest.testPreloadStoredAsBinary` so that it verifies the preloaded store-as-binary payloads can be correctly unmarshalled.\r\n* There are two external marshaller implementations, one that uses std Java serialization and the other that uses JBoss Marshalling. I originally started with the former but had some issues (e.g. not being able to marshall instance variables in Serializable classes that are not Serializable but for which externalizers exist; clustered query functionality relies on this). So, I decided to create one based in JBoss Marshalling, which avoids these issues and makes performance more comparable.\r\n* JBoss Marshalling has I/O in mind and it assumes it's the sole owner of the output/input. This means that when it reads, it buffers the input contents until it can't read any more. This had issues with the shared marshalling approach, where the beginning of the `byte[]` could be unmarshalled internally, then delegate to JBMAR, and then follow with the internal marshaller. Because JBMAR's buffering, when JBMAR finished reading, the `byte[]` position would be at the very end, so logic had to be added to be able to rewind back to where JBMAR finished writing bytes. This is the problem that `PositionalBuffer.Input`/`PositionalBuffer.Output` classes resolve in a way that does not add extra state in the `ObjectOutput`/`ObjectInput` implementations.\r\n* Each external marshaller, when writing an object, has an assert that verifies whether the class is about to marshall should be externally marshalled. Since it's an assert, it's only enabled in testing, and this has allowed me to detect types for which we didn't provide advanced externalizers. See list below for those missing externalizers that have been added.\r\n* `CacheRpcCommandExternalizer` has been simplified to avoid wrapping `ObjectInput` in an InputStream. Simply read of the given `ObjectInput`. This class' write path has also been simplified by simply writing to the object output passed in. (@pruivo, you added these changes, so maybe you can explain why you needed this in the first place?).\r\n* For test `CompositeKeyValueFilterConverter`, `ControlledConsistentHashFactory` and `ReplicatedControlledConsistentHashFactory` classes, @SerializeWith annotation was added so that they'd be marshalled with an externalizer. This was added when I was using the external std Java marshaller cos they were Serializable and they referenced classes that can only be marshalled with Externalizers. With the switch to JBoss Marshalling external marshaller this is not needed but makes it easier for the future if trying other external marshallers.\r\n* Deleted `SharedStreammultimarshallertest` since the use case is no longer needed as a result of removing the separation between global and cache marshaller (ISPN-6905).\r\n* Make `TransactionInfo` use `MarshallUtil.marshallArray` to marshall the modification array, making it easier for the internal marshaller to avoid having to support `WriteCommand[]` directly.\r\n* Removed externalizer lifecycle checks. These were added at a time when we were having shutdown issues within the application server. Those issues were resolved and there should not really be a need for such checks any more.\r\n* JBoss Marshalling based external marshaller uses `JBossMarshaller` class which no longer uses the previous externalizer table. Instead the external marshaller plugs a different `ObjectTable` implementation that allows JBoss Marshalling to find externalizers in the internal externalizer table.\r\n* The internal externalizer table is a simplified version of the externalizer table which does not implement `ObjectTable` any more and removed lifecycle checks. On top of that, it identifies the different object type conglomerates which are described in InternalIds class.\r\n* `ExternalizerTable` has been deprecated since it's no longer used for discovering externalizers. However, command factory uses it to find value matcher for lambda externalizers. So, before it can fully removed, there needs to be a way to find the value matcher without having to make the internal externalizer table a component.\r\n\r\nTypes for which missing externalizers have been added:\r\n* `java.util.ArrayDeque`\r\n* `java.util.Collections$EmptyList`\r\n* `java.util.Collections$EmptyMap`\r\n* `java.util.Collections$SingletonMap`\r\n* `java.util.Collections$SingletonSet`\r\n* `java.util.Collections$SynchronizedSet`\r\n* `java.util.Collections$UnmodifiableRandomAccessList`\r\n* `java.util.Collections$UnmodifiableSet`\r\n* `java.util.UUID`\r\n* `java.util.concurrent.ConcurrentHashMap`\r\n* `org.infinispan.commons.equivalence.AnyEquivalence`\r\n* `org.infinispan.commons.equivalence.AnyServerEquivalence`\r\n* `org.infinispan.commons.equivalence.ByteArrayEquivalence`\r\n* `org.infinispan.commons.util.Immutables#ImmutableSetWrapper`\r\n* `org.infinispan.notifications.cachelistener.event.Event.Type`\r\n* `org.infinispan.remoting.MIMECacheEntry`\r\n\r\nTODOS:\r\n* Fully remove `ExternalizerTable`. This is a component no longer in use and it's taking up memory, so it should be removed.\r\n* Next up performance work will be done on this branch. Initial results on a single machine show performance improvement of 5-10% depending on the case, but this needs to be taken with a pinch of salt. More perf tests need to be run. So, next I need to profile it to see which marshalling parts are hot now and see how they can be improved. For example, for those hot externalizers, calling `OO.writeObject()` on something results in a type lookup...etc, so if the externalizer implementation knows exactly the type and which externalizer there is for that type, it could directly call it without without having to go through the externalizer table.\r\n\r\nFinally, assigning to Pedro since he's worked on the marshalling side previously, but anyone is of course welcome to comment.","created_at":"2016-08-25T12:51:16Z","updated_at":"2016-09-09T08:30:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0f8a1f30516162cd328f616b91a7d695a0d46744","assignee":{"login":"pruivo","id":1492066,"avatar_url":"https://avatars.githubusercontent.com/u/1492066?v=3","gravatar_id":"","url":"https://api.github.com/users/pruivo","html_url":"https://github.com/pruivo","followers_url":"https://api.github.com/users/pruivo/followers","following_url":"https://api.github.com/users/pruivo/following{/other_user}","gists_url":"https://api.github.com/users/pruivo/gists{/gist_id}","starred_url":"https://api.github.com/users/pruivo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pruivo/subscriptions","organizations_url":"https://api.github.com/users/pruivo/orgs","repos_url":"https://api.github.com/users/pruivo/repos","events_url":"https://api.github.com/users/pruivo/events{/privacy}","received_events_url":"https://api.github.com/users/pruivo/received_events","type":"User","site_admin":false},"assignees":[{"login":"pruivo","id":1492066,"avatar_url":"https://avatars.githubusercontent.com/u/1492066?v=3","gravatar_id":"","url":"https://api.github.com/users/pruivo","html_url":"https://github.com/pruivo","followers_url":"https://api.github.com/users/pruivo/followers","following_url":"https://api.github.com/users/pruivo/following{/other_user}","gists_url":"https://api.github.com/users/pruivo/gists{/gist_id}","starred_url":"https://api.github.com/users/pruivo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pruivo/subscriptions","organizations_url":"https://api.github.com/users/pruivo/orgs","repos_url":"https://api.github.com/users/pruivo/repos","events_url":"https://api.github.com/users/pruivo/events{/privacy}","received_events_url":"https://api.github.com/users/pruivo/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/infinispan/infinispan/pulls/4530/commits","review_comments_url":"https://api.github.com/repos/infinispan/infinispan/pulls/4530/comments","review_comment_url":"https://api.github.com/repos/infinispan/infinispan/pulls/comments{/number}","comments_url":"https://api.github.com/repos/infinispan/infinispan/issues/4530/comments","statuses_url":"https://api.github.com/repos/infinispan/infinispan/statuses/381f61b13c3e9848f807aba359332b269700ddd6","head":{"label":"galderz:t_6906","ref":"t_6906","sha":"381f61b13c3e9848f807aba359332b269700ddd6","user":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"repo":{"id":1864151,"name":"infinispan","full_name":"galderz/infinispan","owner":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/galderz/infinispan","description":"Infinispan is an open source data grid platform and highly scalable NoSQL cloud data store.","fork":true,"url":"https://api.github.com/repos/galderz/infinispan","forks_url":"https://api.github.com/repos/galderz/infinispan/forks","keys_url":"https://api.github.com/repos/galderz/infinispan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/galderz/infinispan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/galderz/infinispan/teams","hooks_url":"https://api.github.com/repos/galderz/infinispan/hooks","issue_events_url":"https://api.github.com/repos/galderz/infinispan/issues/events{/number}","events_url":"https://api.github.com/repos/galderz/infinispan/events","assignees_url":"https://api.github.com/repos/galderz/infinispan/assignees{/user}","branches_url":"https://api.github.com/repos/galderz/infinispan/branches{/branch}","tags_url":"https://api.github.com/repos/galderz/infinispan/tags","blobs_url":"https://api.github.com/repos/galderz/infinispan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/galderz/infinispan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/galderz/infinispan/git/refs{/sha}","trees_url":"https://api.github.com/repos/galderz/infinispan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/galderz/infinispan/statuses/{sha}","languages_url":"https://api.github.com/repos/galderz/infinispan/languages","stargazers_url":"https://api.github.com/repos/galderz/infinispan/stargazers","contributors_url":"https://api.github.com/repos/galderz/infinispan/contributors","subscribers_url":"https://api.github.com/repos/galderz/infinispan/subscribers","subscription_url":"https://api.github.com/repos/galderz/infinispan/subscription","commits_url":"https://api.github.com/repos/galderz/infinispan/commits{/sha}","git_commits_url":"https://api.github.com/repos/galderz/infinispan/git/commits{/sha}","comments_url":"https://api.github.com/repos/galderz/infinispan/comments{/number}","issue_comment_url":"https://api.github.com/repos/galderz/infinispan/issues/comments{/number}","contents_url":"https://api.github.com/repos/galderz/infinispan/contents/{+path}","compare_url":"https://api.github.com/repos/galderz/infinispan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/galderz/infinispan/merges","archive_url":"https://api.github.com/repos/galderz/infinispan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/galderz/infinispan/downloads","issues_url":"https://api.github.com/repos/galderz/infinispan/issues{/number}","pulls_url":"https://api.github.com/repos/galderz/infinispan/pulls{/number}","milestones_url":"https://api.github.com/repos/galderz/infinispan/milestones{/number}","notifications_url":"https://api.github.com/repos/galderz/infinispan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/galderz/infinispan/labels{/name}","releases_url":"https://api.github.com/repos/galderz/infinispan/releases{/id}","deployments_url":"https://api.github.com/repos/galderz/infinispan/deployments","created_at":"2011-06-08T08:01:30Z","updated_at":"2015-05-05T10:24:25Z","pushed_at":"2016-09-07T06:01:46Z","git_url":"git://github.com/galderz/infinispan.git","ssh_url":"git@github.com:galderz/infinispan.git","clone_url":"https://github.com/galderz/infinispan.git","svn_url":"https://github.com/galderz/infinispan","homepage":"http://www.infinispan.org","size":89279,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"4.0.x"}},"base":{"label":"infinispan:master","ref":"master","sha":"c12e395c10d1767b166183ea018c21bf926cfe93","user":{"login":"infinispan","id":458093,"avatar_url":"https://avatars.githubusercontent.com/u/458093?v=3","gravatar_id":"","url":"https://api.github.com/users/infinispan","html_url":"https://github.com/infinispan","followers_url":"https://api.github.com/users/infinispan/followers","following_url":"https://api.github.com/users/infinispan/following{/other_user}","gists_url":"https://api.github.com/users/infinispan/gists{/gist_id}","starred_url":"https://api.github.com/users/infinispan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infinispan/subscriptions","organizations_url":"https://api.github.com/users/infinispan/orgs","repos_url":"https://api.github.com/users/infinispan/repos","events_url":"https://api.github.com/users/infinispan/events{/privacy}","received_events_url":"https://api.github.com/users/infinispan/received_events","type":"Organization","site_admin":false},"repo":{"id":1050944,"name":"infinispan","full_name":"infinispan/infinispan","owner":{"login":"infinispan","id":458093,"avatar_url":"https://avatars.githubusercontent.com/u/458093?v=3","gravatar_id":"","url":"https://api.github.com/users/infinispan","html_url":"https://github.com/infinispan","followers_url":"https://api.github.com/users/infinispan/followers","following_url":"https://api.github.com/users/infinispan/following{/other_user}","gists_url":"https://api.github.com/users/infinispan/gists{/gist_id}","starred_url":"https://api.github.com/users/infinispan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infinispan/subscriptions","organizations_url":"https://api.github.com/users/infinispan/orgs","repos_url":"https://api.github.com/users/infinispan/repos","events_url":"https://api.github.com/users/infinispan/events{/privacy}","received_events_url":"https://api.github.com/users/infinispan/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/infinispan/infinispan","description":"Infinispan is an open source data grid platform and highly scalable NoSQL cloud data store.","fork":false,"url":"https://api.github.com/repos/infinispan/infinispan","forks_url":"https://api.github.com/repos/infinispan/infinispan/forks","keys_url":"https://api.github.com/repos/infinispan/infinispan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/infinispan/infinispan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/infinispan/infinispan/teams","hooks_url":"https://api.github.com/repos/infinispan/infinispan/hooks","issue_events_url":"https://api.github.com/repos/infinispan/infinispan/issues/events{/number}","events_url":"https://api.github.com/repos/infinispan/infinispan/events","assignees_url":"https://api.github.com/repos/infinispan/infinispan/assignees{/user}","branches_url":"https://api.github.com/repos/infinispan/infinispan/branches{/branch}","tags_url":"https://api.github.com/repos/infinispan/infinispan/tags","blobs_url":"https://api.github.com/repos/infinispan/infinispan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/infinispan/infinispan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/infinispan/infinispan/git/refs{/sha}","trees_url":"https://api.github.com/repos/infinispan/infinispan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/infinispan/infinispan/statuses/{sha}","languages_url":"https://api.github.com/repos/infinispan/infinispan/languages","stargazers_url":"https://api.github.com/repos/infinispan/infinispan/stargazers","contributors_url":"https://api.github.com/repos/infinispan/infinispan/contributors","subscribers_url":"https://api.github.com/repos/infinispan/infinispan/subscribers","subscription_url":"https://api.github.com/repos/infinispan/infinispan/subscription","commits_url":"https://api.github.com/repos/infinispan/infinispan/commits{/sha}","git_commits_url":"https://api.github.com/repos/infinispan/infinispan/git/commits{/sha}","comments_url":"https://api.github.com/repos/infinispan/infinispan/comments{/number}","issue_comment_url":"https://api.github.com/repos/infinispan/infinispan/issues/comments{/number}","contents_url":"https://api.github.com/repos/infinispan/infinispan/contents/{+path}","compare_url":"https://api.github.com/repos/infinispan/infinispan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/infinispan/infinispan/merges","archive_url":"https://api.github.com/repos/infinispan/infinispan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/infinispan/infinispan/downloads","issues_url":"https://api.github.com/repos/infinispan/infinispan/issues{/number}","pulls_url":"https://api.github.com/repos/infinispan/infinispan/pulls{/number}","milestones_url":"https://api.github.com/repos/infinispan/infinispan/milestones{/number}","notifications_url":"https://api.github.com/repos/infinispan/infinispan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/infinispan/infinispan/labels{/name}","releases_url":"https://api.github.com/repos/infinispan/infinispan/releases{/id}","deployments_url":"https://api.github.com/repos/infinispan/infinispan/deployments","created_at":"2010-11-04T12:33:19Z","updated_at":"2016-09-07T03:20:08Z","pushed_at":"2016-09-09T08:18:24Z","git_url":"git://github.com/infinispan/infinispan.git","ssh_url":"git@github.com:infinispan/infinispan.git","clone_url":"https://github.com/infinispan/infinispan.git","svn_url":"https://github.com/infinispan/infinispan","homepage":"http://www.infinispan.org","size":101316,"stargazers_count":492,"watchers_count":492,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":361,"mirror_url":null,"open_issues_count":27,"forks":361,"open_issues":27,"watchers":492,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/4530"},"html":{"href":"https://github.com/infinispan/infinispan/pull/4530"},"issue":{"href":"https://api.github.com/repos/infinispan/infinispan/issues/4530"},"comments":{"href":"https://api.github.com/repos/infinispan/infinispan/issues/4530/comments"},"review_comments":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/4530/comments"},"review_comment":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/4530/commits"},"statuses":{"href":"https://api.github.com/repos/infinispan/infinispan/statuses/381f61b13c3e9848f807aba359332b269700ddd6"}}}}
{"actor":{"display_login":"danberindei"}}