From: Radoslaw Zarzynski Date: Thu, 25 May 2017 15:21:14 +0000 (+0200) Subject: rgw: optimize AWSv4 parsing with Boost's small_vector. X-Git-Tag: v12.1.0~155^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=20603086b395869839684a16a9e13df17fd4deb6;p=ceph.git rgw: optimize AWSv4 parsing with Boost's small_vector. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_auth_s3.cc b/src/rgw/rgw_auth_s3.cc index 0bd7f9a33acd..8c7d448902fc 100644 --- a/src/rgw/rgw_auth_s3.cc +++ b/src/rgw/rgw_auth_s3.cc @@ -15,6 +15,7 @@ #include "rgw_rest.h" #include "rgw_crypt_sanitize.h" +#include #include #define dout_context g_ceph_context @@ -320,10 +321,11 @@ static bool get_next_token(const boost::string_view& s, return true; } -std::vector get_str_vec(const boost::string_view& str, - const char* const delims) +template +boost::container::small_vector +get_str_vec(const boost::string_view& str, const char* const delims) { - std::vector str_vec; + boost::container::small_vector str_vec; size_t pos = 0; boost::string_view token; @@ -338,10 +340,12 @@ std::vector get_str_vec(const boost::string_view& str, return str_vec; } -std::vector get_str_vec(const boost::string_view& str) +template +boost::container::small_vector +get_str_vec(const boost::string_view& str) { const char delims[] = ";,= \t"; - return get_str_vec(str, delims); + return get_str_vec(str, delims); } }; @@ -362,7 +366,7 @@ static inline int parse_v4_auth_header(const req_info& info, /* in } std::map kv; - for (const auto& s : get_str_vec(input, ",")) { + for (const auto& s : get_str_vec<4>(input, ",")) { const auto parsed_pair = parse_key_value(s); if (parsed_pair) { kv[parsed_pair->first] = parsed_pair->second; @@ -511,7 +515,7 @@ std::string get_v4_canonical_qs(const req_info& info, const bool using_qs) /* Handle case when query string exists. Step 3 described in: http://docs. * aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html */ std::map canonical_qs_map; - for (const auto& s : get_str_vec(info.request_params, "&")) { + for (const auto& s : get_str_vec<5>(info.request_params, "&")) { boost::string_view key, val; const auto parsed_pair = parse_key_value(s); if (parsed_pair) { @@ -563,7 +567,7 @@ get_v4_canonical_headers(const req_info& info, const bool force_boto2_compat) { std::map canonical_hdrs_map; - for (const auto& token : get_str_vec(signedheaders, ";")) { + for (const auto& token : get_str_vec<5>(signedheaders, ";")) { /* TODO(rzarzynski): we'd like to switch to sstring here but it should * get push_back() and reserve() first. */ std::string token_env = "HTTP_";