Ejemplo n.º 1
0
void ObMergerRequest::request_used_time(const ObMergerRpcEvent * rpc)
{
  if (rpc != NULL)
  {
    ObMergerServerCounter * counter = GET_TSI_MULT(ObMergerServerCounter, SERVER_COUNTER_ID);
    if (counter != NULL)
    {
      counter->inc(rpc->get_server(), rpc->get_time_used() / 100);
    }
  }
}
int32_t ObChunkServerTaskDispatcher::select_cs(ObMergerTabletLocationList & list)
{
  int64_t list_size = list.size();
  int32_t ret = static_cast<int32_t>(random() % list_size);
  if (get_factor_ > 0)
  {
    ObMergerServerCounter * counter = GET_TSI_MULT(ObMergerServerCounter, SERVER_COUNTER_ID);
    if (NULL == counter)
    {
      TBSYS_LOG(WARN, "get tsi server counter failed:counter[%p]", counter);
    }
    else
    {
      int64_t min_count = (((uint64_t)1) << 63) - 1;
      int64_t cur_count = 0;
      for (int32_t i = 0; i < list_size; ++i)
      {
        if (list[i].err_times_ >= ObMergerTabletLocation::MAX_ERR_TIMES)
        {
          continue;
        }
        cur_count = counter->get(list[i].server_.chunkserver_);
        if (0 == cur_count)
        {
          ret = i;
          break;
        }
        if (cur_count < min_count)
        {
          min_count = cur_count;
          ret = i;
        }
      }
    }
    if ((ret >= 0) && (ret < list_size) && (counter != NULL))
    {
      int err = counter->inc(list[ret].server_.chunkserver_, get_factor_);
      if (err != OB_SUCCESS)
      {
        TBSYS_LOG(WARN, "inc selected cs failed:ret[%d], err[%d]", ret, err);
      }
    }
  }
  return ret;
}
int ObChunkServerTaskDispatcher::select_cs(const int64_t factor, ObChunkServer * replicas_in_out,
    const int32_t replica_count_in, const int32_t last_query_idx_in, const ObString & start_row_key)
{
  int ret = OB_SUCCESS;
  UNUSED(start_row_key);
  if(OB_SUCCESS == ret && NULL == replicas_in_out)
  {
    ret = OB_INVALID_ARGUMENT;
    TBSYS_LOG(WARN, "parameter replicas_in_out is null");
  }

  if(OB_SUCCESS == ret && replica_count_in <= 0)
  {
    ret = OB_INVALID_ARGUMENT;
    TBSYS_LOG(WARN, "replica_count_in should be positive:replica_count_in[%d]", replica_count_in);
  }

  if(OB_SUCCESS == ret && last_query_idx_in >= replica_count_in)
  {
    ret = OB_INVALID_ARGUMENT;
    TBSYS_LOG(WARN, "last_query_idx_in should be less than replica_count_in:last_query_idx_in[%d], replica_count_in[%d]",
      last_query_idx_in, replica_count_in);
  }
  if(OB_SUCCESS == ret)
  {
    ObMergerServerCounter * counter = GET_TSI_MULT(ObMergerServerCounter, SERVER_COUNTER_ID);
    if (NULL == counter)
    {
      TBSYS_LOG(WARN, "get tsi server counter failed:counter[%p]", counter);
    }
    if(last_query_idx_in < 0) // The first time request
    {
      /// for(int32_t i=0;i<replica_count_in;i++)
      /// {
      ///   replicas_in_out[i].status_ = ObChunkServer::UNREQUESTED;
      /// }
      ///
      /// /*
      /// uint64_t crc_value = ob_crc64(start_row_key.ptr(), start_row_key.length());
      /// crc_value = ob_crc64(crc_value, &local_ip_, sizeof(local_ip_));
      /// ret = crc_value % replica_count_in;
      /// */
      /// uint64_t hash_value = 0;
      /// hash_value = murmurhash2(&local_ip_,sizeof(local_ip_),hash_value);
      /// hash_value = murmurhash2(start_row_key.ptr(), start_row_key.length(), hash_value);
      /// ret = hash_value % replica_count_in;
      /// replicas_in_out[ret].status_ = ObChunkServer::REQUESTED;
      /// ret = static_cast<int32_t>(random()%replica_count_in);
      /// select the min request counter server
      ret = select_cs(using_new_balance_, replicas_in_out, replica_count_in, counter);
      replicas_in_out[ret].status_ = ObChunkServer::REQUESTED;
    }
    else
    {
      ret = OB_ENTRY_NOT_EXIST;
      for(int i=1;i<=replica_count_in;i++)
      {
        int next = (last_query_idx_in + i) % replica_count_in;
        if(ObChunkServer::UNREQUESTED == replicas_in_out[next].status_)
        {
          ret = next;
          replicas_in_out[ret].status_ = ObChunkServer::REQUESTED;
          break;
        }
      }
      if(OB_ENTRY_NOT_EXIST == ret)
      {
        TBSYS_LOG(INFO, "There is no chunkserver which is never requested");
      }
    }
    // always open for dump output
    if (using_new_balance_ && (ret >= 0) && (ret < replica_count_in) && (counter != NULL))
    {
      int err = counter->inc(replicas_in_out[ret].addr_, factor);
      if (err != OB_SUCCESS)
      {
        TBSYS_LOG(WARN, "inc selected cs failed:ret[%d], err[%d]", ret, err);
      }
    }
  }
  return ret;

}