{"action":"created","comment":{"url":"https://api.github.com/repos/apache/accumulo/pulls/comments/64976184","id":64976184,"diff_hunk":"@@ -0,0 +1,330 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\n+ * contributor license agreements.  See the NOTICE file distributed with\n+ * this work for additional information regarding copyright ownership.\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\n+ * (the \"License\"); you may not use this file except in compliance with\n+ * the License.  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, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.apache.accumulo.core.client.rfile;\n+\n+import java.io.IOException;\n+import java.util.ArrayList;\n+import java.util.Collections;\n+import java.util.HashMap;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.Map.Entry;\n+import java.util.Set;\n+import java.util.SortedSet;\n+import java.util.concurrent.TimeUnit;\n+\n+import org.apache.accumulo.core.client.IteratorSetting;\n+import org.apache.accumulo.core.client.Scanner;\n+import org.apache.accumulo.core.client.impl.BaseIteratorEnvironment;\n+import org.apache.accumulo.core.client.impl.ScannerOptions;\n+import org.apache.accumulo.core.client.rfile.RFileScannerBuilder.InputArgs;\n+import org.apache.accumulo.core.client.sample.SamplerConfiguration;\n+import org.apache.accumulo.core.conf.AccumuloConfiguration;\n+import org.apache.accumulo.core.conf.ConfigurationCopy;\n+import org.apache.accumulo.core.conf.Property;\n+import org.apache.accumulo.core.data.ByteSequence;\n+import org.apache.accumulo.core.data.Column;\n+import org.apache.accumulo.core.data.Key;\n+import org.apache.accumulo.core.data.Range;\n+import org.apache.accumulo.core.data.Value;\n+import org.apache.accumulo.core.file.blockfile.cache.BlockCache;\n+import org.apache.accumulo.core.file.blockfile.cache.CacheEntry;\n+import org.apache.accumulo.core.file.blockfile.cache.LruBlockCache;\n+import org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile;\n+import org.apache.accumulo.core.file.rfile.RFile;\n+import org.apache.accumulo.core.file.rfile.RFile.Reader;\n+import org.apache.accumulo.core.iterators.IteratorAdapter;\n+import org.apache.accumulo.core.iterators.IteratorUtil;\n+import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;\n+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;\n+import org.apache.accumulo.core.iterators.system.MultiIterator;\n+import org.apache.accumulo.core.sample.impl.SamplerConfigurationImpl;\n+import org.apache.accumulo.core.security.Authorizations;\n+import org.apache.accumulo.core.util.LocalityGroupUtil;\n+import org.apache.hadoop.fs.FSDataInputStream;\n+import org.apache.hadoop.io.Text;\n+\n+import com.google.common.base.Preconditions;\n+\n+class RFileScanner extends ScannerOptions implements Scanner {\n+\n+  private Range range;\n+  private BlockCache dataCache = null;\n+  private BlockCache indexCache = null;\n+  private Opts opts;\n+  private int batchSize = 1000;\n+  private long readaheadThreshold = 3;\n+\n+  private static final long CACHE_BLOCK_SIZE = AccumuloConfiguration.getDefaultConfiguration().getMemoryInBytes(Property.TSERV_DEFAULT_BLOCKSIZE);\n+\n+  static class Opts {\n+    InputArgs in;\n+    Authorizations auths = Authorizations.EMPTY;\n+    long dataCacheSize;\n+    long indexCacheSize;\n+    boolean useSystemIterators = true;\n+    Text lowerBound;\n+    Text upperBound;\n+    public HashMap<String,String> tableConfig;\n+  }\n+\n+  // This cache exist as a hack to avoid leaking decompressors. When the RFile code is not given a\n+  // cache it reads blocks directly from the decompressor. However if a user does not read all data\n+  // for a scan this can leave a BCFile block open and a decompressor allocated.\n+  //\n+  // By providing a cache to the RFile code it forces each block to be read into memory. When a\n+  // block is accessed the entire thing is read into memory immediately allocating and deallocating\n+  // a decompressor. If the user does not read all data, no decompressors are left allocated.\n+  private static class NoopCache implements BlockCache {\n+    @Override\n+    public CacheEntry cacheBlock(String blockName, byte[] buf, boolean inMemory) {\n+      return null;\n+    }\n+\n+    @Override\n+    public CacheEntry cacheBlock(String blockName, byte[] buf) {\n+      return null;\n+    }\n+\n+    @Override\n+    public CacheEntry getBlock(String blockName) {\n+      return null;\n+    }\n+\n+    @Override\n+    public long getMaxSize() {\n+      return Integer.MAX_VALUE;\n+    }\n+  }\n+\n+  RFileScanner(Opts opts) {\n+    if (!opts.auths.equals(Authorizations.EMPTY) && !opts.useSystemIterators) {\n+      throw new IllegalArgumentException(\"Set authorizations and specified not to use system iterators\");\n+    }\n+\n+    this.opts = opts;\n+    if (opts.indexCacheSize > 0) {\n+      this.indexCache = new LruBlockCache(opts.indexCacheSize, CACHE_BLOCK_SIZE);\n+    } else {\n+      this.indexCache = new NoopCache();\n+    }\n+\n+    if (opts.dataCacheSize > 0) {\n+      this.dataCache = new LruBlockCache(opts.dataCacheSize, CACHE_BLOCK_SIZE);\n+    } else {\n+      this.dataCache = new NoopCache();\n+    }\n+  }\n+\n+  @Override\n+  public synchronized void fetchColumnFamily(Text col) {\n+    Preconditions.checkArgument(opts.useSystemIterators, \"Can only fetch columns when using system iterators\");\n+    super.fetchColumnFamily(col);\n+  }\n+\n+  @Override\n+  public synchronized void fetchColumn(Text colFam, Text colQual) {\n+    Preconditions.checkArgument(opts.useSystemIterators, \"Can only fetch columns when using system iterators\");\n+    super.fetchColumn(colFam, colQual);\n+  }\n+\n+  @Override\n+  public void fetchColumn(IteratorSetting.Column column) {\n+    Preconditions.checkArgument(opts.useSystemIterators, \"Can only fetch columns when using system iterators\");\n+    super.fetchColumn(column);\n+  }\n+\n+  @Override\n+  public void setClassLoaderContext(String classLoaderContext) {\n+    throw new UnsupportedOperationException();\n+  }\n+\n+  @Deprecated\n+  @Override\n+  public void setTimeOut(int timeOut) {\n+    if (timeOut == Integer.MAX_VALUE)\n+      setTimeout(Long.MAX_VALUE, TimeUnit.MILLISECONDS);\n+    else\n+      setTimeout(timeOut, TimeUnit.SECONDS);\n+  }\n+\n+  @Deprecated\n+  @Override\n+  public int getTimeOut() {\n+    long timeout = getTimeout(TimeUnit.SECONDS);\n+    if (timeout >= Integer.MAX_VALUE)\n+      return Integer.MAX_VALUE;\n+    return (int) timeout;\n+  }\n+\n+  @Override\n+  public void setRange(Range range) {\n+    this.range = range;\n+  }\n+\n+  @Override\n+  public Range getRange() {\n+    return range;\n+  }\n+\n+  @Override\n+  public void setBatchSize(int size) {\n+    this.batchSize = size;\n+  }\n+\n+  @Override\n+  public int getBatchSize() {\n+    return batchSize;\n+  }\n+\n+  @Override\n+  public void enableIsolation() {}\n+\n+  @Override\n+  public void disableIsolation() {}\n+\n+  @Override\n+  public synchronized void setReadaheadThreshold(long batches) {\n+    Preconditions.checkArgument(batches > 0);\n+    readaheadThreshold = batches;\n+  }\n+\n+  @Override\n+  public synchronized long getReadaheadThreshold() {\n+    return readaheadThreshold;\n+  }\n+\n+  @Override\n+  public Authorizations getAuthorizations() {\n+    return opts.auths;\n+  }\n+\n+  @Override\n+  public void addScanIterator(IteratorSetting cfg) {\n+    super.addScanIterator(cfg);\n+  }\n+\n+  @Override\n+  public void removeScanIterator(String iteratorName) {\n+    super.removeScanIterator(iteratorName);\n+  }\n+\n+  @Override\n+  public void updateScanIteratorOption(String iteratorName, String key, String value) {\n+    super.updateScanIteratorOption(iteratorName, key, value);\n+  }\n+\n+  private static final Range EMPTY_RANGE = new Range();\n+\n+  private class IterEnv extends BaseIteratorEnvironment {\n+    @Override\n+    public IteratorScope getIteratorScope() {\n+      return IteratorScope.scan;\n+    }\n+\n+    @Override\n+    public boolean isFullMajorCompaction() {\n+      return false;\n+    }\n+\n+    @Override\n+    public Authorizations getAuthorizations() {\n+      return opts.auths;\n+    }\n+\n+    @Override\n+    public boolean isSamplingEnabled() {\n+      return RFileScanner.this.getSamplerConfiguration() != null;\n+    }\n+\n+    @Override\n+    public SamplerConfiguration getSamplerConfiguration() {\n+      return RFileScanner.this.getSamplerConfiguration();\n+    }\n+  }\n+\n+  @Override\n+  public Iterator<Entry<Key,Value>> iterator() {\n+    try {\n+      RFileSource[] sources = opts.in.getSources();\n+      List<SortedKeyValueIterator<Key,Value>> readers = new ArrayList<>(sources.length);\n+      for (int i = 0; i < sources.length; i++) {\n+        FSDataInputStream inputStream = (FSDataInputStream) sources[i].getInputStream();\n+        readers.add(new RFile.Reader(new CachableBlockFile.Reader(inputStream, sources[i].getLength(), opts.in.getConf(), dataCache, indexCache,\n+            AccumuloConfiguration.getDefaultConfiguration())));\n+      }\n+\n+      if (getSamplerConfiguration() != null) {\n+        for (int i = 0; i < readers.size(); i++) {\n+          readers.set(i, ((Reader) readers.get(i)).getSample(new SamplerConfigurationImpl(getSamplerConfiguration())));\n+        }\n+      }\n+\n+      SortedKeyValueIterator<Key,Value> iterator;\n+      if (opts.lowerBound != null || opts.upperBound != null) {\n+        iterator = new MultiIterator(readers, new Range(opts.lowerBound, false, opts.upperBound, true));\n+      } else {\n+        iterator = new MultiIterator(readers, false);\n+      }\n+\n+      Set<ByteSequence> families = Collections.emptySet();\n+\n+      if (opts.useSystemIterators) {\n+        SortedSet<Column> cols = this.getFetchedColumns();\n+        families = LocalityGroupUtil.families(cols);\n+        iterator = IteratorUtil.setupSystemScanIterators(iterator, cols, getAuthorizations(), new byte[0]);","path":"core/src/main/java/org/apache/accumulo/core/client/rfile/RFileScanner.java","position":290,"original_position":290,"commit_id":"a5c6ece070fc44923758a1da4aa50849f872fdf4","original_commit_id":"a5c6ece070fc44923758a1da4aa50849f872fdf4","user":{"login":"joshelser","id":67863,"avatar_url":"https://avatars.githubusercontent.com/u/67863?v=3","gravatar_id":"","url":"https://api.github.com/users/joshelser","html_url":"https://github.com/joshelser","followers_url":"https://api.github.com/users/joshelser/followers","following_url":"https://api.github.com/users/joshelser/following{/other_user}","gists_url":"https://api.github.com/users/joshelser/gists{/gist_id}","starred_url":"https://api.github.com/users/joshelser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshelser/subscriptions","organizations_url":"https://api.github.com/users/joshelser/orgs","repos_url":"https://api.github.com/users/joshelser/repos","events_url":"https://api.github.com/users/joshelser/events{/privacy}","received_events_url":"https://api.github.com/users/joshelser/received_events","type":"User","site_admin":false},"body":"`new byte[0]` can be a static constant somewhere","created_at":"2016-05-27T22:59:02Z","updated_at":"2016-05-27T22:59:02Z","html_url":"https://github.com/apache/accumulo/pull/103#discussion_r64976184","pull_request_url":"https://api.github.com/repos/apache/accumulo/pulls/103","_links":{"self":{"href":"https://api.github.com/repos/apache/accumulo/pulls/comments/64976184"},"html":{"href":"https://github.com/apache/accumulo/pull/103#discussion_r64976184"},"pull_request":{"href":"https://api.github.com/repos/apache/accumulo/pulls/103"}}},"pull_request":{"url":"https://api.github.com/repos/apache/accumulo/pulls/103","id":71756271,"html_url":"https://github.com/apache/accumulo/pull/103","diff_url":"https://github.com/apache/accumulo/pull/103.diff","patch_url":"https://github.com/apache/accumulo/pull/103.patch","issue_url":"https://api.github.com/repos/apache/accumulo/issues/103","number":103,"state":"open","locked":false,"title":"ACCUMULO-4165 Added a user facing API for RFile","user":{"login":"keith-turner","id":1268739,"avatar_url":"https://avatars.githubusercontent.com/u/1268739?v=3","gravatar_id":"","url":"https://api.github.com/users/keith-turner","html_url":"https://github.com/keith-turner","followers_url":"https://api.github.com/users/keith-turner/followers","following_url":"https://api.github.com/users/keith-turner/following{/other_user}","gists_url":"https://api.github.com/users/keith-turner/gists{/gist_id}","starred_url":"https://api.github.com/users/keith-turner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keith-turner/subscriptions","organizations_url":"https://api.github.com/users/keith-turner/orgs","repos_url":"https://api.github.com/users/keith-turner/repos","events_url":"https://api.github.com/users/keith-turner/events{/privacy}","received_events_url":"https://api.github.com/users/keith-turner/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-27T18:44:47Z","updated_at":"2016-05-27T22:59:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"96012a9095dba2a2a9de5bfebae37e6f60aa1110","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/accumulo/pulls/103/commits","review_comments_url":"https://api.github.com/repos/apache/accumulo/pulls/103/comments","review_comment_url":"https://api.github.com/repos/apache/accumulo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/accumulo/issues/103/comments","statuses_url":"https://api.github.com/repos/apache/accumulo/statuses/a5c6ece070fc44923758a1da4aa50849f872fdf4","head":{"label":"keith-turner:rfile-api","ref":"rfile-api","sha":"a5c6ece070fc44923758a1da4aa50849f872fdf4","user":{"login":"keith-turner","id":1268739,"avatar_url":"https://avatars.githubusercontent.com/u/1268739?v=3","gravatar_id":"","url":"https://api.github.com/users/keith-turner","html_url":"https://github.com/keith-turner","followers_url":"https://api.github.com/users/keith-turner/followers","following_url":"https://api.github.com/users/keith-turner/following{/other_user}","gists_url":"https://api.github.com/users/keith-turner/gists{/gist_id}","starred_url":"https://api.github.com/users/keith-turner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keith-turner/subscriptions","organizations_url":"https://api.github.com/users/keith-turner/orgs","repos_url":"https://api.github.com/users/keith-turner/repos","events_url":"https://api.github.com/users/keith-turner/events{/privacy}","received_events_url":"https://api.github.com/users/keith-turner/received_events","type":"User","site_admin":false},"repo":{"id":4228808,"name":"accumulo","full_name":"keith-turner/accumulo","owner":{"login":"keith-turner","id":1268739,"avatar_url":"https://avatars.githubusercontent.com/u/1268739?v=3","gravatar_id":"","url":"https://api.github.com/users/keith-turner","html_url":"https://github.com/keith-turner","followers_url":"https://api.github.com/users/keith-turner/followers","following_url":"https://api.github.com/users/keith-turner/following{/other_user}","gists_url":"https://api.github.com/users/keith-turner/gists{/gist_id}","starred_url":"https://api.github.com/users/keith-turner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keith-turner/subscriptions","organizations_url":"https://api.github.com/users/keith-turner/orgs","repos_url":"https://api.github.com/users/keith-turner/repos","events_url":"https://api.github.com/users/keith-turner/events{/privacy}","received_events_url":"https://api.github.com/users/keith-turner/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/keith-turner/accumulo","description":"Mirror of Apache Accumulo","fork":true,"url":"https://api.github.com/repos/keith-turner/accumulo","forks_url":"https://api.github.com/repos/keith-turner/accumulo/forks","keys_url":"https://api.github.com/repos/keith-turner/accumulo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/keith-turner/accumulo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/keith-turner/accumulo/teams","hooks_url":"https://api.github.com/repos/keith-turner/accumulo/hooks","issue_events_url":"https://api.github.com/repos/keith-turner/accumulo/issues/events{/number}","events_url":"https://api.github.com/repos/keith-turner/accumulo/events","assignees_url":"https://api.github.com/repos/keith-turner/accumulo/assignees{/user}","branches_url":"https://api.github.com/repos/keith-turner/accumulo/branches{/branch}","tags_url":"https://api.github.com/repos/keith-turner/accumulo/tags","blobs_url":"https://api.github.com/repos/keith-turner/accumulo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/keith-turner/accumulo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/keith-turner/accumulo/git/refs{/sha}","trees_url":"https://api.github.com/repos/keith-turner/accumulo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/keith-turner/accumulo/statuses/{sha}","languages_url":"https://api.github.com/repos/keith-turner/accumulo/languages","stargazers_url":"https://api.github.com/repos/keith-turner/accumulo/stargazers","contributors_url":"https://api.github.com/repos/keith-turner/accumulo/contributors","subscribers_url":"https://api.github.com/repos/keith-turner/accumulo/subscribers","subscription_url":"https://api.github.com/repos/keith-turner/accumulo/subscription","commits_url":"https://api.github.com/repos/keith-turner/accumulo/commits{/sha}","git_commits_url":"https://api.github.com/repos/keith-turner/accumulo/git/commits{/sha}","comments_url":"https://api.github.com/repos/keith-turner/accumulo/comments{/number}","issue_comment_url":"https://api.github.com/repos/keith-turner/accumulo/issues/comments{/number}","contents_url":"https://api.github.com/repos/keith-turner/accumulo/contents/{+path}","compare_url":"https://api.github.com/repos/keith-turner/accumulo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/keith-turner/accumulo/merges","archive_url":"https://api.github.com/repos/keith-turner/accumulo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/keith-turner/accumulo/downloads","issues_url":"https://api.github.com/repos/keith-turner/accumulo/issues{/number}","pulls_url":"https://api.github.com/repos/keith-turner/accumulo/pulls{/number}","milestones_url":"https://api.github.com/repos/keith-turner/accumulo/milestones{/number}","notifications_url":"https://api.github.com/repos/keith-turner/accumulo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/keith-turner/accumulo/labels{/name}","releases_url":"https://api.github.com/repos/keith-turner/accumulo/releases{/id}","deployments_url":"https://api.github.com/repos/keith-turner/accumulo/deployments","created_at":"2012-05-04T20:22:00Z","updated_at":"2015-08-28T21:58:49Z","pushed_at":"2016-05-27T22:00:44Z","git_url":"git://github.com/keith-turner/accumulo.git","ssh_url":"git@github.com:keith-turner/accumulo.git","clone_url":"https://github.com/keith-turner/accumulo.git","svn_url":"https://github.com/keith-turner/accumulo","homepage":"","size":48282,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"apache:1.8","ref":"1.8","sha":"c8bd1ddd096b3b625d39d1ecf341fd8a58e46b17","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":2524488,"name":"accumulo","full_name":"apache/accumulo","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/accumulo","description":"Mirror of Apache Accumulo","fork":false,"url":"https://api.github.com/repos/apache/accumulo","forks_url":"https://api.github.com/repos/apache/accumulo/forks","keys_url":"https://api.github.com/repos/apache/accumulo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/accumulo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/accumulo/teams","hooks_url":"https://api.github.com/repos/apache/accumulo/hooks","issue_events_url":"https://api.github.com/repos/apache/accumulo/issues/events{/number}","events_url":"https://api.github.com/repos/apache/accumulo/events","assignees_url":"https://api.github.com/repos/apache/accumulo/assignees{/user}","branches_url":"https://api.github.com/repos/apache/accumulo/branches{/branch}","tags_url":"https://api.github.com/repos/apache/accumulo/tags","blobs_url":"https://api.github.com/repos/apache/accumulo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/accumulo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/accumulo/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/accumulo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/accumulo/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/accumulo/languages","stargazers_url":"https://api.github.com/repos/apache/accumulo/stargazers","contributors_url":"https://api.github.com/repos/apache/accumulo/contributors","subscribers_url":"https://api.github.com/repos/apache/accumulo/subscribers","subscription_url":"https://api.github.com/repos/apache/accumulo/subscription","commits_url":"https://api.github.com/repos/apache/accumulo/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/accumulo/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/accumulo/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/accumulo/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/accumulo/contents/{+path}","compare_url":"https://api.github.com/repos/apache/accumulo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/accumulo/merges","archive_url":"https://api.github.com/repos/apache/accumulo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/accumulo/downloads","issues_url":"https://api.github.com/repos/apache/accumulo/issues{/number}","pulls_url":"https://api.github.com/repos/apache/accumulo/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/accumulo/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/accumulo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/accumulo/labels{/name}","releases_url":"https://api.github.com/repos/apache/accumulo/releases{/id}","deployments_url":"https://api.github.com/repos/apache/accumulo/deployments","created_at":"2011-10-06T07:00:09Z","updated_at":"2016-05-27T20:41:20Z","pushed_at":"2016-05-27T21:05:40Z","git_url":"git://github.com/apache/accumulo.git","ssh_url":"git@github.com:apache/accumulo.git","clone_url":"https://github.com/apache/accumulo.git","svn_url":"https://github.com/apache/accumulo","homepage":"","size":65819,"stargazers_count":226,"watchers_count":226,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":124,"mirror_url":"git://git.apache.org/accumulo.git","open_issues_count":4,"forks":124,"open_issues":4,"watchers":226,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/accumulo/pulls/103"},"html":{"href":"https://github.com/apache/accumulo/pull/103"},"issue":{"href":"https://api.github.com/repos/apache/accumulo/issues/103"},"comments":{"href":"https://api.github.com/repos/apache/accumulo/issues/103/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/accumulo/pulls/103/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/accumulo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/accumulo/pulls/103/commits"},"statuses":{"href":"https://api.github.com/repos/apache/accumulo/statuses/a5c6ece070fc44923758a1da4aa50849f872fdf4"}}}}
{"actor":{"display_login":"joshelser"}}