TEST(ObRootServer2Test2, init_report) { ObRootServer2* root_server; ObRootWorkerForTest worker; root_server = worker.get_root_server(); ASSERT_TRUE(root_server->init("./root_server.conf", 100, &worker)); ObRootServerTester tester(root_server); tester.get_wait_init_time() = 3 * 1000000; ObServer server(ObServer::IPV4, "10.10.10.1", 1001); ObServer server2(ObServer::IPV4, "10.10.10.2", 1001); ASSERT_TRUE(!(server == server2)); int64_t time_stamp = 0; root_server->start_threads(); int status; sleep(3); int ret = root_server->regist_server(server, false, status); ASSERT_EQ(ret, OB_SUCCESS); ret = root_server->regist_server(server2, false, status); ASSERT_EQ(ret, OB_SUCCESS); // now we have two cs tester.get_lease_duration() = 100 * 1000 * 1000; TBSYS_LOG(INFO, "will start test"); //tester.init_root_table_by_report(); //while (worker.start_new_send_times < 2) //{ // TBSYS_LOG(INFO, "wait send start_new_schema now %d have sended",worker.start_new_send_times); // sleep(1); //} TBSYS_LOG(INFO, "over send start_new_schema now %d have sended",worker.start_new_send_times); //all commond sended. //mimic report char buf1[10][30]; char buf2[10][30]; //const common::ObTabletInfo& tablet, const common::ObTabletLocation& location) ObTabletReportInfoList report_list1; ObTabletReportInfoList report_list2; ObTabletReportInfo report_info; ObTabletInfo info1; ObTabletLocation location; location.tablet_version_ = 0; info1.range_.table_id_ = 10001; info1.range_.border_flag_.set_inclusive_end(); info1.range_.border_flag_.unset_inclusive_start(); info1.range_.border_flag_.set_min_value(); info1.range_.border_flag_.unset_max_value(); info1.range_.start_key_.assign_buffer(buf1[0], 30); info1.range_.end_key_.assign_buffer(buf2[0], 30); info1.range_.start_key_.write("aa1", 3); info1.range_.end_key_.write("ba1", 3); location.chunkserver_ = server; report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list1.add_tablet(report_info); //ASSERT_EQ(0,root_server.got_reported(info1, location)); //(,"ba1"] server info1.range_.border_flag_.unset_min_value(); info1.range_.start_key_.assign_buffer(buf1[1], 30); info1.range_.end_key_.assign_buffer(buf2[1], 30); info1.range_.start_key_.write("ba1", 3); info1.range_.end_key_.write("ca1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list1.add_tablet(report_info); ret = root_server->report_tablets(server, report_list1,time_stamp); ASSERT_EQ(OB_SUCCESS, ret); location.chunkserver_ = server2; info1.range_.start_key_.assign_buffer(buf1[3], 30); info1.range_.end_key_.assign_buffer(buf2[3], 30); info1.range_.start_key_.write("da1", 3); info1.range_.end_key_.write("ea1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[2], 30); info1.range_.end_key_.assign_buffer(buf2[2], 30); info1.range_.start_key_.write("ca1", 3); info1.range_.end_key_.write("da1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[4], 30); info1.range_.end_key_.assign_buffer(buf2[4], 30); info1.range_.start_key_.write("ea1", 3); info1.range_.end_key_.write("fa1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[5], 30); info1.range_.end_key_.assign_buffer(buf2[5], 30); info1.range_.start_key_.write("fa1", 3); info1.range_.border_flag_.set_max_value(); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); ret = root_server->report_tablets(server2, report_list2,time_stamp); ASSERT_EQ(OB_SUCCESS, ret); //mimic schema_changed //root_server->waiting_job_done(server,time_stamp ); //root_server->waiting_job_done(server2,time_stamp ); //wait unload send //while (worker.unload_old_table_times < 2) //{ // TBSYS_LOG(INFO, "wait send unload_old_table now %d have sended", worker.unload_old_table_times); // sleep(1); //} sleep(5); { ObRootTable2 *& t_tb = tester.get_root_table_for_query(); ObRootTable2::const_iterator start; ObRootTable2::const_iterator end; ObRootTable2::const_iterator ptr; ObString key; key.assign_buffer(buf1[0], 30); key.write("cb",2); //TBSYS_LOG(DEBUG,"key"); //print(key); //t_tb->dump(); t_tb->find_key(10001,key, 1, start, end, ptr); // sholud hit ("ca1", "da1"] server2, so start will be the previous one { //should be ("ba1","ca1"] server char buf5[30]; ObString test; test.assign_buffer(buf5, 30); test.write("ba1",3); info1.range_.start_key_.assign_buffer(buf1[0], 30); info1.range_.end_key_.assign_buffer(buf2[0], 30); info1.range_.start_key_.write("ca1", 3); info1.range_.end_key_.write("da1", 3); info1.range_.border_flag_.set_inclusive_end(); info1.range_.border_flag_.unset_inclusive_start(); info1.range_.border_flag_.unset_max_value(); info1.range_.border_flag_.unset_min_value(); start++; const common::ObTabletInfo* tablet_info = NULL; tablet_info = ((const ObRootTable2*)t_tb)->get_tablet_info(start); ASSERT_TRUE(tablet_info != NULL); tablet_info->range_.hex_dump(); info1.range_.hex_dump(); ASSERT_TRUE(tablet_info->range_.equal(info1.range_)); } } root_server->stop_threads(); }
//migrate_over TEST(ObRootServer2Test2, migrate_over) { // init make a root table ObRootServer2* root_server; ObRootWorkerForTest worker; root_server = worker.get_root_server(); int64_t now = tbsys::CTimeUtil::getTime(); ASSERT_TRUE(root_server->init("./root_server.conf", 100, &worker)); ObRootServerTester tester(root_server); ObServer server(ObServer::IPV4, "10.10.10.1", 1001); ObServer server2(ObServer::IPV4, "10.10.10.2", 1001); ObServer server3(ObServer::IPV4, "10.10.10.3", 1001); ObServer server4(ObServer::IPV4, "10.10.10.4", 1001); ASSERT_TRUE(!(server == server2)); int64_t time_stamp = now; root_server->start_threads(); int status; tester.get_wait_init_time() = 2 * 1000000; sleep(2); int ret = root_server->regist_server(server, false, status); ASSERT_EQ(OB_SUCCESS, ret); ret = root_server->regist_server(server2, false, status); ASSERT_EQ(OB_SUCCESS, ret); // now we have two cs tester.get_lease_duration() = 100 * 1000 * 1000; TBSYS_LOG(INFO, "will start test"); //tester.init_root_table_by_report(); TBSYS_LOG(INFO, "over send start_new_schema now %d have sended",worker.start_new_send_times); time_stamp = 0; //all commond sended. //mimic report char buf1[10][30]; char buf2[10][30]; //const common::ObTabletInfo& tablet, const common::ObTabletLocation& location) ObTabletReportInfoList report_list1; ObTabletReportInfoList report_list2; ObTabletReportInfo report_info; ObTabletInfo info1; ObTabletLocation location; location.tablet_version_ = 1; info1.range_.table_id_ = 10001; info1.range_.border_flag_.set_inclusive_end(); info1.range_.border_flag_.unset_inclusive_start(); info1.range_.border_flag_.set_min_value(); info1.range_.border_flag_.unset_max_value(); info1.range_.start_key_.assign_buffer(buf1[0], 30); info1.range_.end_key_.assign_buffer(buf2[0], 30); info1.range_.start_key_.write("aa1", 3); info1.range_.end_key_.write("ba1", 3); location.chunkserver_ = server; report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list1.add_tablet(report_info); //ASSERT_EQ(0,root_server.got_reported(info1, location)); //(,"ba1"] server info1.range_.border_flag_.unset_min_value(); info1.range_.start_key_.assign_buffer(buf1[1], 30); info1.range_.end_key_.assign_buffer(buf2[1], 30); info1.range_.start_key_.write("ba1", 3); info1.range_.end_key_.write("ca1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list1.add_tablet(report_info); ret = root_server->report_tablets(server, report_list1,time_stamp); ASSERT_EQ(OB_SUCCESS, ret); location.chunkserver_ = server2; info1.range_.start_key_.assign_buffer(buf1[3], 30); info1.range_.end_key_.assign_buffer(buf2[3], 30); info1.range_.start_key_.write("da1", 3); info1.range_.end_key_.write("ea1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[2], 30); info1.range_.end_key_.assign_buffer(buf2[2], 30); info1.range_.start_key_.write("ca1", 3); info1.range_.end_key_.write("da1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[4], 30); info1.range_.end_key_.assign_buffer(buf2[4], 30); info1.range_.start_key_.write("ea1", 3); info1.range_.end_key_.write("fa1", 3); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); info1.range_.start_key_.assign_buffer(buf1[5], 30); info1.range_.end_key_.assign_buffer(buf2[5], 30); info1.range_.start_key_.write("fa1", 3); info1.range_.border_flag_.set_max_value(); report_info.tablet_info_ = info1; report_info.tablet_location_ = location; report_list2.add_tablet(report_info); ret = root_server->report_tablets(server2, report_list2,time_stamp); ASSERT_EQ(OB_SUCCESS, ret); //wait unload send //while (worker.unload_old_table_times < 2) //{ // TBSYS_LOG(INFO, "wait send unload_old_table now %d have sended", worker.unload_old_table_times); // sleep(1); //} ObRootTable2 *& t_tb = tester.get_root_table_for_query(); ObRootTable2::const_iterator start; ObRootTable2::const_iterator end; ObRootTable2::const_iterator ptr; sleep(3); { ObString key; key.assign_buffer(buf1[0], 30); key.write("cb",2); //TBSYS_LOG(DEBUG,"key"); //print(key); //t_tb->dump(); t_tb->find_key(10001,key, 1, start, end, ptr); // sholud hit ("ca1", "da1"] server2, so start will be the previous one { //should be ("ba1","ca1"] server char buf5[30]; ObString test; test.assign_buffer(buf5, 30); test.write("ba1",3); info1.range_.start_key_.assign_buffer(buf1[0], 30); info1.range_.end_key_.assign_buffer(buf2[0], 30); info1.range_.start_key_.write("ca1", 3); info1.range_.end_key_.write("da1", 3); info1.range_.border_flag_.set_inclusive_end(); info1.range_.border_flag_.unset_inclusive_start(); info1.range_.border_flag_.unset_max_value(); info1.range_.border_flag_.unset_min_value(); start++; const common::ObTabletInfo* tablet_info = NULL; tablet_info = ((const ObRootTable2*)t_tb)->get_tablet_info(start); ASSERT_TRUE(tablet_info != NULL); tablet_info->range_.hex_dump(); info1.range_.hex_dump(); ASSERT_TRUE(tablet_info->range_.equal(info1.range_)); } } root_server->regist_server(server3, false, status); info1.range_.table_id_ = 10001; info1.range_.border_flag_.set_inclusive_end(); info1.range_.border_flag_.unset_inclusive_start(); info1.range_.border_flag_.unset_min_value(); info1.range_.border_flag_.unset_max_value(); info1.range_.start_key_.assign_buffer(buf1[2], 30); info1.range_.end_key_.assign_buffer(buf2[2], 30); info1.range_.start_key_.write("ca1", 3); info1.range_.end_key_.write("da1", 3); ObChunkServerManager& server_manager = tester.get_server_manager(); ObChunkServerManager::iterator pos = server_manager.find_by_ip(server3); int server3_index = pos - server_manager.begin(); pos = server_manager.find_by_ip(server2); int server2_index = pos - server_manager.begin(); root_server->migrate_over(info1.range_, server2, server3, true, 1); t_tb->find_range(info1.range_, start, end); bool found_server3 =false; bool found_server2 =false; TBSYS_LOG(INFO, "check migrate result s2=%d s3=%d", server2_index, server3_index); ObRootTable2::const_iterator it = start; for (int i = 0; i < OB_SAFE_COPY_COUNT; i++) { if (server3_index == it->server_info_indexes_[i]) { found_server3 = true; } if (server2_index == it->server_info_indexes_[i]) { found_server2 = true; } } ASSERT_TRUE(found_server2); ASSERT_TRUE(found_server3); root_server->regist_server(server4, false, status); pos = server_manager.find_by_ip(server4); int server4_index = pos - server_manager.begin(); root_server->migrate_over(info1.range_, server2, server4, false, 1); TBSYS_LOG(INFO, "check migrate 2->4 "); found_server2 = false; found_server3 = false; bool found_server4 =false; it = start; for (int i = 0; i < OB_SAFE_COPY_COUNT; i++) { if (server3_index == it->server_info_indexes_[i]) { found_server3 = true; } if (server2_index == it->server_info_indexes_[i]) { found_server2 = true; } if (server4_index == it->server_info_indexes_[i]) { found_server4 = true; } } ASSERT_FALSE(found_server2); ASSERT_TRUE(found_server3); ASSERT_TRUE(found_server4); root_server->stop_threads(); }
int ObFileService::receive_file_pre(ObFileAppender& file_appender, int64_t& file_size, ObString& file_path, ObString& tmp_file_path, easy_request_t* request, ObDataBuffer& in_buffer, ObDataBuffer& out_buffer, int32_t& response_cid, const int64_t session_id) { int err = OB_SUCCESS; if (OB_SUCCESS == err) { err = serialization::decode_i64(in_buffer.get_data(), in_buffer.get_capacity(), in_buffer.get_position(), &file_size); if (OB_SUCCESS != err) { TBSYS_LOG(WARN, "Decode file_info failed: err=[%d]", err); } } char dest_dir_buf[OB_MAX_FILE_NAME_LENGTH]; ObString dest_dir; dest_dir.assign_buffer(dest_dir_buf, sizeof(dest_dir_buf)); if (OB_SUCCESS == err) { err = dest_dir.deserialize(in_buffer.get_data(), in_buffer.get_capacity(), in_buffer.get_position()); if (OB_SUCCESS != err) { TBSYS_LOG(WARN, "Decode dest_dir failed:err=[%d]", err); } } char dest_file_name_buf[OB_MAX_FILE_NAME_LENGTH]; ObString dest_file_name; dest_file_name.assign_buffer(dest_file_name_buf, sizeof(dest_file_name_buf)); if (OB_SUCCESS == err) { err = dest_file_name.deserialize(in_buffer.get_data(), in_buffer.get_capacity(), in_buffer.get_position()); if (OB_SUCCESS != err) { TBSYS_LOG(WARN, "Decode dest_file_name failed:err=[%d]", err); } } // check dir if (OB_SUCCESS == err) { err = check_dir(dest_dir, file_size); if (OB_SUCCESS != err) { TBSYS_LOG(WARN, "Check dir failed:err=[%d]", err); } } // generate tmp_file_path and file_path char file_path_buf[OB_MAX_FILE_NAME_LENGTH]; char tmp_file_path_buf[OB_MAX_FILE_NAME_LENGTH]; if (OB_SUCCESS == err) { const char tmp_file_prefix[]= "tmp_"; int64_t count = 0; count = snprintf(file_path_buf, OB_MAX_FILE_NAME_LENGTH, "%.*s/%.*s", dest_dir.length(), dest_dir.ptr(), dest_file_name.length(), dest_file_name.ptr()); if (count<0 || count >= OB_MAX_FILE_NAME_LENGTH) { err = OB_SIZE_OVERFLOW; TBSYS_LOG(WARN, "snprintf file name failed, return[%ld] [%.*s]/[%.*s]", count, dest_dir.length(), dest_dir.ptr(), dest_file_name.length(), dest_file_name.ptr()); } count = file_path.write(file_path_buf, static_cast<ObString::obstr_size_t>(strlen(file_path_buf))); if (count != static_cast<int>(strlen(file_path_buf))) { err = OB_SIZE_OVERFLOW; TBSYS_LOG(WARN, "Write file_path_buf to ObString failed"); } count = snprintf(tmp_file_path_buf, OB_MAX_FILE_NAME_LENGTH, "%.*s/%s%.*s", dest_dir.length(), dest_dir.ptr(), tmp_file_prefix, dest_file_name.length(), dest_file_name.ptr()); if (count <0 || count >= OB_MAX_FILE_NAME_LENGTH) { err = OB_SIZE_OVERFLOW; TBSYS_LOG(WARN, "snprintf tmp file name failed, return[%ld] [%.*s]/[%s][%.*s]", count, dest_dir.length(), dest_dir.ptr(), tmp_file_prefix, dest_file_name.length(), dest_file_name.ptr()); } count = tmp_file_path.write(tmp_file_path_buf, static_cast<ObString::obstr_size_t>(strlen(tmp_file_path_buf))); if (count != static_cast<int>(strlen(tmp_file_path_buf))) { err = OB_SIZE_OVERFLOW; TBSYS_LOG(WARN, "Write tmp_file_path_buf to ObString failed"); } } // check if the tmp_file and the dest file exist already if (OB_SUCCESS == err) { if (0 == access(tmp_file_path_buf, F_OK)) { TBSYS_LOG(WARN, "Tmp file [%s] already exists", tmp_file_path_buf); err = OB_FILE_ALREADY_EXIST; } if (0 == access(file_path_buf, F_OK)) { TBSYS_LOG(WARN, "File [%s] already exists", file_path_buf); err = OB_FILE_ALREADY_EXIST; } } // log operation if (OB_SUCCESS == err) { TBSYS_LOG(INFO, "start receive file: dir[%.*s] file_name[%.*s] " "tmp_file_path[%.*s] from server [%s]", dest_dir.length(), dest_dir.ptr(), dest_file_name.length(), dest_file_name.ptr(), tmp_file_path.length(), tmp_file_path.ptr(), get_peer_ip(request)); } // open tmp file if (OB_SUCCESS == err) { bool is_dio = true; bool is_create = true; bool is_trunc = true; err = file_appender.open(tmp_file_path, is_dio, is_create, is_trunc); if (OB_SUCCESS != err) { TBSYS_LOG(WARN, "open file_appender failed:tmp_file[%.*s] err[%d]", tmp_file_path.length(), tmp_file_path.ptr(), err); } } // send response ObResultCode rc; int ret = OB_SUCCESS; rc.result_code_ = err; out_buffer.get_position() = 0; if (OB_SUCCESS == ret) { ret = rc.serialize(out_buffer.get_data(), out_buffer.get_capacity(), out_buffer.get_position()); if(OB_SUCCESS != ret) { TBSYS_LOG(WARN, "Serialize result code failed:ret=[%d]", ret); } } if(OB_SUCCESS == ret) { ret = queue_thread_->prepare_for_next_request(session_id); if(OB_SUCCESS != ret) { TBSYS_LOG(WARN, "prepare for next request fail:ret=[%d]", ret); } } if (OB_SUCCESS == ret) { ret = server_->send_response(OB_SEND_FILE_REQUEST_RESPONSE, DEFAULT_VERSION, out_buffer, request, response_cid, session_id); if (OB_SUCCESS != ret) { TBSYS_LOG(WARN, "Send send_file_request_response failed:ret=[%d]", ret); } } if (OB_SUCCESS == ret && OB_SUCCESS != err) { ret = err; } return ret; }