ProxyRequestContext::ProxyRequestContext( proxy_t& pr, McMsgRef req, void (*enqReply)(ProxyRequestContext& preq), void* context, ProxyRequestPriority priority__, void (*reqComplete)(ProxyRequestContext& preq)) : requestId_(pr.nextRequestId()), proxy_(pr), context_(context), enqueueReply_(enqReply), reqComplete_(reqComplete), priority_(priority__) { logger_.emplace(&proxy_); additionalLogger_.emplace(&proxy_); static const char* const kInternalGetPrefix = "__mcrouter__."; if (req->op == mc_op_get && !strncmp(req->key.str, kInternalGetPrefix, strlen(kInternalGetPrefix))) { /* HACK: for backwards compatibility, convert (get, "__mcrouter__.key") into (get-service-info, "key") */ auto copy = MutableMcMsgRef(mc_msg_dup(req.get())); copy->op = mc_op_get_service_info; copy->key.str += strlen(kInternalGetPrefix); copy->key.len -= strlen(kInternalGetPrefix); origReq_ = std::move(copy); } else { origReq_ = std::move(req); } stat_incr_safe(proxy_.stats, proxy_request_num_outstanding_stat); }
mc_msg_t* mc_msg_dup_append_key_full(const mc_msg_t *msg, const char* key_append, size_t nkey_append) { FBI_ASSERT(msg); FBI_ASSERT(msg->_refcount > 0 || msg->_refcount == MSG_NOT_REFCOUNTED); FBI_ASSERT(key_append); // Stats are not supported. if (msg->stats) { return NULL; } if (!nkey_append) { return mc_msg_dup(msg); } size_t new_extra_size = msg->_extra_size + nkey_append; if (!_in_msg(msg, msg->key.str, msg->key.len)) { new_extra_size += msg->key.len + 1; // +1 for null terminator } mc_msg_t* const msg_copy = mc_msg_new(new_extra_size); if (msg_copy == NULL) { return NULL; } mc_msg_shallow_copy(msg_copy, msg); // The new message's key is always embedded. msg_copy->key.len = msg->key.len + nkey_append; msg_copy->key.str = (void*) msg_copy + sizeof(*msg_copy); memcpy(msg_copy->key.str, msg->key.str, msg->key.len); memcpy(msg_copy->key.str + msg->key.len, key_append, nkey_append); msg_copy->key.str[msg_copy->key.len] = 0; if (_in_msg(msg, msg->value.str, msg->value.len)) { // The value starts after the key, including the null terminator. msg_copy->value.str = msg_copy->key.str + msg_copy->key.len + 1; memcpy(msg_copy->value.str, msg->value.str, msg_copy->value.len); } return msg_copy; }