{"action":"created","comment":{"url":"https://api.github.com/repos/openucx/ucx/pulls/comments/151256157","pull_request_review_id":76924765,"id":151256157,"diff_hunk":"@@ -0,0 +1,214 @@\n+/**\n+ * Copyright (C) Mellanox Technologies Ltd. 2001-2017.  ALL RIGHTS RESERVED.\n+ * See file LICENSE for terms.\n+ */\n+\n+#include \"rdmacm_iface.h\"\n+#include \"rdmacm_ep.h\"\n+#include <uct/base/uct_worker.h>\n+#include <ucs/sys/string.h>\n+\n+static ucs_config_field_t uct_rdmacm_iface_config_table[] = {\n+    {\"MAX_CONN\", \"1024\",\n+     \"Maximal number of supported incoming connections on the RDMACM listener.\",\n+     ucs_offsetof(uct_rdmacm_iface_config_t, num_conns), UCS_CONFIG_TYPE_UINT},\n+\n+    {\"ASYNC_MODE\", \"thread\", \"Async mode to use\",\n+     ucs_offsetof(uct_rdmacm_iface_config_t, async_mode), UCS_CONFIG_TYPE_ENUM(ucs_async_mode_names)},\n+\n+    {NULL}\n+};\n+\n+static UCS_CLASS_DECLARE_DELETE_FUNC(uct_rdmacm_iface_t, uct_iface_t);\n+\n+static ucs_status_t uct_rdmacm_iface_query(uct_iface_h tl_iface,\n+                                           uct_iface_attr_t *iface_attr)\n+{\n+    memset(iface_attr, 0, sizeof(uct_iface_attr_t));\n+\n+    iface_attr->iface_addr_len  = sizeof(ucs_sock_addr_t);\n+    iface_attr->device_addr_len = 0;\n+    iface_attr->cap.flags       = UCT_IFACE_FLAG_CONNECT_TO_SOCKADDR |\n+                                  UCT_IFACE_FLAG_CB_ASYNC;\n+    /* User's private data size is UCT_RDMACM_UDP_PRIV_DATA_LEN minus room for\n+     * the private_data header (to hold the length of the data) */\n+    iface_attr->max_conn_priv   = UCT_RDMACM_UDP_PRIV_DATA_LEN -\n+                                  sizeof(uct_rdmacm_priv_data_hdr_t);\n+\n+    return UCS_OK;\n+}\n+\n+int uct_rdmacm_iface_is_reachable(const uct_iface_h tl_iface,\n+                                  const uct_device_addr_t *dev_addr,\n+                                  const uct_iface_addr_t *iface_addr)\n+{\n+    /* Since the iface's address is the sockaddr, we already have the\n+     * uct_md_is_sockaddr_accessible API call to check accessibility to\n+     * this sockaddr */\n+    return 1;\n+}\n+\n+ucs_status_t uct_rdmacm_iface_get_address(uct_iface_h tl_iface, uct_iface_addr_t *iface_addr)\n+{\n+    uct_rdmacm_iface_t *iface = ucs_derived_of(tl_iface, uct_rdmacm_iface_t);\n+    ucs_sock_addr_t *rdmacm_addr = (ucs_sock_addr_t *)iface_addr;\n+\n+    rdmacm_addr->addr    = rdma_get_local_addr(iface->cm_id);\n+    rdmacm_addr->addrlen = sizeof(struct sockaddr);\n+    return UCS_OK;\n+}\n+\n+static uct_iface_ops_t uct_rdmacm_iface_ops = {\n+    .ep_create_sockaddr       = UCS_CLASS_NEW_FUNC_NAME(uct_rdmacm_ep_t),\n+    .ep_destroy               = UCS_CLASS_DELETE_FUNC_NAME(uct_rdmacm_ep_t),\n+    .ep_flush                 = uct_base_ep_flush,\n+    .ep_fence                 = uct_base_ep_fence,\n+    .ep_pending_purge         = ucs_empty_function,\n+    .iface_progress_enable    = (void*)ucs_empty_function_return_success,\n+    .iface_progress_disable   = (void*)ucs_empty_function_return_success,\n+    .iface_progress           = ucs_empty_function_return_zero,\n+    .iface_flush              = uct_base_iface_flush,\n+    .iface_fence              = uct_base_iface_fence,\n+    .iface_close              = UCS_CLASS_DELETE_FUNC_NAME(uct_rdmacm_iface_t),\n+    .iface_query              = uct_rdmacm_iface_query,\n+    .iface_is_reachable       = uct_rdmacm_iface_is_reachable,\n+    .iface_get_device_address = (void*)ucs_empty_function_return_success,\n+    .iface_get_address        = uct_rdmacm_iface_get_address\n+};\n+\n+static UCS_CLASS_INIT_FUNC(uct_rdmacm_iface_t, uct_md_h md, uct_worker_h worker,\n+                           const uct_iface_params_t *params,\n+                           const uct_iface_config_t *tl_config)\n+{\n+    uct_rdmacm_iface_config_t *config = ucs_derived_of(tl_config, uct_rdmacm_iface_config_t);\n+    size_t ip_len = ucs_max(INET_ADDRSTRLEN, INET6_ADDRSTRLEN);\n+    char *ip_str  = ucs_alloca(ip_len);\n+    uct_rdmacm_md_t *rdmacm_md;\n+    ucs_status_t status;\n+\n+    if (!(params->open_mode & UCT_IFACE_OPEN_MODE_SOCKADDR_SERVER) &&\n+        !(params->open_mode & UCT_IFACE_OPEN_MODE_SOCKADDR_CLIENT)) {\n+        ucs_fatal(\"Invalid open mode %zu\", params->open_mode);\n+    }\n+\n+    UCS_CLASS_CALL_SUPER_INIT(uct_base_iface_t, &uct_rdmacm_iface_ops, md, worker,\n+                              params, tl_config UCS_STATS_ARG(params->stats_root)\n+                              UCS_STATS_ARG(UCT_RDMACM_TL_NAME));\n+\n+    rdmacm_md = (uct_rdmacm_md_t *)self->super.md;\n+    if (self->super.worker->async == NULL) {\n+        ucs_error(\"rdmacm must have async != NULL\");\n+        return UCS_ERR_INVALID_PARAM;\n+    }\n+\n+    self->cm_id                = NULL;\n+    self->event_ch             = NULL;\n+    self->addr_resolve_timeout = rdmacm_md->addr_resolve_timeout;\n+    self->config.async_mode    = config->async_mode;\n+\n+    self->event_ch = rdma_create_event_channel();\n+    if (self->event_ch == NULL) {\n+        ucs_error(\"rdma_create_event_channel() failed. open_mode %zu. %m.\",\n+                  params->open_mode);\n+        status = UCS_ERR_IO_ERROR;\n+        goto err;\n+    }\n+\n+    /* Set the event_channel fd to non-blocking mode\n+     * (so that rdma_get_cm_event won't be blocking) */\n+    status = ucs_sys_fcntl_modfl(self->event_ch->fd, O_NONBLOCK, 0);\n+    if (status != UCS_OK) {\n+        goto err_destroy_event_channel;\n+    }\n+\n+    /* Create an id for this interface. Events associated with this id will be\n+     * reported on the event_channel that was previously created. */\n+    if (rdma_create_id(self->event_ch, &self->cm_id, NULL, RDMA_PS_UDP)) {\n+        ucs_error(\"rdma_create_id() failed on server: %m\");\n+        status = UCS_ERR_IO_ERROR;\n+        goto err_destroy_event_channel;\n+    }\n+\n+    if (params->open_mode & UCT_IFACE_OPEN_MODE_SOCKADDR_SERVER) {\n+        if (rdma_bind_addr(self->cm_id, (struct sockaddr *)(params->mode.sockaddr.listen_sockaddr.addr))) {\n+            ucs_error(\"rdma_bind_addr() failed: %m\");\n+            status = UCS_ERR_IO_ERROR;\n+            goto err_destroy_id;\n+        }\n+\n+        if (rdma_listen(self->cm_id, config->num_conns)) {\n+            ucs_error(\"rdma_listen() failed. cm_id: %p, event_channel: %p addr: %s. %m\",\n+                       self->cm_id, self->event_ch,\n+                       ucs_sockaddr_str((struct sockaddr *)params->mode.sockaddr.listen_sockaddr.addr,\n+                                        ip_str, ip_len));\n+            status = UCS_ERR_IO_ERROR;\n+            goto err_destroy_id;\n+        }\n+\n+        ucs_debug(\"server listening on IP %s port %d\",\n+                  ucs_sockaddr_str((struct sockaddr *)params->mode.sockaddr.listen_sockaddr.addr,\n+                                   ip_str, ip_len),\n+                  ntohs(rdma_get_src_port(self->cm_id)));\n+\n+        if (config->async_mode == UCS_ASYNC_MODE_SIGNAL) {\n+            ucs_warn(\"rdmacm does not support SIGIO\");\n+        }\n+\n+        self->config.cb_flags  = params->mode.sockaddr.cb_flags;\n+        self->conn_request_cb  = params->mode.sockaddr.conn_request_cb;\n+        self->conn_request_arg = params->mode.sockaddr.conn_request_arg;\n+        self->is_server        = 1;\n+    } else {\n+        self->config.cb_flags  = UCT_CB_FLAG_ASYNC; /* Only ASYNC is currently supported */\n+        self->is_server        = 0;\n+    }\n+\n+    self->ep = NULL;\n+    ucs_queue_head_init(&self->pending_eps_q);\n+\n+    ucs_debug(\"created an RDMACM iface %p. event_channel: %p, fd: %d, cm_id: %p\",\n+              self, self->event_ch, self->event_ch->fd, self->cm_id);\n+\n+    return UCS_OK;\n+\n+err_destroy_id:\n+    rdma_destroy_id(self->cm_id);\n+err_destroy_event_channel:\n+    rdma_destroy_event_channel(self->event_ch);\n+err:\n+    return status;\n+}\n+\n+static UCS_CLASS_CLEANUP_FUNC(uct_rdmacm_iface_t)\n+{\n+    if (self->cm_id != NULL) {","path":"src/uct/ib/rdmacm/rdmacm_iface.c","position":184,"original_position":184,"commit_id":"12c4f8bc5aeb143bfd9cdc8983aa32ede10a43c4","original_commit_id":"12c4f8bc5aeb143bfd9cdc8983aa32ede10a43c4","user":{"login":"brminich","id":14221180,"avatar_url":"https://avatars1.githubusercontent.com/u/14221180?v=4","gravatar_id":"","url":"https://api.github.com/users/brminich","html_url":"https://github.com/brminich","followers_url":"https://api.github.com/users/brminich/followers","following_url":"https://api.github.com/users/brminich/following{/other_user}","gists_url":"https://api.github.com/users/brminich/gists{/gist_id}","starred_url":"https://api.github.com/users/brminich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brminich/subscriptions","organizations_url":"https://api.github.com/users/brminich/orgs","repos_url":"https://api.github.com/users/brminich/repos","events_url":"https://api.github.com/users/brminich/events{/privacy}","received_events_url":"https://api.github.com/users/brminich/received_events","type":"User","site_admin":false},"body":"How is it possible that `cm_id` and `event_ch` can be `NULL` here?","created_at":"2017-11-15T21:26:02Z","updated_at":"2017-11-15T21:31:01Z","html_url":"https://github.com/openucx/ucx/pull/1996#discussion_r151256157","pull_request_url":"https://api.github.com/repos/openucx/ucx/pulls/1996","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/openucx/ucx/pulls/comments/151256157"},"html":{"href":"https://github.com/openucx/ucx/pull/1996#discussion_r151256157"},"pull_request":{"href":"https://api.github.com/repos/openucx/ucx/pulls/1996"}}},"pull_request":{"url":"https://api.github.com/repos/openucx/ucx/pulls/1996","id":152262968,"html_url":"https://github.com/openucx/ucx/pull/1996","diff_url":"https://github.com/openucx/ucx/pull/1996.diff","patch_url":"https://github.com/openucx/ucx/pull/1996.patch","issue_url":"https://api.github.com/repos/openucx/ucx/issues/1996","number":1996,"state":"open","locked":false,"title":"UCT/GTEST: Initial support for the rdmacm transport.","user":{"login":"alinask","id":2405183,"avatar_url":"https://avatars1.githubusercontent.com/u/2405183?v=4","gravatar_id":"","url":"https://api.github.com/users/alinask","html_url":"https://github.com/alinask","followers_url":"https://api.github.com/users/alinask/followers","following_url":"https://api.github.com/users/alinask/following{/other_user}","gists_url":"https://api.github.com/users/alinask/gists{/gist_id}","starred_url":"https://api.github.com/users/alinask/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alinask/subscriptions","organizations_url":"https://api.github.com/users/alinask/orgs","repos_url":"https://api.github.com/users/alinask/repos","events_url":"https://api.github.com/users/alinask/events{/privacy}","received_events_url":"https://api.github.com/users/alinask/received_events","type":"User","site_admin":false},"body":null,"created_at":"2017-11-13T15:10:25Z","updated_at":"2017-11-15T21:31:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c2300244dbe3d43c9facf1d1da356d8da7d2de83","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/openucx/ucx/pulls/1996/commits","review_comments_url":"https://api.github.com/repos/openucx/ucx/pulls/1996/comments","review_comment_url":"https://api.github.com/repos/openucx/ucx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openucx/ucx/issues/1996/comments","statuses_url":"https://api.github.com/repos/openucx/ucx/statuses/12c4f8bc5aeb143bfd9cdc8983aa32ede10a43c4","head":{"label":"alinask:topic/uct-rdmacm-iface-init","ref":"topic/uct-rdmacm-iface-init","sha":"12c4f8bc5aeb143bfd9cdc8983aa32ede10a43c4","user":{"login":"alinask","id":2405183,"avatar_url":"https://avatars1.githubusercontent.com/u/2405183?v=4","gravatar_id":"","url":"https://api.github.com/users/alinask","html_url":"https://github.com/alinask","followers_url":"https://api.github.com/users/alinask/followers","following_url":"https://api.github.com/users/alinask/following{/other_user}","gists_url":"https://api.github.com/users/alinask/gists{/gist_id}","starred_url":"https://api.github.com/users/alinask/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alinask/subscriptions","organizations_url":"https://api.github.com/users/alinask/orgs","repos_url":"https://api.github.com/users/alinask/repos","events_url":"https://api.github.com/users/alinask/events{/privacy}","received_events_url":"https://api.github.com/users/alinask/received_events","type":"User","site_admin":false},"repo":{"id":39071172,"name":"ucx","full_name":"alinask/ucx","owner":{"login":"alinask","id":2405183,"avatar_url":"https://avatars1.githubusercontent.com/u/2405183?v=4","gravatar_id":"","url":"https://api.github.com/users/alinask","html_url":"https://github.com/alinask","followers_url":"https://api.github.com/users/alinask/followers","following_url":"https://api.github.com/users/alinask/following{/other_user}","gists_url":"https://api.github.com/users/alinask/gists{/gist_id}","starred_url":"https://api.github.com/users/alinask/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alinask/subscriptions","organizations_url":"https://api.github.com/users/alinask/orgs","repos_url":"https://api.github.com/users/alinask/repos","events_url":"https://api.github.com/users/alinask/events{/privacy}","received_events_url":"https://api.github.com/users/alinask/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/alinask/ucx","description":"Unified Communication X : ","fork":true,"url":"https://api.github.com/repos/alinask/ucx","forks_url":"https://api.github.com/repos/alinask/ucx/forks","keys_url":"https://api.github.com/repos/alinask/ucx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alinask/ucx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alinask/ucx/teams","hooks_url":"https://api.github.com/repos/alinask/ucx/hooks","issue_events_url":"https://api.github.com/repos/alinask/ucx/issues/events{/number}","events_url":"https://api.github.com/repos/alinask/ucx/events","assignees_url":"https://api.github.com/repos/alinask/ucx/assignees{/user}","branches_url":"https://api.github.com/repos/alinask/ucx/branches{/branch}","tags_url":"https://api.github.com/repos/alinask/ucx/tags","blobs_url":"https://api.github.com/repos/alinask/ucx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alinask/ucx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alinask/ucx/git/refs{/sha}","trees_url":"https://api.github.com/repos/alinask/ucx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alinask/ucx/statuses/{sha}","languages_url":"https://api.github.com/repos/alinask/ucx/languages","stargazers_url":"https://api.github.com/repos/alinask/ucx/stargazers","contributors_url":"https://api.github.com/repos/alinask/ucx/contributors","subscribers_url":"https://api.github.com/repos/alinask/ucx/subscribers","subscription_url":"https://api.github.com/repos/alinask/ucx/subscription","commits_url":"https://api.github.com/repos/alinask/ucx/commits{/sha}","git_commits_url":"https://api.github.com/repos/alinask/ucx/git/commits{/sha}","comments_url":"https://api.github.com/repos/alinask/ucx/comments{/number}","issue_comment_url":"https://api.github.com/repos/alinask/ucx/issues/comments{/number}","contents_url":"https://api.github.com/repos/alinask/ucx/contents/{+path}","compare_url":"https://api.github.com/repos/alinask/ucx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alinask/ucx/merges","archive_url":"https://api.github.com/repos/alinask/ucx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alinask/ucx/downloads","issues_url":"https://api.github.com/repos/alinask/ucx/issues{/number}","pulls_url":"https://api.github.com/repos/alinask/ucx/pulls{/number}","milestones_url":"https://api.github.com/repos/alinask/ucx/milestones{/number}","notifications_url":"https://api.github.com/repos/alinask/ucx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alinask/ucx/labels{/name}","releases_url":"https://api.github.com/repos/alinask/ucx/releases{/id}","deployments_url":"https://api.github.com/repos/alinask/ucx/deployments","created_at":"2015-07-14T11:34:14Z","updated_at":"2016-02-29T14:42:56Z","pushed_at":"2017-11-15T12:48:37Z","git_url":"git://github.com/alinask/ucx.git","ssh_url":"git@github.com:alinask/ucx.git","clone_url":"https://github.com/alinask/ucx.git","svn_url":"https://github.com/alinask/ucx","homepage":" http://www.openucx.org","size":9986,"stargazers_count":0,"watchers_count":0,"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,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openucx:master","ref":"master","sha":"7578d5553c14fccbcee688640d93ae46b0edca6f","user":{"login":"openucx","id":13118737,"avatar_url":"https://avatars2.githubusercontent.com/u/13118737?v=4","gravatar_id":"","url":"https://api.github.com/users/openucx","html_url":"https://github.com/openucx","followers_url":"https://api.github.com/users/openucx/followers","following_url":"https://api.github.com/users/openucx/following{/other_user}","gists_url":"https://api.github.com/users/openucx/gists{/gist_id}","starred_url":"https://api.github.com/users/openucx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openucx/subscriptions","organizations_url":"https://api.github.com/users/openucx/orgs","repos_url":"https://api.github.com/users/openucx/repos","events_url":"https://api.github.com/users/openucx/events{/privacy}","received_events_url":"https://api.github.com/users/openucx/received_events","type":"Organization","site_admin":false},"repo":{"id":25379390,"name":"ucx","full_name":"openucx/ucx","owner":{"login":"openucx","id":13118737,"avatar_url":"https://avatars2.githubusercontent.com/u/13118737?v=4","gravatar_id":"","url":"https://api.github.com/users/openucx","html_url":"https://github.com/openucx","followers_url":"https://api.github.com/users/openucx/followers","following_url":"https://api.github.com/users/openucx/following{/other_user}","gists_url":"https://api.github.com/users/openucx/gists{/gist_id}","starred_url":"https://api.github.com/users/openucx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openucx/subscriptions","organizations_url":"https://api.github.com/users/openucx/orgs","repos_url":"https://api.github.com/users/openucx/repos","events_url":"https://api.github.com/users/openucx/events{/privacy}","received_events_url":"https://api.github.com/users/openucx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openucx/ucx","description":"Unified Communication X  (mailing list - https://elist.ornl.gov/mailman/listinfo/ucx-group): ","fork":false,"url":"https://api.github.com/repos/openucx/ucx","forks_url":"https://api.github.com/repos/openucx/ucx/forks","keys_url":"https://api.github.com/repos/openucx/ucx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openucx/ucx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openucx/ucx/teams","hooks_url":"https://api.github.com/repos/openucx/ucx/hooks","issue_events_url":"https://api.github.com/repos/openucx/ucx/issues/events{/number}","events_url":"https://api.github.com/repos/openucx/ucx/events","assignees_url":"https://api.github.com/repos/openucx/ucx/assignees{/user}","branches_url":"https://api.github.com/repos/openucx/ucx/branches{/branch}","tags_url":"https://api.github.com/repos/openucx/ucx/tags","blobs_url":"https://api.github.com/repos/openucx/ucx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openucx/ucx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openucx/ucx/git/refs{/sha}","trees_url":"https://api.github.com/repos/openucx/ucx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openucx/ucx/statuses/{sha}","languages_url":"https://api.github.com/repos/openucx/ucx/languages","stargazers_url":"https://api.github.com/repos/openucx/ucx/stargazers","contributors_url":"https://api.github.com/repos/openucx/ucx/contributors","subscribers_url":"https://api.github.com/repos/openucx/ucx/subscribers","subscription_url":"https://api.github.com/repos/openucx/ucx/subscription","commits_url":"https://api.github.com/repos/openucx/ucx/commits{/sha}","git_commits_url":"https://api.github.com/repos/openucx/ucx/git/commits{/sha}","comments_url":"https://api.github.com/repos/openucx/ucx/comments{/number}","issue_comment_url":"https://api.github.com/repos/openucx/ucx/issues/comments{/number}","contents_url":"https://api.github.com/repos/openucx/ucx/contents/{+path}","compare_url":"https://api.github.com/repos/openucx/ucx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openucx/ucx/merges","archive_url":"https://api.github.com/repos/openucx/ucx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openucx/ucx/downloads","issues_url":"https://api.github.com/repos/openucx/ucx/issues{/number}","pulls_url":"https://api.github.com/repos/openucx/ucx/pulls{/number}","milestones_url":"https://api.github.com/repos/openucx/ucx/milestones{/number}","notifications_url":"https://api.github.com/repos/openucx/ucx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openucx/ucx/labels{/name}","releases_url":"https://api.github.com/repos/openucx/ucx/releases{/id}","deployments_url":"https://api.github.com/repos/openucx/ucx/deployments","created_at":"2014-10-17T22:17:24Z","updated_at":"2017-11-12T02:10:38Z","pushed_at":"2017-11-15T14:12:35Z","git_url":"git://github.com/openucx/ucx.git","ssh_url":"git@github.com:openucx/ucx.git","clone_url":"https://github.com/openucx/ucx.git","svn_url":"https://github.com/openucx/ucx","homepage":"http://www.openucx.org","size":10068,"stargazers_count":87,"watchers_count":87,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":66,"mirror_url":null,"archived":false,"open_issues_count":135,"forks":66,"open_issues":135,"watchers":87,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openucx/ucx/pulls/1996"},"html":{"href":"https://github.com/openucx/ucx/pull/1996"},"issue":{"href":"https://api.github.com/repos/openucx/ucx/issues/1996"},"comments":{"href":"https://api.github.com/repos/openucx/ucx/issues/1996/comments"},"review_comments":{"href":"https://api.github.com/repos/openucx/ucx/pulls/1996/comments"},"review_comment":{"href":"https://api.github.com/repos/openucx/ucx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openucx/ucx/pulls/1996/commits"},"statuses":{"href":"https://api.github.com/repos/openucx/ucx/statuses/12c4f8bc5aeb143bfd9cdc8983aa32ede10a43c4"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"brminich"}}