コード例 #1
0
TEST_F(TestRpcStub, test_fetch_schema) 
{
  ObMergerRpcStub stub;
  ThreadSpecificBuffer buffer;
  ObPacketFactory factory;
  tbnet::Transport transport;
  tbnet::DefaultPacketStreamer streamer; 
  streamer.setPacketFactory(&factory);
  transport.start();
  ObClientManager client_manager;

  EXPECT_TRUE(OB_SUCCESS == client_manager.initialize(&transport, &streamer));
  EXPECT_TRUE(OB_SUCCESS == stub.init(&buffer, &client_manager));

  // self server 
  ObServer root_server;
  root_server.set_ipv4_addr(addr, MockRootServer::ROOT_SERVER_PORT);

  // start root server
  MockRootServer server;
  MockServerRunner test_root_server(server);
  tbsys::CThread root_server_thread;
  root_server_thread.start(&test_root_server, NULL); 
  sleep(2); 

  ObSchemaManagerV2 manager;
  // wrong version
  int64_t timestamp = 1023;
  EXPECT_TRUE(OB_SUCCESS != stub.fetch_schema(timeout, root_server, timestamp, manager));

  timestamp = 1024;
  EXPECT_TRUE(OB_SUCCESS == stub.fetch_schema(timeout, root_server, timestamp, manager));
  EXPECT_TRUE(manager.get_version() == 1025);
  
  transport.stop();
  server.stop();
  sleep(10);
}
コード例 #2
0
ファイル: ob_rs_rpc_proxy.cpp プロジェクト: Abioy/oceanbase
int ObMergerRootRpcProxy::fetch_newest_schema(ObMergerSchemaManager * schema_manager,
    const ObSchemaManagerV2 ** manager)
{
  /// fetch new schema
  int ret = OB_SUCCESS;
  ObSchemaManagerV2 * schema = NULL;
  if (!check_inner_stat())
  {
    TBSYS_LOG(ERROR, "%s", "check inner stat failed");
    ret = OB_INNER_STAT_ERROR;
  }
  char * temp = NULL;
  if(OB_SUCCESS == ret)
  {
    temp = (char *)ob_malloc(sizeof(ObSchemaManagerV2), ObModIds::OB_MS_RPC);
    if (NULL == temp)
    {
      TBSYS_LOG(ERROR, "%s", "check ob malloc failed");
      ret = OB_ALLOCATE_MEMORY_FAILED;
    }
    else
    {
      schema = new(temp) ObSchemaManagerV2;
      if (NULL == schema)
      {
        TBSYS_LOG(ERROR, "check replacement new schema failed:schema[%p]", schema);
        ret = OB_INNER_STAT_ERROR;
      }
      else
      {
        ret = rpc_stub_->fetch_schema(rpc_timeout_, root_server_, 0, *schema);
        if (ret != OB_SUCCESS)
        {
          TBSYS_LOG(WARN, "rpc fetch schema failed:ret[%d]", ret);
        }
      }
    }
  }
  
  if (OB_SUCCESS == ret)
  {
    ret = schema_manager->add_schema(*schema, manager);
    // maybe failed because of timer thread fetch and add it already
    if (OB_SUCCESS != ret)
    {
      TBSYS_LOG(WARN, "add new schema failed:version[%ld], ret[%d]", schema->get_version(), ret);
      ret = OB_SUCCESS;
      *manager = schema_manager->get_schema(0);
      if (NULL == *manager)
      {
        TBSYS_LOG(WARN, "get latest schema failed:schema[%p], latest[%ld]", 
            *manager, schema_manager->get_latest_version());
        ret = OB_INNER_STAT_ERROR;
      }
    }
    else
    {
      TBSYS_LOG(DEBUG, "fetch and add new schema succ:version[%ld]", schema->get_version());
    }
  }
  
  if (schema != NULL)
  {
    schema->~ObSchemaManagerV2();
  }
  if (temp != NULL)
  {
    ob_free(temp);
    temp = NULL;
  }
  ms_get_counter_set().inc(ObMergerCounterIds::C_FETCH_SCHEMA);
  return ret;
}
コード例 #3
0
ファイル: ob_rpc_stub.cpp プロジェクト: wjhh2008/oceanbase
int ObMergerRpcStub::fetch_schema(
    const int64_t timeout, const ObServer & root_server,
    const int64_t version, ObSchemaManagerV2 & schema) const
{
    int ret = OB_SUCCESS;
    ObDataBuffer data_buff;
    ret = get_rpc_buffer(data_buff);
    // step 1. serialize timestamp to data_buff
    if (OB_SUCCESS == ret)
    {
        ret = serialization::encode_vi64(data_buff.get_data(),
                                         data_buff.get_capacity(), data_buff.get_position(), version);
        if (OB_SUCCESS != ret)
        {
            TBSYS_LOG(WARN, "serialize timestamp failed:version[%ld], ret[%d]",
                      version, ret);
        }
    }
    // step 2. send request for fetch new schema
    if (OB_SUCCESS == ret)
    {
        ret = rpc_frame_->send_request(root_server, OB_FETCH_SCHEMA, DEFAULT_VERSION,
                                       timeout, data_buff);
        if (ret != OB_SUCCESS)
        {
            TBSYS_LOG(WARN, "send request to root server[%s] for fetch schema failed:"
                      "version[%ld], ret[%d]", root_server.to_cstring(), version, ret);
        }
    }
    // step 3. deserialize the response code
    int64_t pos = 0;
    if (OB_SUCCESS == ret)
    {
        ObResultCode result_code;
        ret = result_code.deserialize(data_buff.get_data(), data_buff.get_position(), pos);
        if (OB_SUCCESS != ret)
        {
            TBSYS_LOG(WARN, "deserialize result_code failed:pos[%ld], ret[%d]", pos, ret);
        }
        else
        {
            ret = result_code.result_code_;
        }
    }
    // step 4. deserialize the table schema
    if (OB_SUCCESS == ret)
    {
        ret = schema.deserialize(data_buff.get_data(), data_buff.get_position(), pos);
        if (OB_SUCCESS != ret)
        {
            TBSYS_LOG(WARN, "deserialize schema from buff failed:"
                      "version[%ld], pos[%ld], ret[%d]", version, pos, ret);
        }
        else
        {
            TBSYS_LOG(DEBUG, "fetch schema succ:version[%ld]", schema.get_version());
            //schema.print_info();
        }
    }
    return ret;
}