{"action":"created","comment":{"url":"https://api.github.com/repos/ceph/ceph/pulls/comments/239589466","pull_request_review_id":182416271,"id":239589466,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzOTU4OTQ2Ng==","diff_hunk":"@@ -233,4 +238,167 @@ extern bool match_wildcards(boost::string_view pattern,\n                             boost::string_view input,\n                             uint32_t flags = 0);\n \n+inline void rgw_escape_str(const std::string& s, const char esc_char, const char special_char, std::string& dest)\n+{\n+ dest.reserve(s.size() * 2);\n+ \n+ auto dest_iter = begin(dest);\n+ \n+ for (const char c : s) {\n+    if(esc_char == c || special_char == c) {\n+        *dest_iter++ = esc_char;\n+    }\n+    \n+    *dest_iter++ = c;\n+ }\n+}\n+\n+inline void rgw_escape_str(const std::string& s, const char esc_char, const char special_char, std::string *dest_ptr)\n+{\n+ return rgw_escape_str(s, esc_char, special_char, *dest_ptr);\n+}\n+\n+inline std::string rgw_escape_str(const std::string& s, const char esc_char, const char special_char)\n+{\n+ std::string result;\n+ rgw_escape_str(s, esc_char, special_char, result);\n+ return result;\n+}\n+\n+inline ssize_t rgw_unescape_str(const std::string& src, const ssize_t ofs,\n+                       const char esc_char, const char special_char,\n+                       std::string& dest)\n+{\n+  dest.reserve(src.size());\n+  auto destp = begin(dest);\n+\n+  bool esc = false;\n+\n+  for (size_t i = ofs; i < src.size(); i++) {\n+    char c = src[i];\n+    if (!esc && c == esc_char) {\n+      esc = true;\n+      continue;\n+    }\n+    if (!esc && c == special_char) {\n+      dest.resize(i);\n+      return dest.size();\n+    }\n+    *destp++ = c;\n+    esc = false;\n+  }\n+\n+  return std::string::npos;\n+}\n+\n+inline ssize_t rgw_unescape_str(const std::string& s, const ssize_t ofs,\n+                       const char esc_char, const char special_char,\n+                       std::string *dest_ptr)\n+{\n+  return rgw_unescape_str(s, ofs, esc_char, special_char, *dest_ptr);\n+}\n+\n+class CephContext;\n+\n+/* size should be the required string size + 1 */\n+int gen_rand_base64(CephContext *cct, char *dest, int size);\n+\n+void gen_rand_alphanumeric_lower_CHAR(CephContext *cct, char *dest, const int nchars);\n+\n+namespace detail {\n+\n+// Does NOT null-terminate:\n+template <typename OutputIterT, typename SizeT>\n+void gen_rand_buffer_mutate_in_place(OutputIterT& oi, const SizeT size, std::string_view tbl)\n+{\n+  std::generate_n(oi, size, [&]() noexcept {\n+                  auto n = ceph::util::generate_random_number(0, tbl.size());","path":"src/rgw/rgw_string.h","position":100,"original_position":100,"commit_id":"935c56b0e93aed20bebe3ae6eaf597113d54e28d","original_commit_id":"935c56b0e93aed20bebe3ae6eaf597113d54e28d","user":{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false},"body":"Aaaah, I see what's going on there-- thank you for point that out! I'll rework this. I was /hoping/ to be able to keep the CephContext* out of these (and, maybe that's still possible for most cases), let me tinker with it. The original call to random()->get_bytes() is in CryptoRandom, and it looks like it either calls getentropy() or reads from /dev/urandom.","created_at":"2018-12-06T19:46:44Z","updated_at":"2018-12-06T19:46:44Z","html_url":"https://github.com/ceph/ceph/pull/25269#discussion_r239589466","pull_request_url":"https://api.github.com/repos/ceph/ceph/pulls/25269","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ceph/ceph/pulls/comments/239589466"},"html":{"href":"https://github.com/ceph/ceph/pull/25269#discussion_r239589466"},"pull_request":{"href":"https://api.github.com/repos/ceph/ceph/pulls/25269"}},"in_reply_to_id":239576323},"pull_request":{"url":"https://api.github.com/repos/ceph/ceph/pulls/25269","id":233739459,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMzNzM5NDU5","html_url":"https://github.com/ceph/ceph/pull/25269","diff_url":"https://github.com/ceph/ceph/pull/25269.diff","patch_url":"https://github.com/ceph/ceph/pull/25269.patch","issue_url":"https://api.github.com/repos/ceph/ceph/issues/25269","number":25269,"state":"open","locked":false,"title":"rgw: kill VLAs","user":{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false},"body":"These patches aim to begin removing C variable-length arrays (VLAs) from the Ceph code. RGW was chosen partly because it has a comparatively high number of VLA usages therefore can serve as a good study in ways of replacing VLAs with the standard library. \r\n\r\nIn the RGW code, overwhelmingly the most common usage of a VLA was as a buffer for string processing. Most of the time, it was straightforward to replace those usages with std::string.\r\n\r\nThanks to feedback so far, libfmt has been made available in Ceph (you may still need to add linking, see changes to src/rgw/CMakeLists.txt for an example).\r\n\r\nA few things to consider:\r\n* please look carefully for any errors I may have introduced, especially off-by-one errors (and, my apologies in advance!);\r\n\r\nI hope that we can continue to incrementally replace VLAs in situations where they aren't absolutely needed, with the goal of enabling the \"-Wvla\" flag (\"-pedantic\" has also been suggested, this is also worth considering).\r\n\r\nThanks for your time and constructive feedback!\r\n","created_at":"2018-11-27T00:17:22Z","updated_at":"2018-12-06T19:46:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"09c401264f147fc8b90520d70676c297f970cf27","assignee":{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false},"assignees":[{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"mattbenjamin","id":301287,"node_id":"MDQ6VXNlcjMwMTI4Nw==","avatar_url":"https://avatars2.githubusercontent.com/u/301287?v=4","gravatar_id":"","url":"https://api.github.com/users/mattbenjamin","html_url":"https://github.com/mattbenjamin","followers_url":"https://api.github.com/users/mattbenjamin/followers","following_url":"https://api.github.com/users/mattbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/mattbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/mattbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattbenjamin/subscriptions","organizations_url":"https://api.github.com/users/mattbenjamin/orgs","repos_url":"https://api.github.com/users/mattbenjamin/repos","events_url":"https://api.github.com/users/mattbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/mattbenjamin/received_events","type":"User","site_admin":false},{"login":"markhpc","id":1286295,"node_id":"MDQ6VXNlcjEyODYyOTU=","avatar_url":"https://avatars0.githubusercontent.com/u/1286295?v=4","gravatar_id":"","url":"https://api.github.com/users/markhpc","html_url":"https://github.com/markhpc","followers_url":"https://api.github.com/users/markhpc/followers","following_url":"https://api.github.com/users/markhpc/following{/other_user}","gists_url":"https://api.github.com/users/markhpc/gists{/gist_id}","starred_url":"https://api.github.com/users/markhpc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markhpc/subscriptions","organizations_url":"https://api.github.com/users/markhpc/orgs","repos_url":"https://api.github.com/users/markhpc/repos","events_url":"https://api.github.com/users/markhpc/events{/privacy}","received_events_url":"https://api.github.com/users/markhpc/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":140959062,"node_id":"MDU6TGFiZWwxNDA5NTkwNjI=","url":"https://api.github.com/repos/ceph/ceph/labels/cleanup","name":"cleanup","color":"009800","default":false},{"id":204137300,"node_id":"MDU6TGFiZWwyMDQxMzczMDA=","url":"https://api.github.com/repos/ceph/ceph/labels/performance","name":"performance","color":"bfdadc","default":false},{"id":144329618,"node_id":"MDU6TGFiZWwxNDQzMjk2MTg=","url":"https://api.github.com/repos/ceph/ceph/labels/rgw","name":"rgw","color":"00ffe4","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ceph/ceph/pulls/25269/commits","review_comments_url":"https://api.github.com/repos/ceph/ceph/pulls/25269/comments","review_comment_url":"https://api.github.com/repos/ceph/ceph/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ceph/ceph/issues/25269/comments","statuses_url":"https://api.github.com/repos/ceph/ceph/statuses/935c56b0e93aed20bebe3ae6eaf597113d54e28d","head":{"label":"chardan:jfw-wip-rgw-VLAs","ref":"jfw-wip-rgw-VLAs","sha":"935c56b0e93aed20bebe3ae6eaf597113d54e28d","user":{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false},"repo":{"id":51551312,"node_id":"MDEwOlJlcG9zaXRvcnk1MTU1MTMxMg==","name":"ceph","full_name":"chardan/ceph","private":false,"owner":{"login":"chardan","id":1643380,"node_id":"MDQ6VXNlcjE2NDMzODA=","avatar_url":"https://avatars3.githubusercontent.com/u/1643380?v=4","gravatar_id":"","url":"https://api.github.com/users/chardan","html_url":"https://github.com/chardan","followers_url":"https://api.github.com/users/chardan/followers","following_url":"https://api.github.com/users/chardan/following{/other_user}","gists_url":"https://api.github.com/users/chardan/gists{/gist_id}","starred_url":"https://api.github.com/users/chardan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chardan/subscriptions","organizations_url":"https://api.github.com/users/chardan/orgs","repos_url":"https://api.github.com/users/chardan/repos","events_url":"https://api.github.com/users/chardan/events{/privacy}","received_events_url":"https://api.github.com/users/chardan/received_events","type":"User","site_admin":false},"html_url":"https://github.com/chardan/ceph","description":"Ceph is a distributed object, block, and file storage platform ","fork":true,"url":"https://api.github.com/repos/chardan/ceph","forks_url":"https://api.github.com/repos/chardan/ceph/forks","keys_url":"https://api.github.com/repos/chardan/ceph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chardan/ceph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chardan/ceph/teams","hooks_url":"https://api.github.com/repos/chardan/ceph/hooks","issue_events_url":"https://api.github.com/repos/chardan/ceph/issues/events{/number}","events_url":"https://api.github.com/repos/chardan/ceph/events","assignees_url":"https://api.github.com/repos/chardan/ceph/assignees{/user}","branches_url":"https://api.github.com/repos/chardan/ceph/branches{/branch}","tags_url":"https://api.github.com/repos/chardan/ceph/tags","blobs_url":"https://api.github.com/repos/chardan/ceph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chardan/ceph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chardan/ceph/git/refs{/sha}","trees_url":"https://api.github.com/repos/chardan/ceph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chardan/ceph/statuses/{sha}","languages_url":"https://api.github.com/repos/chardan/ceph/languages","stargazers_url":"https://api.github.com/repos/chardan/ceph/stargazers","contributors_url":"https://api.github.com/repos/chardan/ceph/contributors","subscribers_url":"https://api.github.com/repos/chardan/ceph/subscribers","subscription_url":"https://api.github.com/repos/chardan/ceph/subscription","commits_url":"https://api.github.com/repos/chardan/ceph/commits{/sha}","git_commits_url":"https://api.github.com/repos/chardan/ceph/git/commits{/sha}","comments_url":"https://api.github.com/repos/chardan/ceph/comments{/number}","issue_comment_url":"https://api.github.com/repos/chardan/ceph/issues/comments{/number}","contents_url":"https://api.github.com/repos/chardan/ceph/contents/{+path}","compare_url":"https://api.github.com/repos/chardan/ceph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chardan/ceph/merges","archive_url":"https://api.github.com/repos/chardan/ceph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chardan/ceph/downloads","issues_url":"https://api.github.com/repos/chardan/ceph/issues{/number}","pulls_url":"https://api.github.com/repos/chardan/ceph/pulls{/number}","milestones_url":"https://api.github.com/repos/chardan/ceph/milestones{/number}","notifications_url":"https://api.github.com/repos/chardan/ceph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chardan/ceph/labels{/name}","releases_url":"https://api.github.com/repos/chardan/ceph/releases{/id}","deployments_url":"https://api.github.com/repos/chardan/ceph/deployments","created_at":"2016-02-11T22:18:40Z","updated_at":"2016-02-11T22:18:57Z","pushed_at":"2018-12-04T03:43:01Z","git_url":"git://github.com/chardan/ceph.git","ssh_url":"git@github.com:chardan/ceph.git","clone_url":"https://github.com/chardan/ceph.git","svn_url":"https://github.com/chardan/ceph","homepage":"http://ceph.com","size":315531,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ceph:master","ref":"master","sha":"84f25f598db4d8043c8a50502e674eabf66ccc75","user":{"login":"ceph","id":1015767,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTU3Njc=","avatar_url":"https://avatars3.githubusercontent.com/u/1015767?v=4","gravatar_id":"","url":"https://api.github.com/users/ceph","html_url":"https://github.com/ceph","followers_url":"https://api.github.com/users/ceph/followers","following_url":"https://api.github.com/users/ceph/following{/other_user}","gists_url":"https://api.github.com/users/ceph/gists{/gist_id}","starred_url":"https://api.github.com/users/ceph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ceph/subscriptions","organizations_url":"https://api.github.com/users/ceph/orgs","repos_url":"https://api.github.com/users/ceph/repos","events_url":"https://api.github.com/users/ceph/events{/privacy}","received_events_url":"https://api.github.com/users/ceph/received_events","type":"Organization","site_admin":false},"repo":{"id":2310495,"node_id":"MDEwOlJlcG9zaXRvcnkyMzEwNDk1","name":"ceph","full_name":"ceph/ceph","private":false,"owner":{"login":"ceph","id":1015767,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMTU3Njc=","avatar_url":"https://avatars3.githubusercontent.com/u/1015767?v=4","gravatar_id":"","url":"https://api.github.com/users/ceph","html_url":"https://github.com/ceph","followers_url":"https://api.github.com/users/ceph/followers","following_url":"https://api.github.com/users/ceph/following{/other_user}","gists_url":"https://api.github.com/users/ceph/gists{/gist_id}","starred_url":"https://api.github.com/users/ceph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ceph/subscriptions","organizations_url":"https://api.github.com/users/ceph/orgs","repos_url":"https://api.github.com/users/ceph/repos","events_url":"https://api.github.com/users/ceph/events{/privacy}","received_events_url":"https://api.github.com/users/ceph/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ceph/ceph","description":"Ceph is a distributed object, block, and file storage platform ","fork":false,"url":"https://api.github.com/repos/ceph/ceph","forks_url":"https://api.github.com/repos/ceph/ceph/forks","keys_url":"https://api.github.com/repos/ceph/ceph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ceph/ceph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ceph/ceph/teams","hooks_url":"https://api.github.com/repos/ceph/ceph/hooks","issue_events_url":"https://api.github.com/repos/ceph/ceph/issues/events{/number}","events_url":"https://api.github.com/repos/ceph/ceph/events","assignees_url":"https://api.github.com/repos/ceph/ceph/assignees{/user}","branches_url":"https://api.github.com/repos/ceph/ceph/branches{/branch}","tags_url":"https://api.github.com/repos/ceph/ceph/tags","blobs_url":"https://api.github.com/repos/ceph/ceph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ceph/ceph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ceph/ceph/git/refs{/sha}","trees_url":"https://api.github.com/repos/ceph/ceph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ceph/ceph/statuses/{sha}","languages_url":"https://api.github.com/repos/ceph/ceph/languages","stargazers_url":"https://api.github.com/repos/ceph/ceph/stargazers","contributors_url":"https://api.github.com/repos/ceph/ceph/contributors","subscribers_url":"https://api.github.com/repos/ceph/ceph/subscribers","subscription_url":"https://api.github.com/repos/ceph/ceph/subscription","commits_url":"https://api.github.com/repos/ceph/ceph/commits{/sha}","git_commits_url":"https://api.github.com/repos/ceph/ceph/git/commits{/sha}","comments_url":"https://api.github.com/repos/ceph/ceph/comments{/number}","issue_comment_url":"https://api.github.com/repos/ceph/ceph/issues/comments{/number}","contents_url":"https://api.github.com/repos/ceph/ceph/contents/{+path}","compare_url":"https://api.github.com/repos/ceph/ceph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ceph/ceph/merges","archive_url":"https://api.github.com/repos/ceph/ceph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ceph/ceph/downloads","issues_url":"https://api.github.com/repos/ceph/ceph/issues{/number}","pulls_url":"https://api.github.com/repos/ceph/ceph/pulls{/number}","milestones_url":"https://api.github.com/repos/ceph/ceph/milestones{/number}","notifications_url":"https://api.github.com/repos/ceph/ceph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ceph/ceph/labels{/name}","releases_url":"https://api.github.com/repos/ceph/ceph/releases{/id}","deployments_url":"https://api.github.com/repos/ceph/ceph/deployments","created_at":"2011-09-01T21:41:26Z","updated_at":"2018-12-06T18:38:21Z","pushed_at":"2018-12-06T19:43:25Z","git_url":"git://github.com/ceph/ceph.git","ssh_url":"git@github.com:ceph/ceph.git","clone_url":"https://github.com/ceph/ceph.git","svn_url":"https://github.com/ceph/ceph","homepage":"http://ceph.com","size":336330,"stargazers_count":5365,"watchers_count":5365,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2822,"mirror_url":null,"archived":false,"open_issues_count":612,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2822,"open_issues":612,"watchers":5365,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ceph/ceph/pulls/25269"},"html":{"href":"https://github.com/ceph/ceph/pull/25269"},"issue":{"href":"https://api.github.com/repos/ceph/ceph/issues/25269"},"comments":{"href":"https://api.github.com/repos/ceph/ceph/issues/25269/comments"},"review_comments":{"href":"https://api.github.com/repos/ceph/ceph/pulls/25269/comments"},"review_comment":{"href":"https://api.github.com/repos/ceph/ceph/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ceph/ceph/pulls/25269/commits"},"statuses":{"href":"https://api.github.com/repos/ceph/ceph/statuses/935c56b0e93aed20bebe3ae6eaf597113d54e28d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"chardan"}}