{"action":"created","comment":{"url":"https://api.github.com/repos/datastax/java-driver/pulls/comments/170937649","pull_request_review_id":99701756,"id":170937649,"diff_hunk":"@@ -0,0 +1,470 @@\n+/*\n+ * Copyright DataStax, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may 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, 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+package com.datastax.driver.examples.retry;\n+\n+import com.datastax.driver.core.BatchStatement;\n+import com.datastax.driver.core.Cluster;\n+import com.datastax.driver.core.ConsistencyLevel;\n+import com.datastax.driver.core.ResultSet;\n+import com.datastax.driver.core.Row;\n+import com.datastax.driver.core.Session;\n+import com.datastax.driver.core.SimpleStatement;\n+import com.datastax.driver.core.Statement;\n+import com.datastax.driver.core.WriteType;\n+import com.datastax.driver.core.exceptions.DriverException;\n+import com.datastax.driver.core.exceptions.NoHostAvailableException;\n+import com.datastax.driver.core.exceptions.QueryConsistencyException;\n+import com.datastax.driver.core.exceptions.ReadTimeoutException;\n+import com.datastax.driver.core.exceptions.UnavailableException;\n+import com.datastax.driver.core.exceptions.WriteTimeoutException;\n+import java.text.SimpleDateFormat;\n+\n+import static com.datastax.driver.core.BatchStatement.Type.UNLOGGED;\n+import static com.datastax.driver.core.ConsistencyLevel.QUORUM;\n+\n+/**\n+ * This example illustrates how to replace the deprecated\n+ * {@link com.datastax.driver.core.policies.DowngradingConsistencyRetryPolicy DowngradingConsistencyRetryPolicy}\n+ * with equivalent application logic.\n+ * <p/>\n+ * Preconditions:\n+ * <ul>\n+ * <li>An Apache Cassandra cluster is running and accessible through the contacts points\n+ * identified by {@link #CONTACT_POINTS} and {@link #PORT}.</li>\n+ * </ul>\n+ * Side effects:\n+ * <ol>\n+ * <li>Creates a new keyspace {@code downgrading} in the cluster, with replication factor 3.\n+ * If a keyspace with this name already exists, it will be reused;</li>\n+ * <li>Creates a new table {@code downgrading.sensor_data}.\n+ * If a table with that name exists already, it will be reused;</li>\n+ * <li>Inserts a few rows, downgrading the consistency level if the operation fails;</li>\n+ * <li>Queries the table, downgrading the consistency level if the operation fails;</li>\n+ * <li>Displays the results on the console.</li>\n+ * </ol>\n+ * Notes:\n+ * <ul>\n+ * <li>The downgrading logic here is similar to what {@code DowngradingConsistencyRetryPolicy} does;\n+ * feel free to adapt it to your application needs;</li>\n+ * <li>You should never attempt to retry a non-idempotent write. See the driver's manual page on idempotence\n+ * for more information.</li>\n+ * </ul>\n+ *\n+ * @see <a href=\"http://datastax.github.io/java-driver/manual/\">Java driver online manual</a>\n+ */\n+@SuppressWarnings(\"deprecation\")\n+public class DowngradingRetry {\n+\n+    private static final String[] CONTACT_POINTS = {\"127.0.0.1\"};\n+\n+    private static final int PORT = 9042;\n+\n+    /**\n+     * The maximum number of retries to attempt.\n+     */\n+    private static final int MAX_RETRIES = 1;\n+\n+    /**\n+     * The initial consistency level to use.\n+     */\n+    private static final ConsistencyLevel INITIAL_CL = QUORUM;\n+\n+    public static void main(String[] args) {\n+\n+        DowngradingRetry client = new DowngradingRetry(MAX_RETRIES);\n+\n+        try {\n+\n+            client.connect(CONTACT_POINTS, PORT);\n+            client.createSchema();\n+            client.write(INITIAL_CL, 0);\n+            ResultSet rows = client.read(INITIAL_CL, 0);\n+            client.display(rows);\n+\n+        } finally {\n+            client.close();\n+        }\n+    }\n+\n+    private final int maxRetries;\n+\n+    private Cluster cluster;\n+    private Session session;\n+\n+    private DowngradingRetry(int maxRetries) {\n+        this.maxRetries = maxRetries;\n+    }\n+\n+    /**\n+     * Initiates a connection to the cluster specified by the given contact points and port.\n+     *\n+     * @param contactPoints the contact points to use.\n+     * @param port          the port to use.\n+     */\n+    private void connect(String[] contactPoints, int port) {\n+\n+        cluster = Cluster.builder()\n+                .addContactPoints(contactPoints).withPort(port)\n+                .build();\n+\n+        System.out.println(\"Connected to cluster: \" + cluster.getClusterName());\n+\n+        session = cluster.connect();\n+    }\n+\n+    /**\n+     * Creates the schema (keyspace) and table for this example.\n+     */\n+    private void createSchema() {\n+\n+        session.execute(\"CREATE KEYSPACE IF NOT EXISTS downgrading WITH replication \" +\n+                \"= {'class':'SimpleStrategy', 'replication_factor':3}\");\n+\n+        session.execute(\n+                \"CREATE TABLE IF NOT EXISTS downgrading.sensor_data (\" +\n+                        \"sensor_id uuid,\" +\n+                        \"date date,\" + // emulates bucketing by day\n+                        \"timestamp timestamp,\" +\n+                        \"value double,\" +\n+                        \"PRIMARY KEY ((sensor_id,date),timestamp)\" +\n+                        \")\");\n+\n+    }\n+\n+    /**\n+     * Inserts data, retrying if necessary with a downgraded CL.\n+     *\n+     * @param cl         the consistency level to apply.\n+     * @param retryCount the current retry count.\n+     * @throws DriverException if the current consistency level cannot be downgraded.\n+     */\n+    private void write(ConsistencyLevel cl, int retryCount) {\n+\n+        System.out.printf(\"Writing at %s (retry count: %d)%n\", cl, retryCount);\n+\n+        BatchStatement batch = new BatchStatement(UNLOGGED);\n+\n+        batch.add(new SimpleStatement(\"INSERT INTO downgrading.sensor_data \" +\n+                \"(sensor_id, date, timestamp, value) \" +\n+                \"VALUES (\" +\n+                \"756716f7-2e54-4715-9f00-91dcbea6cf50,\" +\n+                \"'2018-02-26',\" +\n+                \"'2018-02-26T13:53:46.345+01:00',\" +\n+                \"2.34)\"));\n+\n+        batch.add(new SimpleStatement(\"INSERT INTO downgrading.sensor_data \" +\n+                \"(sensor_id, date, timestamp, value) \" +\n+                \"VALUES (\" +\n+                \"756716f7-2e54-4715-9f00-91dcbea6cf50,\" +\n+                \"'2018-02-26',\" +\n+                \"'2018-02-26T13:54:27.488+01:00',\" +\n+                \"2.47)\"));\n+\n+        batch.add(new SimpleStatement(\"INSERT INTO downgrading.sensor_data \" +\n+                \"(sensor_id, date, timestamp, value) \" +\n+                \"VALUES (\" +\n+                \"756716f7-2e54-4715-9f00-91dcbea6cf50,\" +\n+                \"'2018-02-26',\" +\n+                \"'2018-02-26T13:56:33.739+01:00',\" +\n+                \"2.52)\"));\n+\n+        batch.setConsistencyLevel(cl);\n+\n+        try {\n+\n+            session.execute(batch);\n+            System.out.println(\"Write succeeded at \" + cl);\n+\n+        } catch (DriverException e) {\n+\n+            if (retryCount == maxRetries) {\n+                throw e;\n+            }\n+\n+            e = unwrapNoHostAvailableException(e);\n+\n+            System.out.println(\"Write failed: \" + e);\n+\n+            // General intent:\n+            // 1) If we know the write has been fully persisted on at least one replica,\n+            // ignore the exception since the write will be eventually propagated to other replicas.\n+            // 2) If the write couldn't be persisted at all, abort as it is unlikely that a retry would succeed.\n+            // 3) If the write was only partially persisted, retry at the highest consistency\n+            // level that is likely to succeed.\n+\n+            if (e instanceof UnavailableException) {\n+\n+                // With an UnavailableException, we know that nothing has been persisted.\n+                // Downgrade to the number of replicas reported alive and retry.\n+                int aliveReplicas = ((UnavailableException) e).getAliveReplicas();\n+\n+                ConsistencyLevel downgraded = downgrade(cl, aliveReplicas, e);\n+                write(downgraded, retryCount + 1);\n+\n+            } else if (e instanceof WriteTimeoutException) {\n+\n+                WriteType writeType = ((WriteTimeoutException) e).getWriteType();\n+                int acknowledgements = ((WriteTimeoutException) e).getReceivedAcknowledgements();\n+\n+                switch (writeType) {\n+\n+                    case SIMPLE:\n+                    case BATCH:\n+                        // For simple and batch writes, as long as one replica acknowledged the write,\n+                        // ignore the exception; if none responded however, abort as it is unlikely that\n+                        // a retry would ever succeed.\n+                        if (acknowledgements == 0) {\n+                            throw e;\n+                        }\n+                        break;\n+\n+                    case UNLOGGED_BATCH:\n+                        // For unlogged batches, the write might have been persisted only partially,\n+                        // so we can't simply ignore the exception: instead, we need to retry with\n+                        // consistency level equal to the number of acknowledged writes.\n+                        ConsistencyLevel downgraded = downgrade(cl, acknowledgements, e);\n+                        write(downgraded, retryCount + 1);\n+                        break;\n+\n+                    case BATCH_LOG:\n+                        // Rare edge case: the peers that were chosen by the coordinator\n+                        // to receive the distributed batch log failed to respond.\n+                        // Simply retry with same consistency level.\n+                        write(cl, retryCount + 1);\n+                        break;\n+\n+                    default:\n+                        // Other write types are uncommon and should not be retried.\n+                        throw e;\n+                }\n+\n+            } else {\n+\n+                // Unexpected error: just retry with same consistency level\n+                // and hope to talk to a healthier coordinator.\n+                write(cl, retryCount + 1);\n+\n+            }\n+\n+        }\n+    }\n+\n+    /**\n+     * Queries data, retrying if necessary with a downgraded CL.\n+     *\n+     * @param cl         the consistency level to apply.\n+     * @param retryCount the current retry count.\n+     * @throws DriverException if the current consistency level cannot be downgraded.\n+     */\n+    private ResultSet read(ConsistencyLevel cl, int retryCount) {\n+\n+        System.out.printf(\"Reading at %s (retry count: %d)%n\", cl, retryCount);\n+\n+        Statement stmt = new SimpleStatement(\"SELECT sensor_id, date, timestamp, value \" +\n+                \"FROM downgrading.sensor_data \" +\n+                \"WHERE \" +\n+                \"sensor_id = 756716f7-2e54-4715-9f00-91dcbea6cf50 AND \" +\n+                \"date = '2018-02-26' AND \" +\n+                \"timestamp > '2018-02-26+01:00'\")\n+                .setConsistencyLevel(cl);\n+\n+        try {\n+\n+            ResultSet rows = session.execute(stmt);\n+            System.out.println(\"Read succeeded at \" + cl);\n+            return rows;\n+\n+        } catch (DriverException e) {\n+\n+            if (retryCount == maxRetries) {\n+                throw e;\n+            }\n+\n+            e = unwrapNoHostAvailableException(e);\n+\n+            System.out.println(\"Read failed: \" + e);\n+\n+            // General intent: downgrade and retry at the highest consistency level\n+            // that is likely to succeed.\n+\n+            if (e instanceof UnavailableException) {\n+\n+                // Downgrade to the number of replicas reported alive and retry.\n+                int aliveReplicas = ((UnavailableException) e).getAliveReplicas();\n+\n+                ConsistencyLevel downgraded = downgrade(cl, aliveReplicas, e);\n+                return read(downgraded, retryCount + 1);\n+\n+            } else if (e instanceof ReadTimeoutException) {\n+\n+                ReadTimeoutException readTimeout = (ReadTimeoutException) e;\n+                int received = readTimeout.getReceivedAcknowledgements();\n+                int required = readTimeout.getRequiredAcknowledgements();\n+\n+                // If fewer replicas responded than required by the consistency level\n+                // (but at least one replica did respond), retry with a consistency level\n+                // equal to the number of received acknowledgements.\n+                if (received < required) {\n+\n+                    ConsistencyLevel downgraded = downgrade(cl, received, e);\n+                    return read(downgraded, retryCount + 1);\n+\n+                }\n+\n+                // If we received enough replies to meet the consistency level,\n+                // but the actual data was not present among the received responses,\n+                // then retry with the initial consistency level, we might be luckier next time\n+                // and get the data back.\n+                if (!readTimeout.wasDataRetrieved()) {\n+\n+                    return read(cl, retryCount + 1);\n+\n+                }\n+\n+                // Otherwise, abort since the read timeout is unlikely to be solved by a retry.\n+                throw e;","path":"driver-examples/src/main/java/com/datastax/driver/examples/retry/DowngradingRetry.java","position":338,"original_position":338,"commit_id":"0d98843e89b92bd8a7a90bef735023fa67d6c84a","original_commit_id":"0d98843e89b92bd8a7a90bef735023fa67d6c84a","user":{"login":"adutra","id":463876,"avatar_url":"https://avatars3.githubusercontent.com/u/463876?v=4","gravatar_id":"","url":"https://api.github.com/users/adutra","html_url":"https://github.com/adutra","followers_url":"https://api.github.com/users/adutra/followers","following_url":"https://api.github.com/users/adutra/following{/other_user}","gists_url":"https://api.github.com/users/adutra/gists{/gist_id}","starred_url":"https://api.github.com/users/adutra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adutra/subscriptions","organizations_url":"https://api.github.com/users/adutra/orgs","repos_url":"https://api.github.com/users/adutra/repos","events_url":"https://api.github.com/users/adutra/events{/privacy}","received_events_url":"https://api.github.com/users/adutra/received_events","type":"User","site_admin":false},"body":"A question came to my mind while writing this example: in which circumstances can we get here? If we got the data and enough acks, how can the read timeout?","created_at":"2018-02-27T14:25:06Z","updated_at":"2018-02-27T14:25:06Z","html_url":"https://github.com/datastax/java-driver/pull/962#discussion_r170937649","pull_request_url":"https://api.github.com/repos/datastax/java-driver/pulls/962","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/comments/170937649"},"html":{"href":"https://github.com/datastax/java-driver/pull/962#discussion_r170937649"},"pull_request":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/962"}}},"pull_request":{"url":"https://api.github.com/repos/datastax/java-driver/pulls/962","id":171460890,"html_url":"https://github.com/datastax/java-driver/pull/962","diff_url":"https://github.com/datastax/java-driver/pull/962.diff","patch_url":"https://github.com/datastax/java-driver/pull/962.patch","issue_url":"https://api.github.com/repos/datastax/java-driver/issues/962","number":962,"state":"open","locked":false,"title":"JAVA-1752: Deprecate DowngradingConsistencyRetryPolicy","user":{"login":"adutra","id":463876,"avatar_url":"https://avatars3.githubusercontent.com/u/463876?v=4","gravatar_id":"","url":"https://api.github.com/users/adutra","html_url":"https://github.com/adutra","followers_url":"https://api.github.com/users/adutra/followers","following_url":"https://api.github.com/users/adutra/following{/other_user}","gists_url":"https://api.github.com/users/adutra/gists{/gist_id}","starred_url":"https://api.github.com/users/adutra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adutra/subscriptions","organizations_url":"https://api.github.com/users/adutra/orgs","repos_url":"https://api.github.com/users/adutra/repos","events_url":"https://api.github.com/users/adutra/events{/privacy}","received_events_url":"https://api.github.com/users/adutra/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-02-26T18:55:18Z","updated_at":"2018-02-27T14:25:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5e70613872324f329cd4e1487ae2088118bf45af","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/datastax/java-driver/milestones/32","html_url":"https://github.com/datastax/java-driver/milestone/32","labels_url":"https://api.github.com/repos/datastax/java-driver/milestones/32/labels","id":3084597,"number":32,"title":"3.5.0","description":null,"creator":{"login":"olim7t","id":259423,"avatar_url":"https://avatars2.githubusercontent.com/u/259423?v=4","gravatar_id":"","url":"https://api.github.com/users/olim7t","html_url":"https://github.com/olim7t","followers_url":"https://api.github.com/users/olim7t/followers","following_url":"https://api.github.com/users/olim7t/following{/other_user}","gists_url":"https://api.github.com/users/olim7t/gists{/gist_id}","starred_url":"https://api.github.com/users/olim7t/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olim7t/subscriptions","organizations_url":"https://api.github.com/users/olim7t/orgs","repos_url":"https://api.github.com/users/olim7t/repos","events_url":"https://api.github.com/users/olim7t/events{/privacy}","received_events_url":"https://api.github.com/users/olim7t/received_events","type":"User","site_admin":false},"open_issues":10,"closed_issues":0,"state":"open","created_at":"2018-02-02T18:20:27Z","updated_at":"2018-02-26T18:55:18Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/datastax/java-driver/pulls/962/commits","review_comments_url":"https://api.github.com/repos/datastax/java-driver/pulls/962/comments","review_comment_url":"https://api.github.com/repos/datastax/java-driver/pulls/comments{/number}","comments_url":"https://api.github.com/repos/datastax/java-driver/issues/962/comments","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/0d98843e89b92bd8a7a90bef735023fa67d6c84a","head":{"label":"datastax:java1752","ref":"java1752","sha":"0d98843e89b92bd8a7a90bef735023fa67d6c84a","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars0.githubusercontent.com/u/573369?v=4","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":6765281,"name":"java-driver","full_name":"datastax/java-driver","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars0.githubusercontent.com/u/573369?v=4","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/java-driver","description":"DataStax Java Driver for Apache Cassandra","fork":false,"url":"https://api.github.com/repos/datastax/java-driver","forks_url":"https://api.github.com/repos/datastax/java-driver/forks","keys_url":"https://api.github.com/repos/datastax/java-driver/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/java-driver/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/java-driver/teams","hooks_url":"https://api.github.com/repos/datastax/java-driver/hooks","issue_events_url":"https://api.github.com/repos/datastax/java-driver/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/java-driver/events","assignees_url":"https://api.github.com/repos/datastax/java-driver/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/java-driver/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/java-driver/tags","blobs_url":"https://api.github.com/repos/datastax/java-driver/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/java-driver/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/java-driver/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/java-driver/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/java-driver/languages","stargazers_url":"https://api.github.com/repos/datastax/java-driver/stargazers","contributors_url":"https://api.github.com/repos/datastax/java-driver/contributors","subscribers_url":"https://api.github.com/repos/datastax/java-driver/subscribers","subscription_url":"https://api.github.com/repos/datastax/java-driver/subscription","commits_url":"https://api.github.com/repos/datastax/java-driver/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/java-driver/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/java-driver/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/java-driver/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/java-driver/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/java-driver/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/java-driver/merges","archive_url":"https://api.github.com/repos/datastax/java-driver/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/java-driver/downloads","issues_url":"https://api.github.com/repos/datastax/java-driver/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/java-driver/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/java-driver/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/java-driver/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/java-driver/labels{/name}","releases_url":"https://api.github.com/repos/datastax/java-driver/releases{/id}","deployments_url":"https://api.github.com/repos/datastax/java-driver/deployments","created_at":"2012-11-19T18:44:41Z","updated_at":"2018-02-25T21:41:40Z","pushed_at":"2018-02-27T14:24:03Z","git_url":"git://github.com/datastax/java-driver.git","ssh_url":"git@github.com:datastax/java-driver.git","clone_url":"https://github.com/datastax/java-driver.git","svn_url":"https://github.com/datastax/java-driver","homepage":null,"size":27298,"stargazers_count":901,"watchers_count":901,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":635,"mirror_url":null,"archived":false,"open_issues_count":23,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":635,"open_issues":23,"watchers":901,"default_branch":"3.x"}},"base":{"label":"datastax:3.x","ref":"3.x","sha":"57724bd63c3038e3728260c7640abcea06f33b86","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars0.githubusercontent.com/u/573369?v=4","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":6765281,"name":"java-driver","full_name":"datastax/java-driver","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars0.githubusercontent.com/u/573369?v=4","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/java-driver","description":"DataStax Java Driver for Apache Cassandra","fork":false,"url":"https://api.github.com/repos/datastax/java-driver","forks_url":"https://api.github.com/repos/datastax/java-driver/forks","keys_url":"https://api.github.com/repos/datastax/java-driver/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/java-driver/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/java-driver/teams","hooks_url":"https://api.github.com/repos/datastax/java-driver/hooks","issue_events_url":"https://api.github.com/repos/datastax/java-driver/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/java-driver/events","assignees_url":"https://api.github.com/repos/datastax/java-driver/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/java-driver/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/java-driver/tags","blobs_url":"https://api.github.com/repos/datastax/java-driver/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/java-driver/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/java-driver/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/java-driver/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/java-driver/languages","stargazers_url":"https://api.github.com/repos/datastax/java-driver/stargazers","contributors_url":"https://api.github.com/repos/datastax/java-driver/contributors","subscribers_url":"https://api.github.com/repos/datastax/java-driver/subscribers","subscription_url":"https://api.github.com/repos/datastax/java-driver/subscription","commits_url":"https://api.github.com/repos/datastax/java-driver/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/java-driver/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/java-driver/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/java-driver/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/java-driver/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/java-driver/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/java-driver/merges","archive_url":"https://api.github.com/repos/datastax/java-driver/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/java-driver/downloads","issues_url":"https://api.github.com/repos/datastax/java-driver/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/java-driver/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/java-driver/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/java-driver/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/java-driver/labels{/name}","releases_url":"https://api.github.com/repos/datastax/java-driver/releases{/id}","deployments_url":"https://api.github.com/repos/datastax/java-driver/deployments","created_at":"2012-11-19T18:44:41Z","updated_at":"2018-02-25T21:41:40Z","pushed_at":"2018-02-27T14:24:03Z","git_url":"git://github.com/datastax/java-driver.git","ssh_url":"git@github.com:datastax/java-driver.git","clone_url":"https://github.com/datastax/java-driver.git","svn_url":"https://github.com/datastax/java-driver","homepage":null,"size":27298,"stargazers_count":901,"watchers_count":901,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":635,"mirror_url":null,"archived":false,"open_issues_count":23,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":635,"open_issues":23,"watchers":901,"default_branch":"3.x"}},"_links":{"self":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/962"},"html":{"href":"https://github.com/datastax/java-driver/pull/962"},"issue":{"href":"https://api.github.com/repos/datastax/java-driver/issues/962"},"comments":{"href":"https://api.github.com/repos/datastax/java-driver/issues/962/comments"},"review_comments":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/962/comments"},"review_comment":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/962/commits"},"statuses":{"href":"https://api.github.com/repos/datastax/java-driver/statuses/0d98843e89b92bd8a7a90bef735023fa67d6c84a"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"adutra"}}