105 lines
4.7 KiB
C++
105 lines
4.7 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#ifndef OCEANBASE_ARCHIVE_OB_ARCHIVE_FILE_UTILS_H_
|
|
#define OCEANBASE_ARCHIVE_OB_ARCHIVE_FILE_UTILS_H_
|
|
|
|
#include "common/ob_partition_key.h"
|
|
#include "ob_log_archive_struct.h"
|
|
#include "clog/ob_log_entry.h"
|
|
#include "clog/ob_log_type.h"
|
|
|
|
namespace oceanbase {
|
|
namespace archive {
|
|
using oceanbase::clog::ObLogArchiveInnerLog;
|
|
using oceanbase::common::ObPGKey;
|
|
using oceanbase::common::ObString;
|
|
class ObIArchiveLogFileStore;
|
|
class ObArchiveFileUtils {
|
|
static const int64_t MAX_PATH_LENGTH = OB_MAX_ARCHIVE_PATH_LENGTH;
|
|
|
|
public:
|
|
// parameter below:
|
|
// uri: pg archive absolute path
|
|
// storage_info: authentication info
|
|
//
|
|
// get min & max file of specified partition
|
|
int get_file_range(
|
|
const ObString& prefix, const ObString& storage_info, uint64_t& min_file_id, uint64_t& max_file_id);
|
|
|
|
// get file length of specified file
|
|
int get_file_length(const ObString& uri, const ObString& storage_info, int64_t& file_len);
|
|
|
|
// read whole content of specified file
|
|
int read_single_file(
|
|
const ObString& uri, const ObString& storage_info, char* buf, const int64_t text_file_length, int64_t& read_size);
|
|
|
|
// search specified log in an index file with log id
|
|
int search_log_in_single_index_file(const ObString& uri, const ObString& storage_info, const uint64_t log_id,
|
|
uint64_t& data_file_id, bool& log_exist, ObArchiveIndexFileInfo& max_valid_index_info);
|
|
|
|
// get the sever start ts of the server, where server start ts is unique for each server
|
|
int get_server_start_archive_ts(
|
|
const ObString& uri, const ObString& storage_info, int64_t& archive_round, int64_t& start_ts);
|
|
|
|
// read specified size content of the specified file
|
|
int range_read(const ObString& uri, const ObString& storage_info, char* buf, const int64_t buf_size,
|
|
const int64_t offset, int64_t& read_size);
|
|
|
|
// check file if exist or not
|
|
int check_file_exist(const ObString& uri, const ObString& storage_info, bool& file_exist);
|
|
|
|
// create empty file with specified uri
|
|
int create_file(const ObString& uri, const ObString& storage_info);
|
|
|
|
// get the max data file id with listing method
|
|
int get_max_data_file_when_index_not_exist(const ObString& prefix, const ObString& storage_info, uint64_t& file_id);
|
|
|
|
// get the max archived info from an index file
|
|
// archived info include max archived log id/submit_ts/checkpoint ts/epoch_id/acc_checksum
|
|
int get_max_archived_info_in_single_index_file(
|
|
const ObString& uri, const ObString& storage_info, MaxArchivedIndexInfo& info);
|
|
|
|
//
|
|
int get_first_log(const ObPGKey& pg_key, const uint64_t file_id, ObIArchiveLogFileStore* file_store, uint64_t& log_id,
|
|
clog::ObLogType& log_type);
|
|
|
|
int extract_first_log_in_data_file(const ObPGKey& pg_key, const uint64_t file_id, ObIArchiveLogFileStore* file_store,
|
|
ObArchiveBlockMeta& block_meta, clog::ObLogEntry& log_entry, ObLogArchiveInnerLog& inner_log);
|
|
|
|
int extract_last_log_in_data_file(const ObPGKey& pg_key, const uint64_t file_id, ObIArchiveLogFileStore* file_store,
|
|
const ObString& uri, const ObString& storage_info, ObArchiveBlockMeta& block_meta, clog::ObLogEntry& log_entry,
|
|
ObLogArchiveInnerLog& inner_log);
|
|
|
|
int get_max_index_info_in_single_file(
|
|
const ObString& uri, const ObString& storage_info, ObArchiveIndexFileInfo& info, bool& exist);
|
|
|
|
int get_max_safe_data_file_id(const ObString& uri, const ObString& storage_info, const uint64_t log_id,
|
|
const int64_t log_ts, const bool by_log_id, uint64_t& data_file_id);
|
|
|
|
private:
|
|
int extract_file_id_(const ObString& file_name, uint64_t& file_id, bool& match);
|
|
|
|
int locate_log_in_single_index_file_(const uint64_t log_id, char* data, const int64_t data_len, uint64_t& file_id,
|
|
bool& log_exist, ObArchiveIndexFileInfo& max_valid_index_info);
|
|
|
|
int read_max_archived_info_(char* buf, const int64_t buf_len, MaxArchivedIndexInfo& archive_info);
|
|
|
|
int extract_log_info_from_specific_block_(const ObPGKey& pg_key, const uint64_t file_id,
|
|
ObIArchiveLogFileStore* file_store, const int64_t offset, ObArchiveBlockMeta& block_meta,
|
|
clog::ObLogEntry& log_entry, ObLogArchiveInnerLog& inner_log);
|
|
};
|
|
|
|
} // namespace archive
|
|
} // namespace oceanbase
|
|
#endif /* OCEANBASE_ARCHIVE_OB_ARCHIVE_FILE_UTILS_H_ */
|