{"action":"created","comment":{"url":"https://api.github.com/repos/openebs/istgt/pulls/comments/340455676","pull_request_review_id":308996120,"id":340455676,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM0MDQ1NTY3Ng==","diff_hunk":"@@ -2173,6 +2235,211 @@ istgt_lu_resize_volume(spec_t *spec, uint64_t size) {\n \treturn true;\n }\n \n+#define IS_REPLICA_ID_EXIST_IN_LIST(_replica_id, _list, _no_of_items, _is_exist) \t\\\n+\tdo {\t\t\t\t\t\t\t\t\t\t\\\n+\t\tint i;\t\t\t\t\t\t\t\t\t\\\n+\t\tfor (i=0; i < _no_of_items; i++) {\t\t\t\t\t\\\n+\t\t\tif (strncmp(_replica_id, _list[i], REPLICA_ID_LEN) == 0) {\t\\\n+\t\t\t\t\t_is_exist = true;\t\t\t\t\\\n+\t\t\t\t\tbreak;\t\t\t\t\t\t\\\n+\t\t\t}\t\t\t\t\t\t\t\t\\\n+\t\t}\t\t\t\t\t\t\t\t\t\\\n+\t}while(0)\n+\n+\n+#ifdef REPLICATION\n+/* is_valid_known_replica_list this function should be called by taking\n+ * spec->rq_mtx lock\n+ */\n+static bool\n+is_valid_known_replica_list(spec_t *spec, int listcnt, char **known_replica_id_list) {\n+\ttrusty_replica_t *trusty_replica = NULL;\n+\tbool found_replica;\n+\tint i;\n+\n+\tASSERT(MTX_LOCKED(&spec->rq_mtx));\n+\tfor(i=0; i<listcnt; i++) {\n+\t\tfound_replica = false;\n+\t\tTAILQ_FOREACH(trusty_replica, &spec->lu->trusty_replicas, next) {\n+\t\t\tif (strncmp(trusty_replica->replica_id,\n+\t\t\t    known_replica_id_list[i], REPLICA_ID_LEN) == 0) {\n+\t\t\t\tfound_replica = true;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\t// If known replicaid doesn't exist in trusty replica then\n+\t\t// replicaid list has wrong information\n+\t\tif (!found_replica) {\n+\t\t\tISTGT_ERRLOG(\"replicaid (%s) doesn't exist in \"\n+\t\t\t    \"trusty replica list\\n\", known_replica_id_list[i]);\n+\t\t\treturn false;\n+\t\t}\n+\t}\n+\treturn true;\n+}\n+#endif\n+\n+static bool\n+can_replica_remove(spec_t *spec, replica_t *removing_replica) {\n+\treplica_t *replica;\n+\n+\tif (spec->healthy_rcount < spec->consistency_factor)\n+\t\treturn false;\n+\n+\t// TODO: Return true when all the replicas_id should be healthy\n+\t// else return false\n+\tTAILQ_FOREACH(replica, &spec->rq, r_next) {\n+\t\tif (replica != removing_replica &&\n+\t\t    replica->state != ZVOL_STATUS_HEALTHY)\n+\t\t\treturn false;\n+\t}\n+\treturn true;\n+}\n+\n+/* istgt_lu_remove_unknown_replica will disconnect the replica and update\n+ * volume configurations. Steps performed in this function\n+ * 1. Get replica information that is going to remove/disconnect from target\n+ * 2. Wait for any Ongoing snapshots\n+ * 3. Verify whether replicas are healthy or not other than removing replica. If\n+ *    there are degraded replicas return error\n+ * 4. On success pause the IOs for 5 seconds. If there are pending IOs return error\n+ *    by resuming IOs else continue the process\n+ * 5. Mark the replica cordon for IOs\n+ * 6. Update inmemory configurations.\n+ */\n+int\n+istgt_lu_remove_unknown_replica(spec_t *spec, int drf, char **known_replica_id_list) {\n+\treplica_t *replica, *removing_replica = NULL;\n+\tint rc = -1;\n+\t// Hard coded IO wait time\n+\tint io_wait_time = 5;\n+\tint new_rf = drf;\n+\tint new_cf = CONSISTENCY_FACTOR(new_rf);\n+\tint found_in_rq_list = false;\n+\tint found_replica = false;\n+\n+#ifdef REPLICATION\n+\ttrusty_replica_t *trusty_replica = NULL;\n+#endif\n+\n+\tMTX_LOCK(&spec->rq_mtx);\n+\tassert(drf == spec->replication_factor - 1);\n+\n+#ifdef REPLICATION\n+\tif (is_valid_known_replica_list(spec, drf, known_replica_id_list) == false) {\n+\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\tISTGT_ERRLOG(\"invalid known replicaid list\\n\");\n+\t\treturn rc;\n+\t}\n+#endif\n+\n+\t// Find the replica who's replicaID is not exist in known_replica_id_list\n+\tTAILQ_FOREACH(replica, &spec->rq, r_next) {\n+\t\t/* No need of taking replica->r_mtx lock since we took \n+\t\t * lock on spec->rq_mtx it is good enough to read replica_id\n+\t\t * properity.\n+\t\t */\n+\t\tfound_replica = false;\n+\t\t/* If current replica not exist in provided list then that\n+\t\t * replica need to be removed\n+\t\t */\n+\t\tIS_REPLICA_ID_EXIST_IN_LIST(replica->replica_id,\n+\t\t    known_replica_id_list, drf, found_replica);\n+\t\tif (!found_replica) {\n+\t\t\tremoving_replica = replica;\n+\t\t\tfound_in_rq_list = true;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tif (removing_replica == NULL) {\n+\t\tTAILQ_FOREACH(replica, &spec->non_quorum_rq, r_non_quorum_next) {\n+\t\t\tfound_replica = false;\n+\t\t\tIS_REPLICA_ID_EXIST_IN_LIST(replica->replica_id,\n+\t\t\t    known_replica_id_list, drf, found_replica);\n+\t\t\tif (!found_replica) {\n+\t\t\t\tremoving_replica = replica;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t/* Wait for any ongoing snapshot commands */\n+\twhile (spec->quiesce == 1) {\n+\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\tsleep(1);\n+\t\tMTX_LOCK(&spec->rq_mtx);\n+\t}\n+\n+\tif (can_replica_remove(spec, removing_replica) == false) {\n+\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\tREPLICA_ERRLOG(\"Remaining replicas are not healthy to remove replica...\\n\");\n+\t\treturn rc;\n+\t}\n+\n+\t/* If replica that needs to be removed is not connected and\n+\t * if there is no change in consistency model then go and update\n+\t * volume configuration without pausing IOs.\n+\t */\n+\tif (!found_in_rq_list ||\n+\t    (removing_replica == NULL && new_cf == spec->consistency_factor))\n+\t\tgoto update_volume_configurations;\n+\n+\t/* Select some replica other than removing replica and\n+\t * wait for few seconds if there are any ongoing IOs\n+\t */\n+\tTAILQ_FOREACH(replica, &spec->rq, r_next)\n+\t\tif (replica != removing_replica)\n+\t\t\tbreak;\n+\n+\tspec->quiesce = 1;\n+\trc = wait_for_ongoing_ios_on_replica(spec, replica, io_wait_time);\n+\tif ( rc != 0 ) {\n+\t\tspec->quiesce = 0;\n+\t\tMTX_UNLOCK(&spec->rq_mtx);\n+\t\tREPLICA_ERRLOG(\"pausing failed..\\n\");\n+\t\treturn rc;\n+\t}\n+\tif (removing_replica != NULL) {\n+\t\tMTX_LOCK(&removing_replica->r_mtx);\n+\t\t// Marking replica as cordon(not ready to serve IOs)\n+\t\tremoving_replica->cordon = 1;\n+\t\tMTX_UNLOCK(&removing_replica->r_mtx);\n+\t\tREPLICA_LOG(\"Replica(%s:%lu) marked cordoned for IOs\\n\",\n+\t\t    removing_replica->replica_id, removing_replica->zvol_guid);\n+\t}\n+\n+update_volume_configurations:\n+\tspec->replication_factor = new_rf;\n+\tspec->consistency_factor = new_cf;\n+\tspec->lu->replication_factor = new_rf;\n+\tspec->lu->consistency_factor = new_cf;\n+\tspec->lu->desired_replication_factor = drf;\n+\tspec->desired_replication_factor = drf;\n+\n+#ifdef REPLICATION\n+\t// If removing replica exists in trusty replica list remove from it\n+\tTAILQ_FOREACH(trusty_replica, &spec->lu->trusty_replicas, next) {\n+\t\tfound_replica = false;\n+\t\tIS_REPLICA_ID_EXIST_IN_LIST(trusty_replica->replica_id,\n+\t\t    known_replica_id_list, drf, found_replica);\n+\t\tif (!found_replica) {\n+\t\t\tTAILQ_REMOVE(&spec->lu->trusty_replicas,\n+\t\t\t    trusty_replica, next);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+#endif\n+\tspec->quiesce = 0;\n+\n+\tif (removing_replica != NULL)\n+\t\tinform_mgmt_conn(removing_replica);","path":"src/replication.c","position":281,"original_position":286,"commit_id":"fb34f299124224b51705cb74dc4bb027f570fca7","original_commit_id":"452c31da40551f2d0352e0e0924a0a9b84dcf013","user":{"login":"mittachaitu","id":13776912,"node_id":"MDQ6VXNlcjEzNzc2OTEy","avatar_url":"https://avatars3.githubusercontent.com/u/13776912?v=4","gravatar_id":"","url":"https://api.github.com/users/mittachaitu","html_url":"https://github.com/mittachaitu","followers_url":"https://api.github.com/users/mittachaitu/followers","following_url":"https://api.github.com/users/mittachaitu/following{/other_user}","gists_url":"https://api.github.com/users/mittachaitu/gists{/gist_id}","starred_url":"https://api.github.com/users/mittachaitu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mittachaitu/subscriptions","organizations_url":"https://api.github.com/users/mittachaitu/orgs","repos_url":"https://api.github.com/users/mittachaitu/repos","events_url":"https://api.github.com/users/mittachaitu/events{/privacy}","received_events_url":"https://api.github.com/users/mittachaitu/received_events","type":"User","site_admin":false},"body":"Done","created_at":"2019-10-30T07:07:58Z","updated_at":"2019-10-30T07:07:58Z","html_url":"https://github.com/openebs/istgt/pull/289#discussion_r340455676","pull_request_url":"https://api.github.com/repos/openebs/istgt/pulls/289","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/openebs/istgt/pulls/comments/340455676"},"html":{"href":"https://github.com/openebs/istgt/pull/289#discussion_r340455676"},"pull_request":{"href":"https://api.github.com/repos/openebs/istgt/pulls/289"}},"in_reply_to_id":339914383},"pull_request":{"url":"https://api.github.com/repos/openebs/istgt/pulls/289","id":330975163,"node_id":"MDExOlB1bGxSZXF1ZXN0MzMwOTc1MTYz","html_url":"https://github.com/openebs/istgt/pull/289","diff_url":"https://github.com/openebs/istgt/pull/289.diff","patch_url":"https://github.com/openebs/istgt/pull/289.patch","issue_url":"https://api.github.com/repos/openebs/istgt/issues/289","number":289,"state":"open","locked":false,"title":"feat(replica scaledown): add support to scaledown replicas","user":{"login":"mittachaitu","id":13776912,"node_id":"MDQ6VXNlcjEzNzc2OTEy","avatar_url":"https://avatars3.githubusercontent.com/u/13776912?v=4","gravatar_id":"","url":"https://api.github.com/users/mittachaitu","html_url":"https://github.com/mittachaitu","followers_url":"https://api.github.com/users/mittachaitu/followers","following_url":"https://api.github.com/users/mittachaitu/following{/other_user}","gists_url":"https://api.github.com/users/mittachaitu/gists{/gist_id}","starred_url":"https://api.github.com/users/mittachaitu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mittachaitu/subscriptions","organizations_url":"https://api.github.com/users/mittachaitu/orgs","repos_url":"https://api.github.com/users/mittachaitu/repos","events_url":"https://api.github.com/users/mittachaitu/events{/privacy}","received_events_url":"https://api.github.com/users/mittachaitu/received_events","type":"User","site_admin":false},"body":"Signed-off-by: mittachaitu <sai.chaithanya@mayadata.io>\r\n\r\nThis PR adds support to perform replica scale down (or) remove the replica from a volume without IO disruption.\r\n\r\n**How to trigger scale down**\r\nCMD: istgtcontrol drf <vol_name> <drf_value> <drf_value_no_known_replica_ids>\r\nEx: istgtcontrol drf vol1 2 6061 6062 (On assumption of 3 replicas 6061, 6062 and 6063 are connected and I need to remove 6062)\r\n\r\n**TODO**\r\n1. Move new functions into a new file(other than replication.c).\r\n","created_at":"2019-10-22T12:53:02Z","updated_at":"2019-10-30T07:07:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"df022648e621f7e5610d2c24579a144f9690375e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/openebs/istgt/pulls/289/commits","review_comments_url":"https://api.github.com/repos/openebs/istgt/pulls/289/comments","review_comment_url":"https://api.github.com/repos/openebs/istgt/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openebs/istgt/issues/289/comments","statuses_url":"https://api.github.com/repos/openebs/istgt/statuses/fb34f299124224b51705cb74dc4bb027f570fca7","head":{"label":"mittachaitu:scaledown_replica","ref":"scaledown_replica","sha":"fb34f299124224b51705cb74dc4bb027f570fca7","user":{"login":"mittachaitu","id":13776912,"node_id":"MDQ6VXNlcjEzNzc2OTEy","avatar_url":"https://avatars3.githubusercontent.com/u/13776912?v=4","gravatar_id":"","url":"https://api.github.com/users/mittachaitu","html_url":"https://github.com/mittachaitu","followers_url":"https://api.github.com/users/mittachaitu/followers","following_url":"https://api.github.com/users/mittachaitu/following{/other_user}","gists_url":"https://api.github.com/users/mittachaitu/gists{/gist_id}","starred_url":"https://api.github.com/users/mittachaitu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mittachaitu/subscriptions","organizations_url":"https://api.github.com/users/mittachaitu/orgs","repos_url":"https://api.github.com/users/mittachaitu/repos","events_url":"https://api.github.com/users/mittachaitu/events{/privacy}","received_events_url":"https://api.github.com/users/mittachaitu/received_events","type":"User","site_admin":false},"repo":{"id":145534220,"node_id":"MDEwOlJlcG9zaXRvcnkxNDU1MzQyMjA=","name":"istgt","full_name":"mittachaitu/istgt","private":false,"owner":{"login":"mittachaitu","id":13776912,"node_id":"MDQ6VXNlcjEzNzc2OTEy","avatar_url":"https://avatars3.githubusercontent.com/u/13776912?v=4","gravatar_id":"","url":"https://api.github.com/users/mittachaitu","html_url":"https://github.com/mittachaitu","followers_url":"https://api.github.com/users/mittachaitu/followers","following_url":"https://api.github.com/users/mittachaitu/following{/other_user}","gists_url":"https://api.github.com/users/mittachaitu/gists{/gist_id}","starred_url":"https://api.github.com/users/mittachaitu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mittachaitu/subscriptions","organizations_url":"https://api.github.com/users/mittachaitu/orgs","repos_url":"https://api.github.com/users/mittachaitu/repos","events_url":"https://api.github.com/users/mittachaitu/events{/privacy}","received_events_url":"https://api.github.com/users/mittachaitu/received_events","type":"User","site_admin":false},"html_url":"https://github.com/mittachaitu/istgt","description":null,"fork":true,"url":"https://api.github.com/repos/mittachaitu/istgt","forks_url":"https://api.github.com/repos/mittachaitu/istgt/forks","keys_url":"https://api.github.com/repos/mittachaitu/istgt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mittachaitu/istgt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mittachaitu/istgt/teams","hooks_url":"https://api.github.com/repos/mittachaitu/istgt/hooks","issue_events_url":"https://api.github.com/repos/mittachaitu/istgt/issues/events{/number}","events_url":"https://api.github.com/repos/mittachaitu/istgt/events","assignees_url":"https://api.github.com/repos/mittachaitu/istgt/assignees{/user}","branches_url":"https://api.github.com/repos/mittachaitu/istgt/branches{/branch}","tags_url":"https://api.github.com/repos/mittachaitu/istgt/tags","blobs_url":"https://api.github.com/repos/mittachaitu/istgt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mittachaitu/istgt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mittachaitu/istgt/git/refs{/sha}","trees_url":"https://api.github.com/repos/mittachaitu/istgt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mittachaitu/istgt/statuses/{sha}","languages_url":"https://api.github.com/repos/mittachaitu/istgt/languages","stargazers_url":"https://api.github.com/repos/mittachaitu/istgt/stargazers","contributors_url":"https://api.github.com/repos/mittachaitu/istgt/contributors","subscribers_url":"https://api.github.com/repos/mittachaitu/istgt/subscribers","subscription_url":"https://api.github.com/repos/mittachaitu/istgt/subscription","commits_url":"https://api.github.com/repos/mittachaitu/istgt/commits{/sha}","git_commits_url":"https://api.github.com/repos/mittachaitu/istgt/git/commits{/sha}","comments_url":"https://api.github.com/repos/mittachaitu/istgt/comments{/number}","issue_comment_url":"https://api.github.com/repos/mittachaitu/istgt/issues/comments{/number}","contents_url":"https://api.github.com/repos/mittachaitu/istgt/contents/{+path}","compare_url":"https://api.github.com/repos/mittachaitu/istgt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mittachaitu/istgt/merges","archive_url":"https://api.github.com/repos/mittachaitu/istgt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mittachaitu/istgt/downloads","issues_url":"https://api.github.com/repos/mittachaitu/istgt/issues{/number}","pulls_url":"https://api.github.com/repos/mittachaitu/istgt/pulls{/number}","milestones_url":"https://api.github.com/repos/mittachaitu/istgt/milestones{/number}","notifications_url":"https://api.github.com/repos/mittachaitu/istgt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mittachaitu/istgt/labels{/name}","releases_url":"https://api.github.com/repos/mittachaitu/istgt/releases{/id}","deployments_url":"https://api.github.com/repos/mittachaitu/istgt/deployments","created_at":"2018-08-21T08:44:44Z","updated_at":"2018-08-21T09:10:39Z","pushed_at":"2019-10-29T11:26:26Z","git_url":"git://github.com/mittachaitu/istgt.git","ssh_url":"git@github.com:mittachaitu/istgt.git","clone_url":"https://github.com/mittachaitu/istgt.git","svn_url":"https://github.com/mittachaitu/istgt","homepage":null,"size":1742,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"openebs:replication","ref":"replication","sha":"f3d077d6069db02d81952933e6fdf9d67b459cf6","user":{"login":"openebs","id":20769039,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwNzY5MDM5","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,"node_id":"MDEwOlJlcG9zaXRvcnkxMjMxMTc3NTc=","name":"istgt","full_name":"openebs/istgt","private":false,"owner":{"login":"openebs","id":20769039,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwNzY5MDM5","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},"html_url":"https://github.com/openebs/istgt","description":"CAS Data Engine - iSCSI Target for OpenEBS cStor ","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":"2019-10-10T20:00:46Z","pushed_at":"2019-10-29T11:26:27Z","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":"https://docs.openebs.io","size":1389,"stargazers_count":14,"watchers_count":14,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":71,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":31,"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":71,"open_issues":31,"watchers":14,"default_branch":"replication"}},"_links":{"self":{"href":"https://api.github.com/repos/openebs/istgt/pulls/289"},"html":{"href":"https://github.com/openebs/istgt/pull/289"},"issue":{"href":"https://api.github.com/repos/openebs/istgt/issues/289"},"comments":{"href":"https://api.github.com/repos/openebs/istgt/issues/289/comments"},"review_comments":{"href":"https://api.github.com/repos/openebs/istgt/pulls/289/comments"},"review_comment":{"href":"https://api.github.com/repos/openebs/istgt/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openebs/istgt/pulls/289/commits"},"statuses":{"href":"https://api.github.com/repos/openebs/istgt/statuses/fb34f299124224b51705cb74dc4bb027f570fca7"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mittachaitu"}}