Example #1
0
  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;
  }
Example #2
0
// 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);
}