{"action":"created","comment":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/85267281","pull_request_review_id":5990902,"id":85267281,"diff_hunk":"@@ -0,0 +1,235 @@\n+/*\n+ * Licensed to Elasticsearch under one or more contributor\n+ * license agreements. See the NOTICE file distributed with\n+ * this work for additional information regarding copyright\n+ * ownership. Elasticsearch licenses this file to you under\n+ * the Apache License, Version 2.0 (the \"License\"); you may\n+ * not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *    http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied.  See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+\n+package org.elasticsearch.cluster.routing.allocation;\n+\n+import org.elasticsearch.action.support.replication.ClusterStateCreationUtils;\n+import org.elasticsearch.cluster.ClusterInfo;\n+import org.elasticsearch.cluster.ClusterState;\n+import org.elasticsearch.cluster.ESAllocationTestCase;\n+import org.elasticsearch.cluster.node.DiscoveryNodes;\n+import org.elasticsearch.cluster.routing.RoutingNode;\n+import org.elasticsearch.cluster.routing.RoutingNodes;\n+import org.elasticsearch.cluster.routing.ShardRouting;\n+import org.elasticsearch.cluster.routing.ShardRoutingState;\n+import org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator;\n+import org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator.Balancer;\n+import org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator.RebalanceDecision;\n+import org.elasticsearch.cluster.routing.allocation.decider.AllocationDecider;\n+import org.elasticsearch.cluster.routing.allocation.decider.AllocationDeciders;\n+import org.elasticsearch.cluster.routing.allocation.decider.Decision;\n+import org.elasticsearch.cluster.routing.allocation.decider.Decision.Type;\n+import org.elasticsearch.common.collect.Tuple;\n+import org.elasticsearch.common.settings.Settings;\n+import org.hamcrest.Matchers;\n+\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.List;\n+\n+/**\n+ * Tests for balancing a single shard, see {@link Balancer#decideRebalance(ShardRouting)}.\n+ */\n+public class BalancedSingleShardTests extends ESAllocationTestCase {\n+\n+    public void testRebalanceNonStartedShardNotAllowed() {\n+        BalancedShardsAllocator allocator = new BalancedShardsAllocator(Settings.EMPTY);\n+        ClusterState clusterState = ClusterStateCreationUtils.state(\"idx\", randomBoolean(),\n+            randomFrom(ShardRoutingState.INITIALIZING, ShardRoutingState.UNASSIGNED, ShardRoutingState.RELOCATING));\n+        ShardRouting shard = clusterState.routingTable().index(\"idx\").shard(0).primaryShard();\n+        RebalanceDecision rebalanceDecision = allocator.decideRebalance(shard, newRoutingAllocation(\n+            new AllocationDeciders(Settings.EMPTY, Collections.emptyList()), clusterState));\n+        assertSame(RebalanceDecision.NOT_TAKEN, rebalanceDecision);\n+    }\n+\n+    public void testRebalanceNotAllowedDuringPendingAsyncFetch() {\n+        BalancedShardsAllocator allocator = new BalancedShardsAllocator(Settings.EMPTY);\n+        ClusterState clusterState = ClusterStateCreationUtils.state(\"idx\", randomBoolean(), ShardRoutingState.STARTED);\n+        ShardRouting shard = clusterState.routingTable().index(\"idx\").shard(0).primaryShard();\n+        RoutingAllocation routingAllocation = newRoutingAllocation(\n+            new AllocationDeciders(Settings.EMPTY, Collections.emptyList()), clusterState);\n+        routingAllocation.setHasPendingAsyncFetch();\n+        RebalanceDecision rebalanceDecision = allocator.decideRebalance(shard, routingAllocation);\n+        assertNotNull(rebalanceDecision.getCanRebalanceDecision());\n+        assertEquals(Type.NO, rebalanceDecision.getFinalDecisionType());\n+        assertThat(rebalanceDecision.getFinalExplanation(), Matchers.startsWith(\"cannot rebalance due to in-flight shard store fetches\"));\n+        assertNull(rebalanceDecision.getNodeDecisions());\n+        assertNull(rebalanceDecision.getAssignedNodeId());\n+\n+        assertAssignedNodeRemainsSame(allocator, routingAllocation, shard);\n+    }\n+\n+    public void testRebalancingNotAllowedDueToCanRebalance() {\n+        AllocationDecider noRebalanceDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canRebalance(ShardRouting shardRouting, RoutingAllocation allocation) {\n+                return allocation.decision(randomFrom(Decision.NO, Decision.THROTTLE), \"TEST\", \"foobar\");\n+            }\n+        };\n+        BalancedShardsAllocator allocator = new BalancedShardsAllocator(Settings.EMPTY);\n+        ClusterState clusterState = ClusterStateCreationUtils.state(\"idx\", randomBoolean(), ShardRoutingState.STARTED);\n+        ShardRouting shard = clusterState.routingTable().index(\"idx\").shard(0).primaryShard();\n+        RoutingAllocation routingAllocation =  newRoutingAllocation(\n+            new AllocationDeciders(Settings.EMPTY, Collections.singleton(noRebalanceDecider)), clusterState);\n+        RebalanceDecision rebalanceDecision = allocator.decideRebalance(shard, routingAllocation);\n+        assertNotEquals(Type.YES, rebalanceDecision.getCanRebalanceDecision().type());\n+        assertEquals(Type.NO, rebalanceDecision.getFinalDecisionType());\n+        assertEquals(\"foobar\", rebalanceDecision.getFinalExplanation());\n+        assertNull(rebalanceDecision.getNodeDecisions());\n+        assertNull(rebalanceDecision.getAssignedNodeId());\n+\n+        assertAssignedNodeRemainsSame(allocator, routingAllocation, shard);\n+    }\n+\n+    public void testRebalancePossible() {\n+        AllocationDecider canAllocateDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {\n+                return Decision.YES;\n+            }\n+        };\n+        Tuple<ClusterState, RebalanceDecision> rebalance = setupStateAndRebalance(canAllocateDecider, Settings.EMPTY, true);\n+        ClusterState clusterState = rebalance.v1();\n+        RebalanceDecision rebalanceDecision = rebalance.v2();\n+        assertEquals(Type.YES, rebalanceDecision.getCanRebalanceDecision().type());\n+        assertEquals(Type.YES, rebalanceDecision.getFinalDecisionType());\n+        assertNotNull(rebalanceDecision.getFinalExplanation());\n+        assertEquals(clusterState.nodes().getSize() - 1, rebalanceDecision.getNodeDecisions().size());\n+        assertNotNull(rebalanceDecision.getAssignedNodeId());\n+    }\n+\n+    public void testRebalancingNotAllowedDueToCanAllocate() {\n+        AllocationDecider canAllocateDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {\n+                return Decision.NO;\n+            }\n+        };\n+        Tuple<ClusterState, RebalanceDecision> rebalance = setupStateAndRebalance(canAllocateDecider, Settings.EMPTY, false);\n+        ClusterState clusterState = rebalance.v1();\n+        RebalanceDecision rebalanceDecision = rebalance.v2();\n+        assertEquals(Type.YES, rebalanceDecision.getCanRebalanceDecision().type());\n+        assertEquals(Type.NO, rebalanceDecision.getFinalDecisionType());\n+        assertNotNull(rebalanceDecision.getFinalExplanation());\n+        assertEquals(clusterState.nodes().getSize() - 1, rebalanceDecision.getNodeDecisions().size());\n+        assertNull(rebalanceDecision.getAssignedNodeId());\n+    }\n+\n+    public void testDontBalanceShardWhenThresholdNotMet() {\n+        AllocationDecider canAllocateDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {\n+                return Decision.YES;\n+            }\n+        };\n+        // ridiculously high threshold setting so we won't rebalance\n+        Settings balancerSettings = Settings.builder().put(BalancedShardsAllocator.THRESHOLD_SETTING.getKey(), 1000f).build();\n+        Tuple<ClusterState, RebalanceDecision> rebalance = setupStateAndRebalance(canAllocateDecider, balancerSettings, false);\n+        ClusterState clusterState = rebalance.v1();\n+        RebalanceDecision rebalanceDecision = rebalance.v2();\n+        assertEquals(Type.YES, rebalanceDecision.getCanRebalanceDecision().type());\n+        assertEquals(Type.NO, rebalanceDecision.getFinalDecisionType());\n+        assertNotNull(rebalanceDecision.getFinalExplanation());\n+        assertEquals(clusterState.nodes().getSize() - 1, rebalanceDecision.getNodeDecisions().size());\n+        assertNull(rebalanceDecision.getAssignedNodeId());\n+    }\n+\n+    public void testSingleShardBalanceProducesSameResultsAsBalanceStep() {\n+        AllocationDecider allocationDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {\n+                return Decision.YES;\n+            }\n+        };\n+        AllocationDecider rebalanceDecider = new AllocationDecider(Settings.EMPTY) {\n+            @Override\n+            public Decision canRebalance(ShardRouting shardRouting, RoutingAllocation allocation) {\n+                return Decision.YES;\n+            }\n+        };\n+        List<AllocationDecider> allocationDeciders = Arrays.asList(rebalanceDecider, allocationDecider);\n+        final String[] indices = { \"idx1\", \"idx2\", \"idx3\" };\n+        BalancedShardsAllocator allocator = new BalancedShardsAllocator(Settings.EMPTY);\n+        // create a cluster state with 3 indices, each with 1 started primary shard, and only\n+        // one node initially so all 3 primary shards get allocated to the same shard\n+        ClusterState clusterState = ClusterStateCreationUtils.state(1, indices, 1);\n+        // add a new node so one of the primaries can be rebalanced there\n+        DiscoveryNodes.Builder nodesBuilder = DiscoveryNodes.builder(clusterState.nodes());\n+        nodesBuilder.add(newNode(randomAsciiOfLength(7)));\n+        clusterState = ClusterState.builder(clusterState).nodes(nodesBuilder).build();\n+        RoutingAllocation routingAllocation = newRoutingAllocation(\n+            new AllocationDeciders(Settings.EMPTY, allocationDeciders), clusterState);\n+        // allocate and get the node that is now relocating\n+        allocator.allocate(routingAllocation);\n+        ShardRouting shardToRebalance = null;\n+        for (RoutingNode routingNode : routingAllocation.routingNodes()) {\n+            List<ShardRouting> relocatingShards = routingNode.shardsWithState(ShardRoutingState.RELOCATING);\n+            if (relocatingShards.size() == 1) {\n+                shardToRebalance = relocatingShards.get(0);\n+                break;\n+            }\n+        }\n+\n+        routingAllocation = newRoutingAllocation(new AllocationDeciders(Settings.EMPTY, allocationDeciders), clusterState);\n+        ShardRouting shard = clusterState.getRoutingNodes().activePrimary(shardToRebalance.shardId());\n+        RebalanceDecision rebalanceDecision = allocator.decideRebalance(shard, routingAllocation);\n+        assertEquals(shardToRebalance.relocatingNodeId(), rebalanceDecision.getAssignedNodeId());","path":"core/src/test/java/org/elasticsearch/cluster/routing/allocation/BalancedSingleShardTests.java","position":192,"original_position":192,"commit_id":"04d79593ca13cb8a3f578520328bb18304c1ee5d","original_commit_id":"04d79593ca13cb8a3f578520328bb18304c1ee5d","user":{"login":"dakrone","id":19060,"avatar_url":"https://avatars.githubusercontent.com/u/19060?v=3","gravatar_id":"","url":"https://api.github.com/users/dakrone","html_url":"https://github.com/dakrone","followers_url":"https://api.github.com/users/dakrone/followers","following_url":"https://api.github.com/users/dakrone/following{/other_user}","gists_url":"https://api.github.com/users/dakrone/gists{/gist_id}","starred_url":"https://api.github.com/users/dakrone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dakrone/subscriptions","organizations_url":"https://api.github.com/users/dakrone/orgs","repos_url":"https://api.github.com/users/dakrone/repos","events_url":"https://api.github.com/users/dakrone/events{/privacy}","received_events_url":"https://api.github.com/users/dakrone/received_events","type":"User","site_admin":false},"body":"Since this adds a single node, won't the decision for where to rebalance the shard always be the same? Should the test have multiple nodes so it can ensure it's not just because it's the only node that it can go to?","created_at":"2016-10-27T05:17:43Z","updated_at":"2016-10-27T05:18:09Z","html_url":"https://github.com/elastic/elasticsearch/pull/21103#discussion_r85267281","pull_request_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103","_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/85267281"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/21103#discussion_r85267281"},"pull_request":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103"}}},"pull_request":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103","id":90700091,"html_url":"https://github.com/elastic/elasticsearch/pull/21103","diff_url":"https://github.com/elastic/elasticsearch/pull/21103.diff","patch_url":"https://github.com/elastic/elasticsearch/pull/21103.patch","issue_url":"https://api.github.com/repos/elastic/elasticsearch/issues/21103","number":21103,"state":"open","locked":false,"title":"Balance step in BalancedShardsAllocator for a single shard","user":{"login":"abeyad","id":1631297,"avatar_url":"https://avatars.githubusercontent.com/u/1631297?v=3","gravatar_id":"","url":"https://api.github.com/users/abeyad","html_url":"https://github.com/abeyad","followers_url":"https://api.github.com/users/abeyad/followers","following_url":"https://api.github.com/users/abeyad/following{/other_user}","gists_url":"https://api.github.com/users/abeyad/gists{/gist_id}","starred_url":"https://api.github.com/users/abeyad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abeyad/subscriptions","organizations_url":"https://api.github.com/users/abeyad/orgs","repos_url":"https://api.github.com/users/abeyad/repos","events_url":"https://api.github.com/users/abeyad/events{/privacy}","received_events_url":"https://api.github.com/users/abeyad/received_events","type":"User","site_admin":false},"body":"This commit introduces a single-shard balance step for deciding on\r\nrebalancing a single shard (without taking any other shards in the\r\ncluster into account).  This method will be used by the cluster\r\nallocation explain API to explain in detail the decision process for\r\nfinding a more optimal location for a started shard, if one exists.","created_at":"2016-10-24T21:51:08Z","updated_at":"2016-10-27T05:18:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"143a083c414ced9a5a7c85f87ff8b752b56a4624","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103/commits","review_comments_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103/comments","review_comment_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elastic/elasticsearch/issues/21103/comments","statuses_url":"https://api.github.com/repos/elastic/elasticsearch/statuses/04d79593ca13cb8a3f578520328bb18304c1ee5d","head":{"label":"abeyad:balance_single_shard","ref":"balance_single_shard","sha":"04d79593ca13cb8a3f578520328bb18304c1ee5d","user":{"login":"abeyad","id":1631297,"avatar_url":"https://avatars.githubusercontent.com/u/1631297?v=3","gravatar_id":"","url":"https://api.github.com/users/abeyad","html_url":"https://github.com/abeyad","followers_url":"https://api.github.com/users/abeyad/followers","following_url":"https://api.github.com/users/abeyad/following{/other_user}","gists_url":"https://api.github.com/users/abeyad/gists{/gist_id}","starred_url":"https://api.github.com/users/abeyad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abeyad/subscriptions","organizations_url":"https://api.github.com/users/abeyad/orgs","repos_url":"https://api.github.com/users/abeyad/repos","events_url":"https://api.github.com/users/abeyad/events{/privacy}","received_events_url":"https://api.github.com/users/abeyad/received_events","type":"User","site_admin":false},"repo":{"id":48216890,"name":"elasticsearch","full_name":"abeyad/elasticsearch","owner":{"login":"abeyad","id":1631297,"avatar_url":"https://avatars.githubusercontent.com/u/1631297?v=3","gravatar_id":"","url":"https://api.github.com/users/abeyad","html_url":"https://github.com/abeyad","followers_url":"https://api.github.com/users/abeyad/followers","following_url":"https://api.github.com/users/abeyad/following{/other_user}","gists_url":"https://api.github.com/users/abeyad/gists{/gist_id}","starred_url":"https://api.github.com/users/abeyad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abeyad/subscriptions","organizations_url":"https://api.github.com/users/abeyad/orgs","repos_url":"https://api.github.com/users/abeyad/repos","events_url":"https://api.github.com/users/abeyad/events{/privacy}","received_events_url":"https://api.github.com/users/abeyad/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abeyad/elasticsearch","description":"Open Source, Distributed, RESTful Search Engine","fork":true,"url":"https://api.github.com/repos/abeyad/elasticsearch","forks_url":"https://api.github.com/repos/abeyad/elasticsearch/forks","keys_url":"https://api.github.com/repos/abeyad/elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abeyad/elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abeyad/elasticsearch/teams","hooks_url":"https://api.github.com/repos/abeyad/elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/abeyad/elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/abeyad/elasticsearch/events","assignees_url":"https://api.github.com/repos/abeyad/elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/abeyad/elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/abeyad/elasticsearch/tags","blobs_url":"https://api.github.com/repos/abeyad/elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abeyad/elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abeyad/elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/abeyad/elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abeyad/elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/abeyad/elasticsearch/languages","stargazers_url":"https://api.github.com/repos/abeyad/elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/abeyad/elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/abeyad/elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/abeyad/elasticsearch/subscription","commits_url":"https://api.github.com/repos/abeyad/elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/abeyad/elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/abeyad/elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/abeyad/elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/abeyad/elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/abeyad/elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abeyad/elasticsearch/merges","archive_url":"https://api.github.com/repos/abeyad/elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abeyad/elasticsearch/downloads","issues_url":"https://api.github.com/repos/abeyad/elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/abeyad/elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/abeyad/elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/abeyad/elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abeyad/elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/abeyad/elasticsearch/releases{/id}","deployments_url":"https://api.github.com/repos/abeyad/elasticsearch/deployments","created_at":"2015-12-18T05:46:26Z","updated_at":"2016-07-06T05:16:50Z","pushed_at":"2016-10-27T02:45:52Z","git_url":"git://github.com/abeyad/elasticsearch.git","ssh_url":"git@github.com:abeyad/elasticsearch.git","clone_url":"https://github.com/abeyad/elasticsearch.git","svn_url":"https://github.com/abeyad/elasticsearch","homepage":"https://www.elastic.co/products/elasticsearch","size":245561,"stargazers_count":0,"watchers_count":0,"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":0,"default_branch":"master"}},"base":{"label":"elastic:master","ref":"master","sha":"de241f441de53f1ba190f243f8827ae0f0efe526","user":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"repo":{"id":507775,"name":"elasticsearch","full_name":"elastic/elasticsearch","owner":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elastic/elasticsearch","description":"Open Source, Distributed, RESTful Search Engine","fork":false,"url":"https://api.github.com/repos/elastic/elasticsearch","forks_url":"https://api.github.com/repos/elastic/elasticsearch/forks","keys_url":"https://api.github.com/repos/elastic/elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elastic/elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elastic/elasticsearch/teams","hooks_url":"https://api.github.com/repos/elastic/elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/elastic/elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/elastic/elasticsearch/events","assignees_url":"https://api.github.com/repos/elastic/elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/elastic/elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/elastic/elasticsearch/tags","blobs_url":"https://api.github.com/repos/elastic/elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elastic/elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elastic/elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/elastic/elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elastic/elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/elastic/elasticsearch/languages","stargazers_url":"https://api.github.com/repos/elastic/elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/elastic/elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/elastic/elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/elastic/elasticsearch/subscription","commits_url":"https://api.github.com/repos/elastic/elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/elastic/elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/elastic/elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/elastic/elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/elastic/elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/elastic/elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elastic/elasticsearch/merges","archive_url":"https://api.github.com/repos/elastic/elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elastic/elasticsearch/downloads","issues_url":"https://api.github.com/repos/elastic/elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/elastic/elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/elastic/elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/elastic/elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elastic/elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/elastic/elasticsearch/releases{/id}","deployments_url":"https://api.github.com/repos/elastic/elasticsearch/deployments","created_at":"2010-02-08T13:20:56Z","updated_at":"2016-10-27T04:20:47Z","pushed_at":"2016-10-27T04:26:18Z","git_url":"git://github.com/elastic/elasticsearch.git","ssh_url":"git@github.com:elastic/elasticsearch.git","clone_url":"https://github.com/elastic/elasticsearch.git","svn_url":"https://github.com/elastic/elasticsearch","homepage":"https://www.elastic.co/products/elasticsearch","size":365260,"stargazers_count":19004,"watchers_count":19004,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6496,"mirror_url":null,"open_issues_count":1141,"forks":6496,"open_issues":1141,"watchers":19004,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/21103"},"issue":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/21103"},"comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/21103/comments"},"review_comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103/comments"},"review_comment":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/21103/commits"},"statuses":{"href":"https://api.github.com/repos/elastic/elasticsearch/statuses/04d79593ca13cb8a3f578520328bb18304c1ee5d"}}}}
{"actor":{"display_login":"dakrone"}}