{"action":"created","comment":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/216926953","pull_request_review_id":154519571,"id":216926953,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNjkyNjk1Mw==","diff_hunk":"@@ -0,0 +1,189 @@\n+/*\n+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n+ * or more contributor license agreements. Licensed under the Elastic License;\n+ * you may not use this file except in compliance with the Elastic License.\n+ */\n+package org.elasticsearch.snapshots;\n+\n+import com.carrotsearch.hppc.cursors.ObjectObjectCursor;\n+import org.apache.lucene.index.DirectoryReader;\n+import org.apache.lucene.index.IndexCommit;\n+import org.apache.lucene.index.SegmentInfos;\n+import org.apache.lucene.search.Query;\n+import org.apache.lucene.store.FSDirectory;\n+import org.apache.lucene.store.SimpleFSDirectory;\n+import org.elasticsearch.cluster.metadata.IndexMetaData;\n+import org.elasticsearch.cluster.metadata.MappingMetaData;\n+import org.elasticsearch.cluster.metadata.MetaData;\n+import org.elasticsearch.cluster.metadata.RepositoryMetaData;\n+import org.elasticsearch.common.Strings;\n+import org.elasticsearch.common.collect.ImmutableOpenMap;\n+import org.elasticsearch.common.lucene.search.Queries;\n+import org.elasticsearch.common.settings.Setting;\n+import org.elasticsearch.common.settings.Settings;\n+import org.elasticsearch.env.ShardLock;\n+import org.elasticsearch.index.engine.EngineException;\n+import org.elasticsearch.index.engine.EngineFactory;\n+import org.elasticsearch.index.engine.ReadOnlyEngine;\n+import org.elasticsearch.index.shard.IndexShard;\n+import org.elasticsearch.index.shard.ShardPath;\n+import org.elasticsearch.index.snapshots.IndexShardSnapshotStatus;\n+import org.elasticsearch.index.store.Store;\n+import org.elasticsearch.index.translog.TranslogStats;\n+import org.elasticsearch.repositories.FilterRepository;\n+import org.elasticsearch.repositories.IndexId;\n+import org.elasticsearch.repositories.Repository;\n+\n+import java.io.IOException;\n+import java.io.UncheckedIOException;\n+import java.nio.file.Path;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.function.BiFunction;\n+import java.util.function.Function;\n+import java.util.function.Supplier;\n+\n+/**\n+ * <p>\n+ * This is a filter snapshot repository that only snapshots the minimal required information\n+ * that is needed to recreate the index. In other words instead of snapshotting the entire shard\n+ * with all it's lucene indexed fields, doc values, points etc. it only snapshots the the stored\n+ * fields including _source and _routing as well as the live docs in oder to distinguish between\n+ * live and deleted docs.\n+ * </p>\n+ * <p>\n+ * The repository can wrap any other repository delegating the source only snapshot to it to and read\n+ * from it. For instance a file repository of type <i>fs</i> by passing <i>settings.delegate_type=fs</i>\n+ * at repository creation time.\n+ * </p>\n+ * Snapshots restored from source only snapshots are minimal indices that are read-only and only allow\n+ * match_all scroll searches in order to reindex the data.\n+ */\n+public final class SourceOnlySnapshotRepository extends FilterRepository {\n+    private static final Setting<String> DELEGATE_TYPE = new Setting<>(\"delegate_type\", \"\", Function.identity(), Setting.Property\n+        .NodeScope);\n+    public static final Setting<Boolean> SOURCE_ONLY = Setting.boolSetting(\"index.source_only\", false, Setting\n+        .Property.IndexScope, Setting.Property.Final, Setting.Property.PrivateIndex);\n+\n+    private static final String SNAPSHOT_DIR_NAME = \"_snapshot\";\n+\n+    SourceOnlySnapshotRepository(Repository in) {\n+        super(in);\n+    }\n+\n+    @Override\n+    public void initializeSnapshot(SnapshotId snapshotId, List<IndexId> indices, MetaData metaData) {\n+        // we process the index metadata at snapshot time. This means if somebody tries to restore\n+        // a _source only snapshot with a plain repository it will be just fine since we already set the\n+        // required engine, that the index is read-only and the mapping to a default mapping\n+        try {\n+            MetaData.Builder builder = MetaData.builder(metaData);\n+            for (IndexId indexId : indices) {\n+                IndexMetaData index = metaData.index(indexId.getName());\n+                IndexMetaData.Builder indexMetadataBuilder = IndexMetaData.builder(index);\n+                // for a minimal restore we basically disable indexing on all fields and only create an index\n+                // that is fully functional from an operational perspective. ie. it will have all metadata fields like version/\n+                // seqID etc. and an indexed ID field such that we can potentially perform updates on them or delete documents.\n+                ImmutableOpenMap<String, MappingMetaData> mappings = index.getMappings();\n+                Iterator<ObjectObjectCursor<String, MappingMetaData>> iterator = mappings.iterator();\n+                while (iterator.hasNext()) {\n+                    ObjectObjectCursor<String, MappingMetaData> next = iterator.next();\n+                    // we don't need to obey any routing here stuff is read-only anyway and get is disabled\n+                    final String mapping = \"{ \\\"\" + next.key + \"\\\": { \\\"enabled\\\": false, \\\"_meta\\\": \" + next.value.source().string()\n+                        + \" } }\";\n+                    indexMetadataBuilder.putMapping(next.key, mapping);\n+                }\n+                indexMetadataBuilder.settings(Settings.builder().put(index.getSettings())\n+                    .put(SOURCE_ONLY.getKey(), true)\n+                    .put(\"index.blocks.write\", true)); // read-only!\n+                builder.put(indexMetadataBuilder);\n+            }\n+            super.initializeSnapshot(snapshotId, indices, builder.build());\n+        } catch (IOException ex) {\n+            throw new UncheckedIOException(ex);\n+        }\n+    }\n+\n+    @Override\n+    public void snapshotShard(IndexShard shard, Store store, SnapshotId snapshotId, IndexId indexId, IndexCommit snapshotIndexCommit,\n+                              IndexShardSnapshotStatus snapshotStatus) {\n+        if (shard.mapperService().documentMapper() != null // if there is no mapping this is null\n+            && shard.mapperService().documentMapper().sourceMapper().isComplete() == false) {\n+            throw new IllegalStateException(\"Can't snapshot _source only on an index that has incomplete source ie. has _source disabled \" +\n+                \"or filters the source\");\n+        }\n+        ShardPath shardPath = shard.shardPath();\n+        Path dataPath = shardPath.getDataPath();\n+        // TODO should we have a snapshot tmp directory per shard that is maintained by the system?\n+        Path snapPath = dataPath.resolve(SNAPSHOT_DIR_NAME);\n+        try (FSDirectory directory = new SimpleFSDirectory(snapPath)) {\n+            Store tempStore = new Store(store.shardId(), store.indexSettings(), directory, new ShardLock(store.shardId()) {\n+                @Override\n+                protected void closeInternal() {\n+                    // do nothing;\n+                }\n+            }, Store.OnClose.EMPTY);\n+            Supplier<Query> querySupplier = shard.mapperService().hasNested() ? Queries::newNestedFilter : null;\n+            // SourceOnlySnapshot will take care of soft- and hard-deletes no special casing needed here\n+            SourceOnlySnapshot snapshot = new SourceOnlySnapshot(tempStore.directory(), querySupplier);\n+            snapshot.syncSnapshot(snapshotIndexCommit);\n+            // we will use the lucene doc ID as the seq ID so we set the local checkpoint to maxDoc with a new index UUID\n+            SegmentInfos segmentInfos = store.readLastCommittedSegmentsInfo();\n+            tempStore.bootstrapNewHistoryWithLocalCheckpoint(segmentInfos.totalMaxDoc());","path":"x-pack/plugin/core/src/main/java/org/elasticsearch/snapshots/SourceOnlySnapshotRepository.java","position":132,"original_position":132,"commit_id":"59e5dbfb89b6cbb8434712237663091dda797597","original_commit_id":"59e5dbfb89b6cbb8434712237663091dda797597","user":{"login":"s1monw","id":973334,"node_id":"MDQ6VXNlcjk3MzMzNA==","avatar_url":"https://avatars0.githubusercontent.com/u/973334?v=4","gravatar_id":"","url":"https://api.github.com/users/s1monw","html_url":"https://github.com/s1monw","followers_url":"https://api.github.com/users/s1monw/followers","following_url":"https://api.github.com/users/s1monw/following{/other_user}","gists_url":"https://api.github.com/users/s1monw/gists{/gist_id}","starred_url":"https://api.github.com/users/s1monw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1monw/subscriptions","organizations_url":"https://api.github.com/users/s1monw/orgs","repos_url":"https://api.github.com/users/s1monw/repos","events_url":"https://api.github.com/users/s1monw/events{/privacy}","received_events_url":"https://api.github.com/users/s1monw/received_events","type":"User","site_admin":false},"body":"we only mark nested docs as deleted we will account for them.","created_at":"2018-09-12T07:42:55Z","updated_at":"2018-09-12T07:42:55Z","html_url":"https://github.com/elastic/elasticsearch/pull/32844#discussion_r216926953","pull_request_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/216926953"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/32844#discussion_r216926953"},"pull_request":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844"}},"in_reply_to_id":216832888},"pull_request":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844","id":208276069,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4Mjc2MDY5","html_url":"https://github.com/elastic/elasticsearch/pull/32844","diff_url":"https://github.com/elastic/elasticsearch/pull/32844.diff","patch_url":"https://github.com/elastic/elasticsearch/pull/32844.patch","issue_url":"https://api.github.com/repos/elastic/elasticsearch/issues/32844","number":32844,"state":"open","locked":false,"title":"Add `_source`-only snapshot repository","user":{"login":"s1monw","id":973334,"node_id":"MDQ6VXNlcjk3MzMzNA==","avatar_url":"https://avatars0.githubusercontent.com/u/973334?v=4","gravatar_id":"","url":"https://api.github.com/users/s1monw","html_url":"https://github.com/s1monw","followers_url":"https://api.github.com/users/s1monw/followers","following_url":"https://api.github.com/users/s1monw/following{/other_user}","gists_url":"https://api.github.com/users/s1monw/gists{/gist_id}","starred_url":"https://api.github.com/users/s1monw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1monw/subscriptions","organizations_url":"https://api.github.com/users/s1monw/orgs","repos_url":"https://api.github.com/users/s1monw/repos","events_url":"https://api.github.com/users/s1monw/events{/privacy}","received_events_url":"https://api.github.com/users/s1monw/received_events","type":"User","site_admin":false},"body":"This change adds a `_source` only snapshot repository that allows to wrap\r\nany existing repository as a _backend_ to snapshot only the `_source` part\r\nincluding live docs markers. Snapshots taken with the `source` repository\r\nwon't include any index structures. The snapshot will be reduced in size and\r\nfunctionality such that it requires in-place reindexing during restore.\r\nThe restore process will copy the `_source` data locally and reindexing all\r\ndata during the recovery from snapshot phase. Users have 2 options for re-indexing:\r\n * full reindex: where the data will be reindexed with the original mapping\r\n * minimal reindex: where the data will be reindexed with a disabled mapping that\r\n   results in an index that can only be accessed via `_id`.\r\n\r\nBoth options allow using and updating the index while the latter is mainly for\r\nscan/scroll purposes and re-indexing after the fact.\r\n\r\nThis feature aims mainly for disaster recovery use-cases where snapshot size is\r\na concern or where time to restore is less of an issue.\r\n\r\n**NOTE**: The snapshot produced by this repository is still a valid lucene index. This change doesn't allow for any longer retention policies which is out of scope for this change. There are several places in this change that need discussion with the team hence the change is labled WIP.","created_at":"2018-08-14T13:10:53Z","updated_at":"2018-09-12T07:42:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ec7f06178ab8c5c00110552cd6095618c868e35e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":143077482,"node_id":"MDU6TGFiZWwxNDMwNzc0ODI=","url":"https://api.github.com/repos/elastic/elasticsearch/labels/:Distributed/Snapshot/Restore","name":":Distributed/Snapshot/Restore","color":"0e8a16","default":false},{"id":23174,"node_id":"MDU6TGFiZWwyMzE3NA==","url":"https://api.github.com/repos/elastic/elasticsearch/labels/%3Eenhancement","name":">enhancement","color":"4a4ea8","default":false},{"id":962378555,"node_id":"MDU6TGFiZWw5NjIzNzg1NTU=","url":"https://api.github.com/repos/elastic/elasticsearch/labels/v6.5.0","name":"v6.5.0","color":"Dddddd","default":false},{"id":484855464,"node_id":"MDU6TGFiZWw0ODQ4NTU0NjQ=","url":"https://api.github.com/repos/elastic/elasticsearch/labels/v7.0.0","name":"v7.0.0","color":"dddddd","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844/commits","review_comments_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844/comments","review_comment_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elastic/elasticsearch/issues/32844/comments","statuses_url":"https://api.github.com/repos/elastic/elasticsearch/statuses/59e5dbfb89b6cbb8434712237663091dda797597","head":{"label":"s1monw:source_only_snap","ref":"source_only_snap","sha":"59e5dbfb89b6cbb8434712237663091dda797597","user":{"login":"s1monw","id":973334,"node_id":"MDQ6VXNlcjk3MzMzNA==","avatar_url":"https://avatars0.githubusercontent.com/u/973334?v=4","gravatar_id":"","url":"https://api.github.com/users/s1monw","html_url":"https://github.com/s1monw","followers_url":"https://api.github.com/users/s1monw/followers","following_url":"https://api.github.com/users/s1monw/following{/other_user}","gists_url":"https://api.github.com/users/s1monw/gists{/gist_id}","starred_url":"https://api.github.com/users/s1monw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1monw/subscriptions","organizations_url":"https://api.github.com/users/s1monw/orgs","repos_url":"https://api.github.com/users/s1monw/repos","events_url":"https://api.github.com/users/s1monw/events{/privacy}","received_events_url":"https://api.github.com/users/s1monw/received_events","type":"User","site_admin":false},"repo":{"id":4663744,"node_id":"MDEwOlJlcG9zaXRvcnk0NjYzNzQ0","name":"elasticsearch","full_name":"s1monw/elasticsearch","owner":{"login":"s1monw","id":973334,"node_id":"MDQ6VXNlcjk3MzMzNA==","avatar_url":"https://avatars0.githubusercontent.com/u/973334?v=4","gravatar_id":"","url":"https://api.github.com/users/s1monw","html_url":"https://github.com/s1monw","followers_url":"https://api.github.com/users/s1monw/followers","following_url":"https://api.github.com/users/s1monw/following{/other_user}","gists_url":"https://api.github.com/users/s1monw/gists{/gist_id}","starred_url":"https://api.github.com/users/s1monw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1monw/subscriptions","organizations_url":"https://api.github.com/users/s1monw/orgs","repos_url":"https://api.github.com/users/s1monw/repos","events_url":"https://api.github.com/users/s1monw/events{/privacy}","received_events_url":"https://api.github.com/users/s1monw/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/s1monw/elasticsearch","description":"Open Source, Distributed, RESTful Search Engine","fork":true,"url":"https://api.github.com/repos/s1monw/elasticsearch","forks_url":"https://api.github.com/repos/s1monw/elasticsearch/forks","keys_url":"https://api.github.com/repos/s1monw/elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/s1monw/elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/s1monw/elasticsearch/teams","hooks_url":"https://api.github.com/repos/s1monw/elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/s1monw/elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/s1monw/elasticsearch/events","assignees_url":"https://api.github.com/repos/s1monw/elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/s1monw/elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/s1monw/elasticsearch/tags","blobs_url":"https://api.github.com/repos/s1monw/elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/s1monw/elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/s1monw/elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/s1monw/elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/s1monw/elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/s1monw/elasticsearch/languages","stargazers_url":"https://api.github.com/repos/s1monw/elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/s1monw/elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/s1monw/elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/s1monw/elasticsearch/subscription","commits_url":"https://api.github.com/repos/s1monw/elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/s1monw/elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/s1monw/elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/s1monw/elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/s1monw/elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/s1monw/elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/s1monw/elasticsearch/merges","archive_url":"https://api.github.com/repos/s1monw/elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/s1monw/elasticsearch/downloads","issues_url":"https://api.github.com/repos/s1monw/elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/s1monw/elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/s1monw/elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/s1monw/elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/s1monw/elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/s1monw/elasticsearch/releases{/id}","deployments_url":"https://api.github.com/repos/s1monw/elasticsearch/deployments","created_at":"2012-06-14T13:44:13Z","updated_at":"2018-03-26T11:50:49Z","pushed_at":"2018-09-11T20:40:52Z","git_url":"git://github.com/s1monw/elasticsearch.git","ssh_url":"git@github.com:s1monw/elasticsearch.git","clone_url":"https://github.com/s1monw/elasticsearch.git","svn_url":"https://github.com/s1monw/elasticsearch","homepage":"http://elasticsearch.org","size":454644,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"elastic:master","ref":"master","sha":"517cfc3cc0c2278a1287cf961c7db513e81dcbb6","user":{"login":"elastic","id":6764390,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY3NjQzOTA=","avatar_url":"https://avatars0.githubusercontent.com/u/6764390?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnk1MDc3NzU=","name":"elasticsearch","full_name":"elastic/elasticsearch","owner":{"login":"elastic","id":6764390,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY3NjQzOTA=","avatar_url":"https://avatars0.githubusercontent.com/u/6764390?v=4","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":"2018-09-12T07:38:53Z","pushed_at":"2018-09-12T07:16:41Z","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":511270,"stargazers_count":34293,"watchers_count":34293,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":11635,"mirror_url":null,"archived":false,"open_issues_count":1630,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":11635,"open_issues":1630,"watchers":34293,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/32844"},"issue":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/32844"},"comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/32844/comments"},"review_comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844/comments"},"review_comment":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/32844/commits"},"statuses":{"href":"https://api.github.com/repos/elastic/elasticsearch/statuses/59e5dbfb89b6cbb8434712237663091dda797597"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"s1monw"}}