Пример #1
0
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();
}
Пример #2
0
//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();
}
Пример #3
0
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;
}