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); }
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; }
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; }