{"action":"created","comment":{"url":"https://api.github.com/repos/openebs/istgt/pulls/comments/191240193","pull_request_review_id":123730663,"id":191240193,"diff_hunk":"@@ -448,6 +449,245 @@ send_replica_handshake_query(replica_t *replica, spec_t *spec)\n \treturn 0;\n }\n \n+/*\n+ * This function handles the response for SNAP_CREATE opcode.\n+ * In case of timeout, when the thread that triggered snapshot goes away,\n+ * this function handles deletion of rcommon_mgmt_cmd_t once all the responses\n+ * are received\n+ */\n+static void\n+handle_snap_create_resp(replica_t *replica, mgmt_cmd_t *mgmt_cmd)\n+{\n+\tzvol_io_hdr_t *hdr = replica->mgmt_io_resp_hdr;\n+\trcommon_mgmt_cmd_t *rcomm_mgmt = mgmt_cmd->rcomm_mgmt;\n+\tbool delete = false;\n+\tMTX_LOCK(&rcomm_mgmt->mtx);\n+\tif (hdr->status != ZVOL_OP_STATUS_OK)\n+\t\trcomm_mgmt->cmds_failed++;\n+\telse\n+\t\trcomm_mgmt->cmds_succeeded++;\n+\tif ((rcomm_mgmt->caller_gone == 1) &&\n+\t    (rcomm_mgmt->cmds_sent == (rcomm_mgmt->cmds_failed + rcomm_mgmt->cmds_succeeded)))\n+\t\tdelete = true;\n+\tMTX_UNLOCK(&rcomm_mgmt->mtx);\n+\tif (delete == true)\n+\t\tfree(rcomm_mgmt);\n+}\n+\n+static int\n+send_replica_snapshot(spec_t *spec, replica_t *replica, char *snapname, zvol_op_code_t opcode, rcommon_mgmt_cmd_t *rcomm_mgmt)\n+{\n+\tzvol_io_hdr_t *rmgmtio = NULL;\n+\tsize_t data_len;\n+\tchar *data;\n+\tzvol_op_code_t mgmt_opcode = opcode;\n+\tmgmt_cmd_t *mgmt_cmd;\n+\tuint64_t num = 1;\n+\tint ret = 0;\n+\n+\tmgmt_cmd = malloc(sizeof(mgmt_cmd_t));\n+\tmgmt_cmd->rcomm_mgmt = rcomm_mgmt;\n+\tdata_len = strlen(spec->lu->volname) + strlen(snapname) + 2;\n+\n+\tBUILD_REPLICA_MGMT_HDR(rmgmtio, mgmt_opcode, data_len);\n+\n+\tdata = (char *)malloc(data_len);\n+\tsnprintf(data, data_len, \"%s@%s\", spec->lu->volname, snapname);\n+\n+\tmgmt_cmd->io_hdr = rmgmtio;\n+\tmgmt_cmd->io_bytes = 0;\n+\tmgmt_cmd->data = data;\n+\tmgmt_cmd->mgmt_cmd_state = WRITE_IO_SEND_HDR;\n+\n+\tMTX_LOCK(&replica->r_mtx);\n+\t//TODO: Add it as the second IO, rather than tailing\n+\tTAILQ_INSERT_TAIL(&replica->mgmt_cmd_queue, mgmt_cmd, mgmt_cmd_next);\n+\tMTX_UNLOCK(&replica->r_mtx);\n+\n+\tif (rcomm_mgmt != NULL)\n+\t\trcomm_mgmt->cmds_sent++;\n+\n+\tif (write(replica->mgmt_eventfd1, &num, sizeof (num)) != sizeof (num)) {\n+\t\tREPLICA_NOTICELOG(\"Failed to inform to mgmt_eventfd for replica(%p)\\n\", replica);\n+\t\tret = -1;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+/*\n+static bool\n+any_ongoing_snapshot_command(spec_t *spec)\n+{\n+\treplica_t *replica;\n+\tmgmt_cmd_t *cmd;\n+\tMTX_LOCK(&spec->rq_mtx);\n+\tTAILQ_FOREACH(replica, &spec->rq, r_next) {\n+\t\tMTX_LOCK(&replica->r_mtx);\n+\t\tTAILQ_FOREACH(cmd, &replica->mgmt_cmd_queue, mgmt_cmd_next) {\n+\t\t\tif (cmd->io_hdr->opcode == ZVOL_OPCODE_SNAP_CREATE) {\n+\t\t\t\tMTX_UNLOCK(&replica->r_mtx);\n+\t\t\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\t\t\treturn true;\n+\t\t\t}\n+\t\t}\n+\t\tMTX_UNLOCK(&replica->r_mtx);\n+\t}\n+\tMTX_UNLOCK(&spec->rq_mtx);\n+\treturn false;\n+}\n+*/\n+\n+static int\n+is_volume_healthy(spec_t *spec)\n+{\n+\tif (spec->healthy_rcount != spec->replication_factor)\n+\t\treturn false;\n+\treturn true;\n+}\n+\n+/*\n+ * This function quiesces write IOs, waits for ongoing write IOs\n+ * If volume is not healthy or timeout happens while waiting for ongoing IOs,\n+ * write IOs will be allowed, and false will be returned.\n+ * If there are no pending write IOs and volume is healthy, true will be returned.\n+ * rq_mtx is required to be held by caller\n+ */\n+static bool\n+pause_and_timed_wait_for_ongoing_ios(spec_t *spec, int sec)\n+{\n+\tstruct timespec last, now, diff;\n+\tbool ret = false;\n+\tbool write_io_found = false;\n+\treplica_t *replica;\n+\n+\tspec->lu->quiesce = 1;\n+\n+\tclock_gettime(CLOCK_MONOTONIC, &last);\n+\ttimesdiff(last, now, diff);\n+\n+\twhile ((diff.tv_sec < sec) && (is_volume_healthy(spec) == true)) {\n+\t\twrite_io_found = false;\n+\t\tTAILQ_FOREACH(replica, &spec->rq, r_next) {\n+\t\t\tif (replica->inflight_write_io_cnt != 0) {\n+\t\t\t\twrite_io_found = true;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (write_io_found == false) {\n+\t\t\tif (spec->inflight_write_io_cnt != 0) {\n+\t\t\t\twrite_io_found = true;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (write_io_found == false) {\n+\t\t\tret = true;\n+\t\t\tbreak;\n+\t\t}\n+\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\tsleep (1);\n+\t\tMTX_LOCK(&spec->rq_mtx);\n+\t\ttimesdiff(last, now, diff);\n+\t}\n+\n+\tif (ret == false)\n+\t\tspec->lu->quiesce = 0;\n+\n+\treturn ret;\n+}\n+\n+int istgt_lu_destroy_snapshot(spec_t *spec, char *snapname)\n+{\n+\treplica_t *replica;\n+\tTAILQ_FOREACH(replica, &spec->rq, r_next)\n+\t\tsend_replica_snapshot(spec, replica, snapname, ZVOL_OPCODE_SNAP_DESTROY, NULL);\n+\treturn true;\n+}\n+\n+/*\n+ * This API will create snapshot with given name on the spec.\n+ * It will wait for io_wait_time seconds to complete ongoing IOs.\n+ * Overall, this API will wait for wait_time seconds to get response\n+ * for snapshot command (this includes io_wait_time).\n+ * In case of any failures, snapshot destroy command will be sent to all replicas.\n+ */\n+int istgt_lu_create_snapshot(spec_t *spec, char *snapname, int io_wait_time, int wait_time)\n+{\n+\tbool r;\n+\treplica_t *replica;\n+\tint free_rcomm_mgmt = 0;\n+\tstruct timespec last, now, diff;\n+\tstruct rcommon_mgmt_cmd *rcomm_mgmt;\n+\tint rc;\n+\n+\tclock_gettime(CLOCK_MONOTONIC, &last);\n+\tMTX_LOCK(&spec->rq_mtx);\n+\n+\tif (is_volume_healthy(spec) == false) {","path":"src/replication.c","position":195,"original_position":195,"commit_id":"d5f8d98ab6c61de02b04f3fea59a9c72fc60a7be","original_commit_id":"d5f8d98ab6c61de02b04f3fea59a9c72fc60a7be","user":{"login":"satbirchhikara","id":34478047,"avatar_url":"https://avatars2.githubusercontent.com/u/34478047?v=4","gravatar_id":"","url":"https://api.github.com/users/satbirchhikara","html_url":"https://github.com/satbirchhikara","followers_url":"https://api.github.com/users/satbirchhikara/followers","following_url":"https://api.github.com/users/satbirchhikara/following{/other_user}","gists_url":"https://api.github.com/users/satbirchhikara/gists{/gist_id}","starred_url":"https://api.github.com/users/satbirchhikara/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/satbirchhikara/subscriptions","organizations_url":"https://api.github.com/users/satbirchhikara/orgs","repos_url":"https://api.github.com/users/satbirchhikara/repos","events_url":"https://api.github.com/users/satbirchhikara/events{/privacy}","received_events_url":"https://api.github.com/users/satbirchhikara/received_events","type":"User","site_admin":false},"body":"You can move volume healthy check in func pause_and_timed_wait_for_ongoing_ios and so does MTX_LOCK. At line 587, we are unlocking it without locking it in the same scope which is little difficult to maintain going forward. ","created_at":"2018-05-28T16:09:49Z","updated_at":"2018-05-28T16:13:09Z","html_url":"https://github.com/openebs/istgt/pull/26#discussion_r191240193","pull_request_url":"https://api.github.com/repos/openebs/istgt/pulls/26","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/openebs/istgt/pulls/comments/191240193"},"html":{"href":"https://github.com/openebs/istgt/pull/26#discussion_r191240193"},"pull_request":{"href":"https://api.github.com/repos/openebs/istgt/pulls/26"}}},"pull_request":{"url":"https://api.github.com/repos/openebs/istgt/pulls/26","id":190912960,"html_url":"https://github.com/openebs/istgt/pull/26","diff_url":"https://github.com/openebs/istgt/pull/26.diff","patch_url":"https://github.com/openebs/istgt/pull/26.patch","issue_url":"https://api.github.com/repos/openebs/istgt/issues/26","number":26,"state":"open","locked":false,"title":"[US1537] snapshot related tasks","user":{"login":"vishnuitta","id":25415415,"avatar_url":"https://avatars2.githubusercontent.com/u/25415415?v=4","gravatar_id":"","url":"https://api.github.com/users/vishnuitta","html_url":"https://github.com/vishnuitta","followers_url":"https://api.github.com/users/vishnuitta/followers","following_url":"https://api.github.com/users/vishnuitta/following{/other_user}","gists_url":"https://api.github.com/users/vishnuitta/gists{/gist_id}","starred_url":"https://api.github.com/users/vishnuitta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishnuitta/subscriptions","organizations_url":"https://api.github.com/users/vishnuitta/orgs","repos_url":"https://api.github.com/users/vishnuitta/repos","events_url":"https://api.github.com/users/vishnuitta/events{/privacy}","received_events_url":"https://api.github.com/users/vishnuitta/received_events","type":"User","site_admin":false},"body":"This PR addresses the below snapshot related tasks:\r\n\r\n    implement 'snapcreate' and 'snapdestroy' options for istgtcontrol\r\n    API to pause write IOs, waits for any ongoing write IOs to finish\r\n    API to send snapshot create/destroy commands to replica\r\n    API to create and destroy snapshots by using all above functions\r\n\r\nTestcases for this feature\r\n\r\n    Verifying if volume exists for correct volname\r\n    Verifying if volume does not exist for wrong volname\r\n    Verifying status of volume as degraded with less number of replicas connected\r\n    Verifying volume state is healthy with required number of replicas connected and being in healthy state\r\n    Hitting the case of timeout while waiting for ongoing write IOs being served, and verify that write IOs are resumed and error is returned from API\r\n    Verifying that configured amount of time has not been passed by the time snapshot IO is being sent\r\n    Hit the case of adding snapshot command to the list, and verify command is sent eventually\r\n    Verify that snapshots are destroyed in case of one or multiple failures from replica\r\n    Verify that write IOs are resumed in case of one or multiple failures from replica\r\n    Hit the case of timeout while waiting for snapshot response(s) and verify that write IOs are resumed, snapshots are destroyed and error is returned\r\n    Verify success case of creating snapshot, write IOs are resumed and returned 0 as success from API\r\n\r\nCreated \"TS2\" in rally to track more testcases.","created_at":"2018-05-28T12:02:06Z","updated_at":"2018-05-28T16:13:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"29be78af304dfbb2b2d10c1da4f01048b2896431","assignee":null,"assignees":[],"requested_reviewers":[{"login":"mynktl","id":33252549,"avatar_url":"https://avatars2.githubusercontent.com/u/33252549?v=4","gravatar_id":"","url":"https://api.github.com/users/mynktl","html_url":"https://github.com/mynktl","followers_url":"https://api.github.com/users/mynktl/followers","following_url":"https://api.github.com/users/mynktl/following{/other_user}","gists_url":"https://api.github.com/users/mynktl/gists{/gist_id}","starred_url":"https://api.github.com/users/mynktl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mynktl/subscriptions","organizations_url":"https://api.github.com/users/mynktl/orgs","repos_url":"https://api.github.com/users/mynktl/repos","events_url":"https://api.github.com/users/mynktl/events{/privacy}","received_events_url":"https://api.github.com/users/mynktl/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/openebs/istgt/pulls/26/commits","review_comments_url":"https://api.github.com/repos/openebs/istgt/pulls/26/comments","review_comment_url":"https://api.github.com/repos/openebs/istgt/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openebs/istgt/issues/26/comments","statuses_url":"https://api.github.com/repos/openebs/istgt/statuses/d5f8d98ab6c61de02b04f3fea59a9c72fc60a7be","head":{"label":"openebs:snapshot-1","ref":"snapshot-1","sha":"d5f8d98ab6c61de02b04f3fea59a9c72fc60a7be","user":{"login":"openebs","id":20769039,"avatar_url":"https://avatars0.githubusercontent.com/u/20769039?v=4","gravatar_id":"","url":"https://api.github.com/users/openebs","html_url":"https://github.com/openebs","followers_url":"https://api.github.com/users/openebs/followers","following_url":"https://api.github.com/users/openebs/following{/other_user}","gists_url":"https://api.github.com/users/openebs/gists{/gist_id}","starred_url":"https://api.github.com/users/openebs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openebs/subscriptions","organizations_url":"https://api.github.com/users/openebs/orgs","repos_url":"https://api.github.com/users/openebs/repos","events_url":"https://api.github.com/users/openebs/events{/privacy}","received_events_url":"https://api.github.com/users/openebs/received_events","type":"Organization","site_admin":false},"repo":{"id":123117757,"name":"istgt","full_name":"openebs/istgt","owner":{"login":"openebs","id":20769039,"avatar_url":"https://avatars0.githubusercontent.com/u/20769039?v=4","gravatar_id":"","url":"https://api.github.com/users/openebs","html_url":"https://github.com/openebs","followers_url":"https://api.github.com/users/openebs/followers","following_url":"https://api.github.com/users/openebs/following{/other_user}","gists_url":"https://api.github.com/users/openebs/gists{/gist_id}","starred_url":"https://api.github.com/users/openebs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openebs/subscriptions","organizations_url":"https://api.github.com/users/openebs/orgs","repos_url":"https://api.github.com/users/openebs/repos","events_url":"https://api.github.com/users/openebs/events{/privacy}","received_events_url":"https://api.github.com/users/openebs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openebs/istgt","description":null,"fork":false,"url":"https://api.github.com/repos/openebs/istgt","forks_url":"https://api.github.com/repos/openebs/istgt/forks","keys_url":"https://api.github.com/repos/openebs/istgt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openebs/istgt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openebs/istgt/teams","hooks_url":"https://api.github.com/repos/openebs/istgt/hooks","issue_events_url":"https://api.github.com/repos/openebs/istgt/issues/events{/number}","events_url":"https://api.github.com/repos/openebs/istgt/events","assignees_url":"https://api.github.com/repos/openebs/istgt/assignees{/user}","branches_url":"https://api.github.com/repos/openebs/istgt/branches{/branch}","tags_url":"https://api.github.com/repos/openebs/istgt/tags","blobs_url":"https://api.github.com/repos/openebs/istgt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openebs/istgt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openebs/istgt/git/refs{/sha}","trees_url":"https://api.github.com/repos/openebs/istgt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openebs/istgt/statuses/{sha}","languages_url":"https://api.github.com/repos/openebs/istgt/languages","stargazers_url":"https://api.github.com/repos/openebs/istgt/stargazers","contributors_url":"https://api.github.com/repos/openebs/istgt/contributors","subscribers_url":"https://api.github.com/repos/openebs/istgt/subscribers","subscription_url":"https://api.github.com/repos/openebs/istgt/subscription","commits_url":"https://api.github.com/repos/openebs/istgt/commits{/sha}","git_commits_url":"https://api.github.com/repos/openebs/istgt/git/commits{/sha}","comments_url":"https://api.github.com/repos/openebs/istgt/comments{/number}","issue_comment_url":"https://api.github.com/repos/openebs/istgt/issues/comments{/number}","contents_url":"https://api.github.com/repos/openebs/istgt/contents/{+path}","compare_url":"https://api.github.com/repos/openebs/istgt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openebs/istgt/merges","archive_url":"https://api.github.com/repos/openebs/istgt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openebs/istgt/downloads","issues_url":"https://api.github.com/repos/openebs/istgt/issues{/number}","pulls_url":"https://api.github.com/repos/openebs/istgt/pulls{/number}","milestones_url":"https://api.github.com/repos/openebs/istgt/milestones{/number}","notifications_url":"https://api.github.com/repos/openebs/istgt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openebs/istgt/labels{/name}","releases_url":"https://api.github.com/repos/openebs/istgt/releases{/id}","deployments_url":"https://api.github.com/repos/openebs/istgt/deployments","created_at":"2018-02-27T11:10:49Z","updated_at":"2018-05-26T14:27:59Z","pushed_at":"2018-05-28T13:51:33Z","git_url":"git://github.com/openebs/istgt.git","ssh_url":"git@github.com:openebs/istgt.git","clone_url":"https://github.com/openebs/istgt.git","svn_url":"https://github.com/openebs/istgt","homepage":null,"size":779,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":6,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":7,"open_issues":6,"watchers":1,"default_branch":"master"}},"base":{"label":"openebs:replication","ref":"replication","sha":"6dd3ca200e17935db1f684a696e86d2d0d8beb8c","user":{"login":"openebs","id":20769039,"avatar_url":"https://avatars0.githubusercontent.com/u/20769039?v=4","gravatar_id":"","url":"https://api.github.com/users/openebs","html_url":"https://github.com/openebs","followers_url":"https://api.github.com/users/openebs/followers","following_url":"https://api.github.com/users/openebs/following{/other_user}","gists_url":"https://api.github.com/users/openebs/gists{/gist_id}","starred_url":"https://api.github.com/users/openebs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openebs/subscriptions","organizations_url":"https://api.github.com/users/openebs/orgs","repos_url":"https://api.github.com/users/openebs/repos","events_url":"https://api.github.com/users/openebs/events{/privacy}","received_events_url":"https://api.github.com/users/openebs/received_events","type":"Organization","site_admin":false},"repo":{"id":123117757,"name":"istgt","full_name":"openebs/istgt","owner":{"login":"openebs","id":20769039,"avatar_url":"https://avatars0.githubusercontent.com/u/20769039?v=4","gravatar_id":"","url":"https://api.github.com/users/openebs","html_url":"https://github.com/openebs","followers_url":"https://api.github.com/users/openebs/followers","following_url":"https://api.github.com/users/openebs/following{/other_user}","gists_url":"https://api.github.com/users/openebs/gists{/gist_id}","starred_url":"https://api.github.com/users/openebs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openebs/subscriptions","organizations_url":"https://api.github.com/users/openebs/orgs","repos_url":"https://api.github.com/users/openebs/repos","events_url":"https://api.github.com/users/openebs/events{/privacy}","received_events_url":"https://api.github.com/users/openebs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openebs/istgt","description":null,"fork":false,"url":"https://api.github.com/repos/openebs/istgt","forks_url":"https://api.github.com/repos/openebs/istgt/forks","keys_url":"https://api.github.com/repos/openebs/istgt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openebs/istgt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openebs/istgt/teams","hooks_url":"https://api.github.com/repos/openebs/istgt/hooks","issue_events_url":"https://api.github.com/repos/openebs/istgt/issues/events{/number}","events_url":"https://api.github.com/repos/openebs/istgt/events","assignees_url":"https://api.github.com/repos/openebs/istgt/assignees{/user}","branches_url":"https://api.github.com/repos/openebs/istgt/branches{/branch}","tags_url":"https://api.github.com/repos/openebs/istgt/tags","blobs_url":"https://api.github.com/repos/openebs/istgt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openebs/istgt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openebs/istgt/git/refs{/sha}","trees_url":"https://api.github.com/repos/openebs/istgt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openebs/istgt/statuses/{sha}","languages_url":"https://api.github.com/repos/openebs/istgt/languages","stargazers_url":"https://api.github.com/repos/openebs/istgt/stargazers","contributors_url":"https://api.github.com/repos/openebs/istgt/contributors","subscribers_url":"https://api.github.com/repos/openebs/istgt/subscribers","subscription_url":"https://api.github.com/repos/openebs/istgt/subscription","commits_url":"https://api.github.com/repos/openebs/istgt/commits{/sha}","git_commits_url":"https://api.github.com/repos/openebs/istgt/git/commits{/sha}","comments_url":"https://api.github.com/repos/openebs/istgt/comments{/number}","issue_comment_url":"https://api.github.com/repos/openebs/istgt/issues/comments{/number}","contents_url":"https://api.github.com/repos/openebs/istgt/contents/{+path}","compare_url":"https://api.github.com/repos/openebs/istgt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openebs/istgt/merges","archive_url":"https://api.github.com/repos/openebs/istgt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openebs/istgt/downloads","issues_url":"https://api.github.com/repos/openebs/istgt/issues{/number}","pulls_url":"https://api.github.com/repos/openebs/istgt/pulls{/number}","milestones_url":"https://api.github.com/repos/openebs/istgt/milestones{/number}","notifications_url":"https://api.github.com/repos/openebs/istgt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openebs/istgt/labels{/name}","releases_url":"https://api.github.com/repos/openebs/istgt/releases{/id}","deployments_url":"https://api.github.com/repos/openebs/istgt/deployments","created_at":"2018-02-27T11:10:49Z","updated_at":"2018-05-26T14:27:59Z","pushed_at":"2018-05-28T13:51:33Z","git_url":"git://github.com/openebs/istgt.git","ssh_url":"git@github.com:openebs/istgt.git","clone_url":"https://github.com/openebs/istgt.git","svn_url":"https://github.com/openebs/istgt","homepage":null,"size":779,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":6,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":7,"open_issues":6,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openebs/istgt/pulls/26"},"html":{"href":"https://github.com/openebs/istgt/pull/26"},"issue":{"href":"https://api.github.com/repos/openebs/istgt/issues/26"},"comments":{"href":"https://api.github.com/repos/openebs/istgt/issues/26/comments"},"review_comments":{"href":"https://api.github.com/repos/openebs/istgt/pulls/26/comments"},"review_comment":{"href":"https://api.github.com/repos/openebs/istgt/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openebs/istgt/pulls/26/commits"},"statuses":{"href":"https://api.github.com/repos/openebs/istgt/statuses/d5f8d98ab6c61de02b04f3fea59a9c72fc60a7be"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"satbirchhikara"}}