int RequestProcessor::process(request_prefix_hides_by_proxy *req, request_prefix_hides_by_proxy *&post_req) { int ret = TAIR_RETURN_SUCCESS; vector<tair_client_api*> *clients = invalid_loader->get_client_list(req->group_name); if (clients != NULL) { data_entry pkey; tair_dataentry_set mkey_set; tair_dataentry_set failed_key_set; if (req->key != NULL) { mkey_set.insert(req->key); split_key(req->key, &pkey, NULL); } else if (req->key_list != NULL) { tair_dataentry_set::iterator itr = req->key_list->begin(); split_key(*itr, &pkey, NULL); while (itr != req->key_list->end()) { mkey_set.insert(*itr); ++itr; } } for (size_t i = 0; i < clients->size(); ++i) { tair_client_api *client = clients->at(i); key_code_map_t key_code_map; if ((ret = client->hides(req->area, mkey_set, key_code_map)) != TAIR_RETURN_SUCCESS) { key_code_map_t::iterator itr = key_code_map.begin(); while (itr != key_code_map.end()) { if (itr->second != TAIR_RETURN_DATA_NOT_EXIST && itr->second != TAIR_RETURN_DATA_EXPIRED) { data_entry *mkey = new data_entry(); merge_key(pkey, *itr->first, *mkey); std::vector<std::string> servers; client->get_server_with_key(*mkey, servers); log_error("[FATAL ERROR] PrefixHidesFailure: Group %s, DataServer %s.", req->group_name, servers[0].c_str()); if (failed_key_set.insert(mkey).second == false) { delete mkey; } } ++itr; } defree(key_code_map); } } if (!failed_key_set.empty()) { post_req = new request_prefix_hides_by_proxy(); post_req->set_group_name(req->group_name); post_req->area = req->area; tair_dataentry_set::iterator itr = failed_key_set.begin(); while (itr != failed_key_set.end()) { post_req->add_key(*itr++); } } ret = TAIR_RETURN_SUCCESS; mkey_set.clear(); } else { log_error("[FATAL ERROR] cannot find clients, group %s not added, or still loading", req->group_name); ret = TAIR_RETURN_INVAL_CONN_ERROR; } return ret; }
// merge a host and ushort port into a key int Madara::merge_key (std::string & key, const std::string & host, unsigned short u_port) { char port_buf[16]; std::string port; // convert the server_port into string form for our context _itoa (u_port, port_buf, 10); port = port_buf; return merge_key (key, host, port); }