int load_string(tbsys::CConfig& config, char* dest, const int32_t size,
        const char* section, const char* name, bool not_null)
    {
      int ret = OB_SUCCESS;
      if (NULL == dest || 0 >= size || NULL == section || NULL == name)
      {
        ret = OB_ERROR;
      }

      const char* value = NULL;
      if (OB_SUCCESS == ret)
      {
        value = config.getString(section, name);
        if (not_null && (NULL == value || 0 >= strlen(value)))
        {
          TBSYS_LOG(ERROR, "%s.%s has not been set.", section, name);
          ret = OB_ERROR;
        }
      }

      if (OB_SUCCESS == ret && NULL != value)
      {
        if ((int32_t)strlen(value) >= size)
        {
          TBSYS_LOG(ERROR, "%s.%s too long, length (%d) > %d",
              section, name, (int32_t)strlen(value), size);
          ret = OB_SIZE_OVERFLOW;
        }
        else
        {
          memset(dest, 0, size);
          strncpy(dest, value, strlen(value));
        }
      }

      return ret;
    }
    int ObMergeServerParams::load_string(tbsys::CConfig & conf, char* dest, const int32_t size,
      const char* section, const char* name, bool require)
    {
      int ret = OB_SUCCESS;
      if (NULL == dest || 0 >= size || NULL == section || NULL == name)
      {
        ret = OB_ERROR;
      }

      const char* value = NULL;
      if (OB_SUCCESS == ret)
      {
        value = conf.getString(section, name);
        if (require && (NULL == value || 0 >= strlen(value)))
        {
          TBSYS_LOG(ERROR, "%s.%s has not been set.", section, name);
          ret = OB_ERROR;
        }
      }

      if (OB_SUCCESS == ret && NULL != value)
      {
        if ((int32_t)strlen(value) >= size)
        {
          TBSYS_LOG(ERROR, "%s.%s too long, length (%ld) > %d",
            section, name, strlen(value), size);
          ret = OB_SIZE_OVERFLOW;
        }
        else
        {
          strncpy(dest, value, strlen(value));
        }
      }

      return ret;
    }
    int ObMergeServerParams::load_from_config(tbsys::CConfig & conf)
    {
      int ret = OB_SUCCESS;

      ret = load_string(conf, root_server_ip_, OB_MAX_IP_SIZE, OBMS_RS_SECTION, OBMS_VIP);
      if (ret == OB_SUCCESS)
      {
        ret = load_string(conf, dev_name_, OB_MAX_IP_SIZE, OBMS_MS_SECTION, OBMS_DEVNAME);
      }

      if (ret == OB_SUCCESS)
      {
        server_listen_port_ = conf.getInt(OBMS_MS_SECTION, OBMS_PORT, 0);
        if (server_listen_port_ <= 0)
        {
          TBSYS_LOG(ERROR, "mergeserver listen port must > 0, got (%d)", server_listen_port_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        root_server_port_ = conf.getInt(OBMS_RS_SECTION, OBMS_PORT, 0);
        if (root_server_port_ <= 0)
        {
          TBSYS_LOG(ERROR, "root server's port must > 0, got (%d)", root_server_port_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        task_queue_size_ = conf.getInt(OBMS_MS_SECTION, OBMS_TASK_QUEUE_SIZE, 1000);
        if (task_queue_size_ <= 0)
        {
          TBSYS_LOG(ERROR, "task queue size must > 0, got (%d)", task_queue_size_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        task_thread_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_TASK_THREAD_COUNT, 20);
        if (task_thread_count_ <= 0)
        {
          TBSYS_LOG(ERROR, "task thread count must > 0, got (%d)", task_thread_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        task_left_time_ = conf.getInt(OBMS_MS_SECTION, OBMS_TASK_LEFT_TIME, 100 * 1000);
        if (task_left_time_ < 0)
        {
          TBSYS_LOG(ERROR, "task left time must >= 0, got (%ld)", task_left_time_);
          ret = OB_INVALID_ARGUMENT;
        }
        // log interval count
        log_interval_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_LOG_INTERVAL_COUNT, 100);
      }

      if (ret == OB_SUCCESS)
      {
        network_time_out_ = conf.getInt(OBMS_MS_SECTION, OBMS_NETWORK_TIMEOUT, 2000000);
        if (network_time_out_ <= 0)
        {
          TBSYS_LOG(ERROR, "network timeout must > 0, got (%ld)", network_time_out_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        ups_blacklist_timeout_ = conf.getInt(OBMS_MS_SECTION, OBMS_BLACKLIST_TIMEOUT, 60 * 1000 * 1000L);
        if (ups_blacklist_timeout_ <= 0)
        {
          TBSYS_LOG(ERROR, "ups in blacklist timeout must > 0, got (%ld)", ups_blacklist_timeout_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        ups_fail_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_BLACKLIST_FAIL_COUNT, 100);
        if (ups_fail_count_ <= 0)
        {
          TBSYS_LOG(ERROR, "ups fail count into blacklist must > 0, got (%ld)", ups_fail_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        fetch_ups_interval_ = conf.getInt(OBMS_MS_SECTION, OBMS_UPSLIST_INTERVAL, 60 * 1000 * 1000L);
        if (fetch_ups_interval_<= 0)
        {
          TBSYS_LOG(ERROR, "fetch ups list interval time must > 0, got (%ld)", fetch_ups_interval_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        frozen_version_timeout_ = conf.getInt(OBMS_MS_SECTION, OBMS_UPSVERION_TIMEOT, 600 * 1000 * 1000L);
        if (frozen_version_timeout_ <= 0)
        {
          TBSYS_LOG(ERROR, "ups frozen version cache tiemout must > 0, got (%ld)", frozen_version_timeout_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        check_lease_interval_ = conf.getInt(OBMS_MS_SECTION, OBMS_LEASE_INTERVAL, 6 * 1000 * 1000L);
        if (check_lease_interval_ <= 0)
        {
          TBSYS_LOG(ERROR, "check lease interval time must > 0, got (%ld)", check_lease_interval_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        monitor_interval_ = conf.getInt(OBMS_MS_SECTION, OBMS_MONITOR_INTERVAL, 600 * 1000 * 1000L);
        if (monitor_interval_ <= 0)
        {
          TBSYS_LOG(ERROR, "monitor interval time must > 0, got (%ld)", monitor_interval_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        retry_times_ = conf.getInt(OBMS_MS_SECTION, OBMS_RETRY_TIMES, 3);
        if (retry_times_ < 0)
        {
          TBSYS_LOG(ERROR, "retry_times must >= 0, got (%d)", retry_times_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (OB_SUCCESS == ret)
      {
        location_cache_timeout_ = conf.getInt(OBMS_MS_SECTION, OBMS_LOCATION_CACHE_TIMEOUT, 1000 * 1000 * 600L);
        if (location_cache_timeout_ <= 0)
        {
          TBSYS_LOG(ERROR, "tablet location cache timeout must > 0, got (%ld)", location_cache_timeout_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (OB_SUCCESS == ret)
      {
        location_cache_size_ = conf.getInt(OBMS_MS_SECTION, OBMS_LOCATION_CACHE_SIZE);
        if (location_cache_size_ <= 0)
        {
          TBSYS_LOG(ERROR, "tablet location cache size should great than 0 got (%d)",
            location_cache_size_);
          ret = OB_INVALID_ARGUMENT;
        }
        else
        {
          location_cache_size_ *= 1024*1024;
        }
      }

      if (ret == OB_SUCCESS)
      {
        intermediate_buffer_size_ = conf.getInt(OBMS_MS_SECTION, OBMS_INTERMEDIATE_BUFFER_SIZE, 24);
        if (intermediate_buffer_size_ <= 0)
        {
          TBSYS_LOG(ERROR, "intermediate_buffer_size_ must > 0, got (%ld)", intermediate_buffer_size_);
          ret = OB_INVALID_ARGUMENT;
        }
        else
        {
          intermediate_buffer_size_ *= 1024*1024;
        }
      }

      if (OB_SUCCESS == ret)
      {
        max_parellel_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_MAX_PARELLEL_COUNT, 16);
        if (max_parellel_count_ <= 0)
        {
          TBSYS_LOG(ERROR, "max_parellel_count_ must > 0, got (%ld)", max_parellel_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }
      if (OB_SUCCESS == ret)
      {
        max_get_rows_per_subreq_ = conf.getInt(OBMS_MS_SECTION, OBMS_MAX_GET_ROWS_PER_SUBREQ, 20);
        if (max_get_rows_per_subreq_ < 0)
        {
          TBSYS_LOG(ERROR, "max_get_rows_per_subreq_ must > 0, got (%ld)", max_get_rows_per_subreq_);
          ret = OB_INVALID_ARGUMENT;
        }
      }
      if (OB_SUCCESS == ret)
      {
        slow_query_threshold_= conf.getInt(OBMS_MS_SECTION, OBMS_SLOW_QUERY_THRESHOLD, 100000);
        if (slow_query_threshold_ <= 0)
        {
          TBSYS_LOG(ERROR, "slow_query_threshold must > 0, got (%ld)", slow_query_threshold_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (OB_SUCCESS == ret)
      {
        max_req_process_time_ = conf.getInt(OBMS_MS_SECTION, OBMS_MAX_REQ_PROCESS_TIME, 1500000);
        if (max_req_process_time_ <= 0)
        {
          TBSYS_LOG(ERROR, "max_req_process_time_ must > 0, got (%ld)", max_req_process_time_);
          ret = OB_INVALID_ARGUMENT;
        }
      }
      if (OB_SUCCESS == ret)
      {
        int64_t percent =  conf.getInt(OBMS_MS_SECTION, OBMS_MAX_CS_TIMEOUT_PERCENT, 70);
        if (percent <= 0 || percent > 100)
        {
          TBSYS_LOG(ERROR, "max_cs_time_percent must be in  (0, 100], but here , it is %ld", percent);
          ret = OB_INVALID_ARGUMENT;
        }
        else
        {
          max_cs_timeout_percent_ = (static_cast<double>(percent) / 100.0);
        }
      }

      if (ret == OB_SUCCESS)
      {
        support_session_next_ = conf.getInt(OBMS_MS_SECTION, OBMS_SUPPORT_SESSION_NEXT, 0);
        if ((support_session_next_!= 0) && (support_session_next_ != 1))
        {
          TBSYS_LOG(ERROR, "supoort session next must 0 or 1 it's [%d]", support_session_next_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        allow_return_uncomplete_result_ = conf.getInt(OBMS_MS_SECTION, OBMS_ALLOW_RETURN_UNCOMPLETE_RESULT, 0);
        if ((allow_return_uncomplete_result_ != 0) && (allow_return_uncomplete_result_ != 1))
        {
          TBSYS_LOG(ERROR, "allow_return_uncomplete_result must 0 or 1 it's [%d]", allow_return_uncomplete_result_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        memory_size_limit_ = conf.getInt(OBMS_MS_SECTION, OBMS_MEMORY_SIZE_LIMIT_PERCENT, 15);
        if (memory_size_limit_ < OB_MS_MIN_MEMORY_SIZE_LIMIT
          || OB_MS_MAX_MEMORY_SIZE_LIMIT < memory_size_limit_)
        {
          TBSYS_LOG(ERROR, "memory_size_limit_percent between [%ld,%ld], got (%ld)", OB_MS_MIN_MEMORY_SIZE_LIMIT,
            OB_MS_MAX_MEMORY_SIZE_LIMIT, memory_size_limit_);
          ret = OB_INVALID_ARGUMENT;
        }
        else
        {
          memory_size_limit_ = memory_size_limit_*sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PAGE_SIZE)/100;
          ob_set_memory_size_limit(memory_size_limit_);
          TBSYS_LOG(DEBUG, "set memory size limit [limit:%ld]", memory_size_limit_);
        }
      }

      if (ret == OB_SUCCESS)
      {
        query_cache_size_ = conf.getInt(OBMS_MS_SECTION, OBMS_QUERY_CACHE_SIZE, 0);
        if (query_cache_size_ < 0)
        {
          TBSYS_LOG(ERROR, "query_cache_size_ must >= 0, got (%ld)", query_cache_size_);
          ret = OB_INVALID_ARGUMENT;
        }
        else
        {
          query_cache_size_ *= 1024*1024;
        }
      }

      if (ret == OB_SUCCESS)
      {
        min_drop_error_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_MIN_DROP_ERROR_COUNT, 1);
        if (min_drop_error_count_ <= 0)
        {
          TBSYS_LOG(ERROR, "min drop packet count for error log must > 0, got (%ld)", min_drop_error_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        max_access_lock_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_MAX_ACCESS_LOCK_COUNT, 10);
        if (max_access_lock_count_ <= 0)
        {
          TBSYS_LOG(ERROR, "max access root server lock count must > 0, got (%d)", max_access_lock_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        reserve_get_param_count_ = conf.getInt(OBMS_MS_SECTION, OBMS_RESERVE_GET_PARAM_COUNT, 5);
        if (reserve_get_param_count_ < 0)
        {
          TBSYS_LOG(ERROR, "reserve get param count must >= 0, got (%d)", reserve_get_param_count_);
          ret = OB_INVALID_ARGUMENT;
        }
      }

      if (ret == OB_SUCCESS)
      {
        // default not open
        get_request_factor_ = conf.getInt(OBMS_MS_SECTION, OBMS_GET_REQUEST_FACTOR, 1);
        scan_request_factor_ = conf.getInt(OBMS_MS_SECTION, OBMS_SCAN_REQUEST_FACTOR, 2);
      }
      return ret;
    }