[liboblog] support storage work mode

This commit is contained in:
SanmuWangZJU
2022-03-25 18:10:38 +08:00
committed by LINxiansheng
parent 8b88f1f1bd
commit 463064375a
255 changed files with 964 additions and 462 deletions

View File

@ -81,7 +81,7 @@ elseif(OB_INCLUDE_UNITTEST)
add_subdirectory(unittest EXCLUDE_FROM_ALL) add_subdirectory(unittest EXCLUDE_FROM_ALL)
endif() endif()
if (OB_BUILD_TOOLS) if (OB_BUILD_TOOLS OR OB_BUILD_LIBOBLOG)
add_subdirectory(tools) add_subdirectory(tools)
elseif (OB_INCLUDE_TOOLS) elseif (OB_INCLUDE_TOOLS)
add_subdirectory(tools EXCLUDE_FROM_ALL) add_subdirectory(tools EXCLUDE_FROM_ALL)

View File

@ -60,7 +60,7 @@ install(FILES
COMPONENT server) COMPONENT server)
## oceanbase-devel ## oceanbase-devel
# liboblog.so and libob_sql_proxy_parser_static.a # libobcdc.so and libob_sql_proxy_parser_static.a
set(OCEANBASE_DEVEL_LIB_FILES "") set(OCEANBASE_DEVEL_LIB_FILES "")
set(OCEANBASE_DEVEL_INCLUDE_FILES deps/oblib/src/lib/ob_errno.h) set(OCEANBASE_DEVEL_INCLUDE_FILES deps/oblib/src/lib/ob_errno.h)
set(OCEANBASE_DEVEL_BIN_FILES "") set(OCEANBASE_DEVEL_BIN_FILES "")
@ -81,16 +81,16 @@ endif()
if (OB_BUILD_LIBOBLOG) if (OB_BUILD_LIBOBLOG)
# lib # lib
# list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/src/liboblog/src/liboblog.a) # list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/tools/libobcdc/src/libobcdc.a)
list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/src/liboblog/src/liboblog.so) list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/tools/obcdc/src/libobcdc.so)
list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/src/liboblog/src/liboblog.so.1) list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/tools/obcdc/src/libobcdc.so.1)
list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/src/liboblog/src/liboblog.so.1.0.0) list(APPEND OCEANBASE_DEVEL_LIB_FILES ${CMAKE_BINARY_DIR}/tools/obcdc/src/libobcdc.so.1.0.0)
# include lilboblog header # include lilboblog header
list(APPEND OCEANBASE_DEVEL_INCLUDE_FILES src/liboblog/src/liboblog.h) list(APPEND OCEANBASE_DEVEL_INCLUDE_FILES tools/obcdc/src/libobcdc.h)
# bin # bin
list(APPEND OCEANBASE_DEVEL_BIN_FILES ${CMAKE_BINARY_DIR}/src/liboblog/tests/oblog_tailf) list(APPEND OCEANBASE_DEVEL_BIN_FILES ${CMAKE_BINARY_DIR}/tools/obcdc/tests/obcdc_tailf)
endif() endif()
set(CPACK_RPM_DEVEL_DEFAULT_USER "root") set(CPACK_RPM_DEVEL_DEFAULT_USER "root")

View File

@ -21,3 +21,6 @@ obdevtools-cmake-3.20.2-15.el7.aarch64.rpm
obdevtools-flex-2.5.35-10.el7.aarch64.rpm obdevtools-flex-2.5.35-10.el7.aarch64.rpm
obdevtools-gcc-5.2.0-15.el7.aarch64.rpm obdevtools-gcc-5.2.0-15.el7.aarch64.rpm
obdevtools-llvm-11.0.1-40.el7.aarch64.rpm obdevtools-llvm-11.0.1-40.el7.aarch64.rpm
[tools-deps]
devdeps-rocksdb-6.22.1-15.el7.aarch64.rpm

View File

@ -21,3 +21,6 @@ obdevtools-cmake-3.20.2-3.el8.x86_64.rpm
obdevtools-flex-2.5.35-3.el8.x86_64.rpm obdevtools-flex-2.5.35-3.el8.x86_64.rpm
obdevtools-gcc-5.2.0-3.el8.x86_64.rpm obdevtools-gcc-5.2.0-3.el8.x86_64.rpm
obdevtools-llvm-11.0.1-40.el8.x86_64.rpm obdevtools-llvm-11.0.1-40.el8.x86_64.rpm
[tools-deps]
devdeps-rocksdb-6.22.1-15.el8.x86_64.rpm

View File

@ -54,7 +54,6 @@ add_subdirectory(archive)
add_subdirectory(election) add_subdirectory(election)
add_subdirectory(storage) add_subdirectory(storage)
add_subdirectory(observer) add_subdirectory(observer)
add_subdirectory(liboblog)
if (OB_ENABLE_SERVER_PCH) if (OB_ENABLE_SERVER_PCH)
target_precompile_headers(ob_base INTERFACE ${ob_server_pchs}) target_precompile_headers(ob_base INTERFACE ${ob_server_pchs})

View File

@ -1,115 +0,0 @@
/**
* 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_LIBOBLOG_OB_LOG_MOCK_STORE_SERVICE_H_
#define OCEANBASE_LIBOBLOG_OB_LOG_MOCK_STORE_SERVICE_H_
#include "ob_log_store_service.h"
namespace oceanbase
{
namespace liboblog
{
class MockObLogStoreService : public IObStoreService
{
public:
MockObLogStoreService() {}
void destroy() {}
~MockObLogStoreService() { destroy(); }
int init(const std::string &path) { UNUSED(path); return 0; }
int close() { return 0; }
public:
int put(const std::string &key, const ObSlice &value)
{
UNUSED(key);
UNUSED(value);
return 0;
}
int put(void *cf_handle, const std::string &key, const ObSlice &value)
{
UNUSED(key);
UNUSED(value);
UNUSED(cf_handle);
return 0;
}
int batch_write(void *cf_handle, const std::vector<std::string> &keys, const std::vector<ObSlice> &values)
{
UNUSED(cf_handle);
UNUSED(keys);
UNUSED(values);
return 0;
}
int get(const std::string &key, std::string &value)
{
UNUSED(key);
UNUSED(value);
return 0;
}
int get(void *cf_handle, const std::string &key, std::string &value)
{
UNUSED(cf_handle);
UNUSED(key);
UNUSED(value);
return 0;
}
int del(const std::string &key)
{
UNUSED(key);
return 0;
}
int del(void *cf_handle, const std::string &key)
{
UNUSED(cf_handle);
UNUSED(key);
return 0;
}
int create_column_family(const std::string& column_family_name,
void *&cf_handle)
{
UNUSED(column_family_name);
cf_handle = this;
return 0;
}
int drop_column_family(void *cf_handle)
{
UNUSED(cf_handle);
return 0;
}
int destory_column_family(void *cf_handle)
{
UNUSED(cf_handle);
return 0;
}
void get_mem_usage(const std::vector<uint64_t> ids,
const std::vector<void *> cf_handles)
{
UNUSED(ids);
UNUSED(cf_handles);
}
};
}
}
#endif

View File

@ -1,7 +0,0 @@
add_executable(oblog_tailf
main.cpp
oblog_main.h oblog_main.cpp
ob_binlog_record_printer.h ob_binlog_record_printer.cpp
)
target_link_libraries(oblog_tailf PRIVATE oblog)
target_include_directories(oblog_tailf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src)

View File

@ -1,2 +1,3 @@
add_subdirectory(obcdc)
add_subdirectory(ob_error) add_subdirectory(ob_error)
add_subdirectory(ob_admin) add_subdirectory(ob_admin)

View File

@ -1,18 +1,12 @@
add_library(oblog_base INTERFACE) add_library(obcdc_base INTERFACE)
target_include_directories(oblog_base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(obcdc_base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(oblog_base target_link_libraries(obcdc_base
INTERFACE ob_base oblogmsg_static INTERFACE ob_base oceanbase::oblogmsg_static easy oblib
) ${DEP_DIR}/lib64/librocksdb.a
add_library(oblog_miner INTERFACE)
target_include_directories(oblog_miner INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(oblog_miner
INTERFACE ob_base oblogmsg_static
) )
set(SRC_LIST set(SRC_LIST
liboblog.h liboblog.cpp libobcdc.h libobcdc.cpp
ob_concurrent_seq_queue.h ob_concurrent_seq_queue.cpp ob_concurrent_seq_queue.h ob_concurrent_seq_queue.cpp
ob_easy_hazard_map.h ob_easy_hazard_map.h
ob_log_adapt_string.h ob_log_adapt_string.cpp ob_log_adapt_string.h ob_log_adapt_string.cpp
@ -47,7 +41,6 @@ set(SRC_LIST
ob_log_row_data_index.h ob_log_row_data_index.cpp ob_log_row_data_index.h ob_log_row_data_index.cpp
ob_log_store_service.h ob_log_store_service.h
ob_log_store_service_stat.h ob_log_store_service_stat.cpp ob_log_store_service_stat.h ob_log_store_service_stat.cpp
ob_log_mock_store_service.h
ob_log_storager.h ob_log_storager.cpp ob_log_storager.h ob_log_storager.cpp
ob_log_reader_plug_in.h ob_log_reader_plug_in.cpp ob_log_reader_plug_in.h ob_log_reader_plug_in.cpp
ob_log_data_processor.h ob_log_data_processor.cpp ob_log_data_processor.h ob_log_data_processor.cpp
@ -112,53 +105,53 @@ set(SRC_LIST
ob_log_part_callback.h ob_log_part_callback.h
ob_log_ref_state.h ob_log_ref_state.cpp ob_log_ref_state.h ob_log_ref_state.cpp
ob_log_committer.h ob_log_committer.cpp ob_log_committer.h ob_log_committer.cpp
ob_log_rocksdb_store_service.h ob_log_rocksdb_store_service.cpp
) )
add_library(oblog_objects OBJECT ${SRC_LIST}) add_library(obcdc_objects OBJECT ${SRC_LIST})
target_link_libraries(oblog_objects PUBLIC oblog_base) target_link_libraries(obcdc_objects PUBLIC obcdc_base)
target_compile_definitions(oblog_objects PRIVATE ENABLE_DEBUG_LOG) target_compile_definitions(obcdc_objects PRIVATE ENABLE_DEBUG_LOG)
target_compile_options(oblog_objects PRIVATE -Werror) target_compile_options(obcdc_objects PRIVATE -Werror)
disable_pch(oblog_objects) disable_pch(obcdc_objects)
set(LGPL_DEPS "-L${DEP_DIR}/lib/mariadb -l:libmariadbclient.a -laio") set(LGPL_DEPS "-L${DEP_DIR}/lib/mariadb -l:libmariadbclient.a -laio")
if (OB_SO_CACHE) if (OB_SO_CACHE)
add_library(oblog SHARED IMPORTED GLOBAL) add_library(obcdc SHARED IMPORTED GLOBAL)
set_target_properties(oblog PROPERTIES set_target_properties(obcdc PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/liboblog.so" IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/libobcdc.so"
IMPORTED_LINK_INTERFACE_LIBRARIES oblog_miner) IMPORTED_LINK_INTERFACE_LIBRARIES obcdc_base)
else() else()
add_library(oblog SHARED ${CMAKE_BINARY_DIR}/src/observer/ob_version.cpp) add_library(obcdc SHARED ${CMAKE_BINARY_DIR}/src/observer/ob_version.cpp)
target_link_libraries(oblog target_link_libraries(obcdc
PUBLIC oblog_base oblib PUBLIC obcdc_base
PRIVATE PRIVATE
-Wl,--whole-archive -Wl,--whole-archive
$<TARGET_OBJECTS:oblog_objects> $<TARGET_OBJECTS:obcdc_objects>
-Wl,--no-whole-archive -Wl,--no-whole-archive
-Wl,--start-group -Wl,--start-group
oceanbase_static oceanbase_static
-Wl,--end-group -Wl,--end-group
-static-libgcc -static-libstdc++ PRIVATE -static-libgcc -static-libstdc++
-Wl,-Bsymbolic -Wl,-Bsymbolic
-Wl,-e,so_main -Wl,-e,so_main
${LGPL_DEPS} ${LGPL_DEPS}
easy
) )
add_dependencies(oblog oblog_objects) add_dependencies(obcdc obcdc_objects)
set_target_properties(oblog PROPERTIES SOVERSION 1 VERSION 1.0.0) set_target_properties(obcdc PROPERTIES SOVERSION 1 VERSION 1.0.0)
endif() endif()
add_library(oblog_objects_miner OBJECT ${SRC_LIST}) add_library(obcdc_objects_miner OBJECT ${SRC_LIST})
disable_pch(oblog_objects_miner) disable_pch(obcdc_objects_miner)
target_link_libraries(oblog_objects_miner PUBLIC oblog_miner) target_link_libraries(obcdc_objects_miner PUBLIC obcdc_base)
add_library(oblog_static add_library(obcdc_static
STATIC STATIC
${CMAKE_BINARY_DIR}/src/observer/ob_version.cpp) ${CMAKE_BINARY_DIR}/src/observer/ob_version.cpp)
target_link_libraries(oblog_static target_link_libraries(obcdc_static
PUBLIC oblog_objects_miner oblib PUBLIC obcdc_objects_miner
-Wl,--start-group -Wl,--start-group
oceanbase_static oceanbase_static
-Wl,--end-group -Wl,--end-group
PRIVATE -static-libgcc -static-libstdc++ PRIVATE -static-libgcc -static-libstdc++
${LGPL_DEPS} ${LGPL_DEPS}
) )
set_target_properties(oblog_static PROPERTIES OUTPUT_NAME "oblog") set_target_properties(obcdc_static PROPERTIES OUTPUT_NAME "obcdc")

View File

@ -10,7 +10,7 @@
* See the Mulan PubL v2 for more details. * See the Mulan PubL v2 for more details.
*/ */
#include "liboblog.h" #include "libobcdc.h"
#include <locale.h> #include <locale.h>
#include <curl/curl.h> #include <curl/curl.h>

View File

@ -205,7 +205,7 @@ int ObLogBR::init_data(const RecordType type,
LOG_ERROR("ILogRecord has not been created"); LOG_ERROR("ILogRecord has not been created");
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
} else if (OB_UNLIKELY(EUNKNOWN == type) } else if (OB_UNLIKELY(EUNKNOWN == type)
|| OB_UNLIKELY(! is_valid_cluster_id(cluster_id)) || OB_UNLIKELY(! is_valid_cluster_id_(cluster_id))
|| OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id) || OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)
|| OB_UNLIKELY(commit_version <= 0) || OB_UNLIKELY(commit_version <= 0)
|| OB_UNLIKELY(OB_INVALID_TIMESTAMP == ddl_schema_version)) { || OB_UNLIKELY(OB_INVALID_TIMESTAMP == ddl_schema_version)) {
@ -333,6 +333,14 @@ int ObLogBR::init_binlog_record_second_(const RecordType type,
return ret; return ret;
} }
bool ObLogBR::is_valid_cluster_id_(const uint64_t cluster_id) const
{
bool bool_ret = false;
bool_ret = is_valid_cluster_id(cluster_id)
|| (MIN_DRC_CLUSTER_ID <= cluster_id && MAX_DRC_CLUSTER_ID >= cluster_id);
return bool_ret;
}
int ObLogBR::put_old(ILogRecord *br, const bool is_changed) int ObLogBR::put_old(ILogRecord *br, const bool is_changed)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;

View File

@ -35,6 +35,8 @@ class ObLogBR : public ObLogResourceRecycleTask
public: public:
static const char *COLUMN_CHANGED_LABEL_PTR; static const char *COLUMN_CHANGED_LABEL_PTR;
static const char *COLUMN_UNCHANGED_LABEL_PTR; static const char *COLUMN_UNCHANGED_LABEL_PTR;
static const uint64_t MIN_DRC_CLUSTER_ID = 4294901760; // 0xffff0000
static const uint64_t MAX_DRC_CLUSTER_ID = 4294967295; // 0xffffffff
public: public:
ObLogBR(); ObLogBR();
@ -139,6 +141,10 @@ private:
const common::ObString &unique_id, const common::ObString &unique_id,
const int64_t commit_version, const int64_t commit_version,
const common::ObString *major_version_str = NULL); const common::ObString *major_version_str = NULL);
// ob defined cluster id: 0x00000001~0xfffeffff. [1, 4294901759]
// drc defined cluster id: 0xffff0000-0xffffffff, [4294901760~4294967295]
// liboblog valid cluster_id: [0x00000001~0xffffffff]
bool is_valid_cluster_id_(const uint64_t cluster_id) const;
private: private:
ILogRecord *data_; ///< real BinlogRecord ILogRecord *data_; ///< real BinlogRecord

View File

@ -68,4 +68,3 @@ private:
} // namespace liboblog } // namespace liboblog
} // namespace oceanbase } // namespace oceanbase
#endif /* OCEANBASE_LIBOBLOG_OB_LOG_BINLOG_RECORD_QUEUE_ */ #endif /* OCEANBASE_LIBOBLOG_OB_LOG_BINLOG_RECORD_QUEUE_ */

View File

@ -127,8 +127,11 @@ public:
"partition trans task pre-alloc count"); "partition trans task pre-alloc count");
DEF_INT(part_trans_task_active_count_upper_bound, OB_CLUSTER_PARAMETER, "200000", "[1,]", DEF_INT(part_trans_task_active_count_upper_bound, OB_CLUSTER_PARAMETER, "200000", "[1,]",
"active partition trans task count upper bound"); "active partition trans task count upper bound");
DEF_INT(log_entry_task_active_count_upper_bound, OB_CLUSTER_PARAMETER, "200000", "[1,]", DEF_INT(storager_task_count_upper_bound, OB_CLUSTER_PARAMETER, "1000", "[1,]",
"active log entry task count upper bound"); "storager task count upper bound");
DEF_INT(storager_mem_percentage, OB_CLUSTER_PARAMETER, "2", "[1,]",
"storager memory percentage");
T_DEF_BOOL(skip_recycle_data, OB_CLUSTER_PARAMETER, 0, "0:not_skip, 1:skip")
DEF_INT(part_trans_task_reusable_count_upper_bound, OB_CLUSTER_PARAMETER, "10240", "[1,]", DEF_INT(part_trans_task_reusable_count_upper_bound, OB_CLUSTER_PARAMETER, "10240", "[1,]",
"reusable partition trans task count upper bound"); "reusable partition trans task count upper bound");
DEF_INT(ready_to_seq_task_upper_bound, OB_CLUSTER_PARAMETER, "20000", "[1,]", DEF_INT(ready_to_seq_task_upper_bound, OB_CLUSTER_PARAMETER, "20000", "[1,]",
@ -230,7 +233,8 @@ public:
// liboblog support multiple working mode, default is storage // liboblog support multiple working mode, default is storage
// 1. storage: transaction data is stored, can support large transactions // 1. storage: transaction data is stored, can support large transactions
// 2. memory: transaction data is not stored, it means better performance, but may can not support large transactions // 2. memory: transaction data is not stored, it means better performance, but may can not support large transactions
DEF_STR(working_mode, OB_CLUSTER_PARAMETER, "memory", "liboblog working mode"); DEF_STR(working_mode, OB_CLUSTER_PARAMETER, "storage", "liboblog working mode");
T_DEF_INT_INFT(rocksdb_write_buffer_size, OB_CLUSTER_PARAMETER, 64, 16, "write buffer size[M]");
T_DEF_BOOL(fetcher_mock_mode, OB_CLUSTER_PARAMETER, 0, "0:disabled, 1:enabled"); T_DEF_BOOL(fetcher_mock_mode, OB_CLUSTER_PARAMETER, 0, "0:disabled, 1:enabled");
T_DEF_INT_INFT(io_thread_num, OB_CLUSTER_PARAMETER, 4, 1, "io thread number"); T_DEF_INT_INFT(io_thread_num, OB_CLUSTER_PARAMETER, 4, 1, "io thread number");
@ -313,6 +317,8 @@ public:
// Upper limit of progress difference between partitions, in seconds // Upper limit of progress difference between partitions, in seconds
T_DEF_INT_INFT(progress_limit_sec_for_dml, OB_CLUSTER_PARAMETER, 3, 1, "dml progress limit in seconds"); T_DEF_INT_INFT(progress_limit_sec_for_dml, OB_CLUSTER_PARAMETER, 3, 1, "dml progress limit in seconds");
T_DEF_INT_INFT(progress_limit_sec_for_ddl, OB_CLUSTER_PARAMETER, 3600, 1, "ddl progress limit in seconds");
// Partition timeout in seconds // Partition timeout in seconds
// If the logs are not fetched after a certain period of time, the stream will be cut // If the logs are not fetched after a certain period of time, the stream will be cut

View File

@ -38,6 +38,7 @@ int64_t FetchStream::g_stream_life_time = ObLogConfig::default_stream_life_time_
int64_t FetchStream::g_rpc_timeout = ObLogConfig::default_fetch_log_rpc_timeout_sec * _SEC_; int64_t FetchStream::g_rpc_timeout = ObLogConfig::default_fetch_log_rpc_timeout_sec * _SEC_;
int64_t FetchStream::g_fetch_log_cnt_per_part_per_round = ObLogConfig::default_fetch_log_cnt_per_part_per_round; int64_t FetchStream::g_fetch_log_cnt_per_part_per_round = ObLogConfig::default_fetch_log_cnt_per_part_per_round;
int64_t FetchStream::g_dml_progress_limit = ObLogConfig::default_progress_limit_sec_for_dml * _SEC_; int64_t FetchStream::g_dml_progress_limit = ObLogConfig::default_progress_limit_sec_for_dml * _SEC_;
int64_t FetchStream::g_ddl_progress_limit = ObLogConfig::default_progress_limit_sec_for_ddl * _SEC_;
int64_t FetchStream::g_blacklist_survival_time = ObLogConfig::default_blacklist_survival_time_sec * _SEC_; int64_t FetchStream::g_blacklist_survival_time = ObLogConfig::default_blacklist_survival_time_sec * _SEC_;
int64_t FetchStream::g_check_switch_server_interval = ObLogConfig::default_check_switch_server_interval_min * _MIN_; int64_t FetchStream::g_check_switch_server_interval = ObLogConfig::default_check_switch_server_interval_min * _MIN_;
bool FetchStream::g_print_rpc_handle_info = ObLogConfig::default_print_rpc_handle_info; bool FetchStream::g_print_rpc_handle_info = ObLogConfig::default_print_rpc_handle_info;
@ -231,6 +232,7 @@ void FetchStream::configure(const ObLogConfig & config)
int64_t fetch_log_rpc_timeout_sec = config.fetch_log_rpc_timeout_sec; int64_t fetch_log_rpc_timeout_sec = config.fetch_log_rpc_timeout_sec;
int64_t fetch_log_cnt_per_part_per_round = config.fetch_log_cnt_per_part_per_round; int64_t fetch_log_cnt_per_part_per_round = config.fetch_log_cnt_per_part_per_round;
int64_t dml_progress_limit_sec = config.progress_limit_sec_for_dml; int64_t dml_progress_limit_sec = config.progress_limit_sec_for_dml;
int64_t ddl_progress_limit_sec = config.progress_limit_sec_for_ddl;
int64_t blacklist_survival_time_sec = config.blacklist_survival_time_sec; int64_t blacklist_survival_time_sec = config.blacklist_survival_time_sec;
int64_t check_switch_server_interval_min = config.check_switch_server_interval_min; int64_t check_switch_server_interval_min = config.check_switch_server_interval_min;
bool print_rpc_handle_info = config.print_rpc_handle_info; bool print_rpc_handle_info = config.print_rpc_handle_info;
@ -246,6 +248,8 @@ void FetchStream::configure(const ObLogConfig & config)
LOG_INFO("[CONFIG]", K(fetch_log_cnt_per_part_per_round)); LOG_INFO("[CONFIG]", K(fetch_log_cnt_per_part_per_round));
ATOMIC_STORE(&g_dml_progress_limit, dml_progress_limit_sec * _SEC_); ATOMIC_STORE(&g_dml_progress_limit, dml_progress_limit_sec * _SEC_);
LOG_INFO("[CONFIG]", K(dml_progress_limit_sec)); LOG_INFO("[CONFIG]", K(dml_progress_limit_sec));
ATOMIC_STORE(&g_ddl_progress_limit, ddl_progress_limit_sec * _SEC_);
LOG_INFO("[CONFIG]", K(ddl_progress_limit_sec));
ATOMIC_STORE(&g_blacklist_survival_time, blacklist_survival_time_sec * _SEC_); ATOMIC_STORE(&g_blacklist_survival_time, blacklist_survival_time_sec * _SEC_);
LOG_INFO("[CONFIG]", K(blacklist_survival_time_sec)); LOG_INFO("[CONFIG]", K(blacklist_survival_time_sec));
ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_min * _MIN_); ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_min * _MIN_);
@ -543,7 +547,7 @@ int FetchStream::get_upper_limit(int64_t &upper_limit_us)
} else { } else {
// DDL partition is not limited by progress limit, here upper limit is set to a future value // DDL partition is not limited by progress limit, here upper limit is set to a future value
if (FETCH_STREAM_TYPE_DDL == stype_) { if (FETCH_STREAM_TYPE_DDL == stype_) {
upper_limit_us = min_progress + _YEAR_; upper_limit_us = min_progress + ATOMIC_LOAD(&g_ddl_progress_limit);
} else { } else {
// Other partition are limited by progress limit // Other partition are limited by progress limit
upper_limit_us = min_progress + ATOMIC_LOAD(&g_dml_progress_limit); upper_limit_us = min_progress + ATOMIC_LOAD(&g_dml_progress_limit);

View File

@ -70,6 +70,7 @@ public:
static int64_t g_rpc_timeout; static int64_t g_rpc_timeout;
static int64_t g_fetch_log_cnt_per_part_per_round; static int64_t g_fetch_log_cnt_per_part_per_round;
static int64_t g_dml_progress_limit; static int64_t g_dml_progress_limit;
static int64_t g_ddl_progress_limit;
// Survival time of server added to blacklist // Survival time of server added to blacklist
static int64_t g_blacklist_survival_time; static int64_t g_blacklist_survival_time;
static int64_t g_check_switch_server_interval; static int64_t g_check_switch_server_interval;

View File

@ -519,4 +519,3 @@ void ObLogFetcherHeartbeatWorker::WorkerData::destroy()
} }
} }

View File

@ -50,7 +50,7 @@
#include "ob_log_ddl_handler.h" // ObLogDDLHandler #include "ob_log_ddl_handler.h" // ObLogDDLHandler
#include "ob_log_start_schema_matcher.h" // ObLogStartSchemaMatcher #include "ob_log_start_schema_matcher.h" // ObLogStartSchemaMatcher
#include "ob_log_tenant_mgr.h" // IObLogTenantMgr #include "ob_log_tenant_mgr.h" // IObLogTenantMgr
#include "ob_log_mock_store_service.h" // MockObLogStoreService #include "ob_log_rocksdb_store_service.h" // RocksDbStoreService
#include "ob_log_trace_id.h" #include "ob_log_trace_id.h"
@ -398,12 +398,12 @@ int ObLogInstance::init_logger_()
} }
} }
_LOG_INFO("====================liboblog start===================="); _LOG_INFO("====================libobcdc start====================");
_LOG_INFO("liboblog CE %s %s", PACKAGE_VERSION, RELEASEID); _LOG_INFO("libobcdc CE %s %s", PACKAGE_VERSION, RELEASEID);
_LOG_INFO("BUILD_VERSION: %s", build_version()); _LOG_INFO("BUILD_VERSION: %s", build_version());
_LOG_INFO("BUILD_TIME: %s %s", build_date(), build_time()); _LOG_INFO("BUILD_TIME: %s %s", build_date(), build_time());
_LOG_INFO("BUILD_FLAGS: %s", build_flags()); _LOG_INFO("BUILD_FLAGS: %s", build_flags());
_LOG_INFO("Copyright (c) 2021 Ant Group Co., Ltd."); _LOG_INFO("Copyright (c) 2022 Ant Group Co., Ltd.");
_LOG_INFO("======================================================"); _LOG_INFO("======================================================");
_LOG_INFO("\n"); _LOG_INFO("\n");
} }
@ -415,11 +415,11 @@ int ObLogInstance::init_logger_()
void ObLogInstance::print_version() void ObLogInstance::print_version()
{ {
MPRINT("liboblog CE %s %s", PACKAGE_VERSION, RELEASEID); MPRINT("libobcdc CE %s %s", PACKAGE_VERSION, RELEASEID);
MPRINT("REVISION: %s", build_version()); MPRINT("REVISION: %s", build_version());
MPRINT("BUILD_TIME: %s %s", build_date(), build_time()); MPRINT("BUILD_TIME: %s %s", build_date(), build_time());
MPRINT("BUILD_FLAGS: %s\n", build_flags()); MPRINT("BUILD_FLAGS: %s\n", build_flags());
MPRINT("Copyright (c) 2021 Ant Group Co., Ltd."); MPRINT("Copyright (c) 2022 Ant Group Co., Ltd.");
MPRINT(); MPRINT();
} }
@ -790,7 +790,7 @@ int ObLogInstance::init_components_(const uint64_t start_tstamp_usec)
INIT(log_entry_task_pool_, ObLogEntryTaskPool, TCONF.log_entry_task_prealloc_count); INIT(log_entry_task_pool_, ObLogEntryTaskPool, TCONF.log_entry_task_prealloc_count);
INIT(store_service_, MockObLogStoreService, store_service_path); INIT(store_service_, RocksDbStoreService, store_service_path);
INIT(br_pool_, ObLogBRPool, TCONF.binlog_record_prealloc_count); INIT(br_pool_, ObLogBRPool, TCONF.binlog_record_prealloc_count);
@ -1038,7 +1038,7 @@ void ObLogInstance::destroy_components_()
DESTROY(br_pool_, ObLogBRPool); DESTROY(br_pool_, ObLogBRPool);
DESTROY(storager_, ObLogStorager); DESTROY(storager_, ObLogStorager);
DESTROY(data_processor_, ObLogDataProcessor); DESTROY(data_processor_, ObLogDataProcessor);
DESTROY(store_service_, MockObLogStoreService); DESTROY(store_service_, RocksDbStoreService);
LOG_INFO("destroy all components end"); LOG_INFO("destroy all components end");
} }
@ -2015,8 +2015,10 @@ void ObLogInstance::global_flow_control_()
TCONF.part_trans_task_reusable_count_upper_bound; TCONF.part_trans_task_reusable_count_upper_bound;
int64_t ready_to_seq_task_upper_bound = int64_t ready_to_seq_task_upper_bound =
TCONF.ready_to_seq_task_upper_bound; TCONF.ready_to_seq_task_upper_bound;
int64_t log_entry_task_active_count_upper_bound = int64_t storager_task_count_upper_bound =
TCONF.log_entry_task_active_count_upper_bound; TCONF.storager_task_count_upper_bound;
int64_t storager_mem_percentage =
TCONF.storager_mem_percentage;
double system_memory_avail_percentage_lower_bound = double system_memory_avail_percentage_lower_bound =
static_cast<double>(TCONF.system_memory_avail_percentage_lower_bound) / 100; static_cast<double>(TCONF.system_memory_avail_percentage_lower_bound) / 100;
int64_t memory_limit = TCONF.memory_limit.get(); int64_t memory_limit = TCONF.memory_limit.get();
@ -2052,6 +2054,9 @@ void ObLogInstance::global_flow_control_()
} else if (OB_FAIL(dml_parser_->get_log_entry_task_count(dml_parser_part_trans_task_count))) { } else if (OB_FAIL(dml_parser_->get_log_entry_task_count(dml_parser_part_trans_task_count))) {
LOG_ERROR("DML parser get_log_entry_task_count fail", KR(ret), K(dml_parser_part_trans_task_count)); LOG_ERROR("DML parser get_log_entry_task_count fail", KR(ret), K(dml_parser_part_trans_task_count));
} else { } else {
int64_t storager_task_count = 0;
storager_->get_task_count(storager_task_count);
// Use the following policy for global traffic control: // Use the following policy for global traffic control:
// need_slow_down = (active partitioned transaction tasks exceed the upper limit || liboblog takes up more memory than the upper limit || system free memory is less than a certain percentage) // need_slow_down = (active partitioned transaction tasks exceed the upper limit || liboblog takes up more memory than the upper limit || system free memory is less than a certain percentage)
// && (reusable transaction tasks exceeds limit || Parser and Sequencer module cache tasks exceeds limit) // && (reusable transaction tasks exceeds limit || Parser and Sequencer module cache tasks exceeds limit)
@ -2060,7 +2065,7 @@ void ObLogInstance::global_flow_control_()
|| (system_memory_avail < system_memory_avail_lower_bound); || (system_memory_avail < system_memory_avail_lower_bound);
bool condition2 = (reusable_part_trans_task_count >= part_trans_task_reusable_count_upper_bound) bool condition2 = (reusable_part_trans_task_count >= part_trans_task_reusable_count_upper_bound)
|| (ready_to_seq_task_count > ready_to_seq_task_upper_bound); || (ready_to_seq_task_count > ready_to_seq_task_upper_bound);
bool condition3 = (active_log_entry_task_count >= log_entry_task_active_count_upper_bound); bool condition3 = (storager_task_count > storager_task_count_upper_bound) && (memory_hold >= storager_mem_percentage * memory_limit);
need_slow_down_fetcher = (condition1 && condition2) || (condition3); need_slow_down_fetcher = (condition1 && condition2) || (condition3);
@ -2081,7 +2086,8 @@ void ObLogInstance::global_flow_control_()
"AVAIL_MEM=%s/%s " "AVAIL_MEM=%s/%s "
"READY_TO_SEQ=%ld/%ld " "READY_TO_SEQ=%ld/%ld "
"PART_TRANS(TOTAL=%ld,ACTIVE=%ld/%ld,REUSABLE=%ld/%ld) " "PART_TRANS(TOTAL=%ld,ACTIVE=%ld/%ld,REUSABLE=%ld/%ld) "
"LOG_TASK(ACTIVE=%ld/%ld) " "LOG_TASK(ACTIVE=%ld) "
"STORE(%ld/%ld) "
"[FETCHER=%ld DML_PARSER=%ld " "[FETCHER=%ld DML_PARSER=%ld "
"COMMITER=%ld USER_QUEUE=%ld OUT=%ld RC=%ld] " "COMMITER=%ld USER_QUEUE=%ld OUT=%ld RC=%ld] "
"DIST_TRANS(SEQ=%ld,COMMITTED=%ld)", "DIST_TRANS(SEQ=%ld,COMMITTED=%ld)",
@ -2092,7 +2098,8 @@ void ObLogInstance::global_flow_control_()
total_part_trans_task_count, total_part_trans_task_count,
active_part_trans_task_count, part_trans_task_active_count_upper_bound, active_part_trans_task_count, part_trans_task_active_count_upper_bound,
reusable_part_trans_task_count, part_trans_task_reusable_count_upper_bound, reusable_part_trans_task_count, part_trans_task_reusable_count_upper_bound,
active_log_entry_task_count, log_entry_task_active_count_upper_bound, active_log_entry_task_count,
storager_task_count, storager_task_count_upper_bound,
fetcher_part_trans_task_count, dml_parser_part_trans_task_count, fetcher_part_trans_task_count, dml_parser_part_trans_task_count,
committer_ddl_part_trans_task_count + committer_dml_part_trans_task_count, committer_ddl_part_trans_task_count + committer_dml_part_trans_task_count,
br_queue_part_trans_task_count, out_part_trans_task_count, br_queue_part_trans_task_count, out_part_trans_task_count,
@ -2546,7 +2553,7 @@ int ObLogInstance::check_observer_version_valid_()
uint32_t ob_major = 0; uint32_t ob_major = 0;
uint16_t ob_minor = 0; uint16_t ob_minor = 0;
uint16_t ob_patch = 0; uint16_t ob_patch = 0;
cal_version_components_(ob_version, ob_major, ob_minor, ob_patch); cal_version_components(ob_version, ob_major, ob_minor, ob_patch);
if (0 != TCONF.skip_ob_version_compat_check) { if (0 != TCONF.skip_ob_version_compat_check) {
_LOG_INFO("skip_ob_version_compat_check is true, skip check, observer_version(%u.%hu.%hu)", _LOG_INFO("skip_ob_version_compat_check is true, skip check, observer_version(%u.%hu.%hu)",
ob_major, ob_minor, ob_patch); ob_major, ob_minor, ob_patch);
@ -2597,7 +2604,7 @@ int ObLogInstance::init_oblog_version_components_()
if (OB_FAIL(ObClusterVersion::get_version(PACKAGE_VERSION, oblog_version))) { if (OB_FAIL(ObClusterVersion::get_version(PACKAGE_VERSION, oblog_version))) {
LOG_ERROR("get_version fail", KR(ret), K(PACKAGE_VERSION), K(oblog_version)); LOG_ERROR("get_version fail", KR(ret), K(PACKAGE_VERSION), K(oblog_version));
} else { } else {
cal_version_components_(oblog_version, oblog_major_, oblog_minor_, oblog_patch_); cal_version_components(oblog_version, oblog_major_, oblog_minor_, oblog_patch_);
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
@ -2607,16 +2614,6 @@ int ObLogInstance::init_oblog_version_components_()
return ret; return ret;
} }
void ObLogInstance::cal_version_components_(const uint64_t version,
uint32_t &major,
uint16_t &minor,
uint16_t &patch)
{
major = OB_VSN_MAJOR(version);
minor = OB_VSN_MINOR(version);
patch = OB_VSN_PATCH(version);
}
int ObLogInstance::get_tenant_guard(const uint64_t tenant_id, ObLogTenantGuard &guard) int ObLogInstance::get_tenant_guard(const uint64_t tenant_id, ObLogTenantGuard &guard)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;

View File

@ -13,7 +13,7 @@
#ifndef OCEANBASE_LIBOBLOG_INSTANCE_H__ #ifndef OCEANBASE_LIBOBLOG_INSTANCE_H__
#define OCEANBASE_LIBOBLOG_INSTANCE_H__ #define OCEANBASE_LIBOBLOG_INSTANCE_H__
#include "liboblog.h" #include "libobcdc.h"
#include "lib/allocator/ob_concurrent_fifo_allocator.h" // ObConcurrentFIFOAllocator #include "lib/allocator/ob_concurrent_fifo_allocator.h" // ObConcurrentFIFOAllocator
#include "lib/alloc/memory_dump.h" // memory_meta_dump #include "lib/alloc/memory_dump.h" // memory_meta_dump
@ -248,7 +248,6 @@ private:
int check_observer_version_valid_(); int check_observer_version_valid_();
int init_ob_cluster_version_(); int init_ob_cluster_version_();
int init_oblog_version_components_(); int init_oblog_version_components_();
void cal_version_components_(const uint64_t version, uint32_t &major, uint16_t &minor, uint16_t &patch);
int query_cluster_min_observer_version_(uint64_t &min_observer_version); int query_cluster_min_observer_version_(uint64_t &min_observer_version);
// Initialize global variables for compatibility with GCTX dependencies // Initialize global variables for compatibility with GCTX dependencies
void init_global_context_(); void init_global_context_();

View File

@ -25,10 +25,10 @@ int so_main()
{ {
fprintf(stdout, "\n"); fprintf(stdout, "\n");
fprintf(stdout, "liboblog (%s %s)\n", PACKAGE_STRING, RELEASEID); fprintf(stdout, "libobcdc (%s %s)\n", PACKAGE_STRING, RELEASEID);
fprintf(stdout, "\n"); fprintf(stdout, "\n");
fprintf(stdout, "BUILD_VERSION: %s\n", build_version()); fprintf(stdout, "BUILD_VERSION: %s\n", build_version());
fprintf(stdout, "BUILD_TIME: %s %s\n", build_date(), build_time()); fprintf(stdout, "BUILD_TIME: %s %s\n", build_date(), build_time());
fprintf(stdout, "BUILD_FLAGS: %s\n", build_flags()); fprintf(stdout, "BUILD_FLAGS: %s\n", build_flags());
exit(0); exit(0);

View File

@ -3449,7 +3449,7 @@ int ObLogPartMgr::add_partition_(const ObPartitionKey& pkey,
return ret; return ret;
} }
// ensure_recycled_when_offlined: Whether recycling is guaranteed to be successful in the event of going offline, // ensure_recycled_when_offlined: Whether recycling is guaranteed to be successful in the event of going offline,
// i.e. whether the number of transactions left behind is 0 // i.e. whether the number of transactions left behind is 0
int ObLogPartMgr::offline_partition_(const ObPartitionKey &pkey, int ObLogPartMgr::offline_partition_(const ObPartitionKey &pkey,
const bool ensure_recycled_when_offlined) const bool ensure_recycled_when_offlined)

View File

@ -349,16 +349,16 @@ int ObLogPartTransParser::handle_ddl_part_rollback_savepoint_(const uint64_t row
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const int32_t flag = row.flag_; const int32_t flag = row.flag_;
const int32_t sql_no = row.sql_no_; const int32_t rollback_to_seq = get_row_seq_(task, row);
if (OB_UNLIKELY(! task.is_ddl_trans())) { if (OB_UNLIKELY(! task.is_ddl_trans())) {
LOG_ERROR("task is not ddl trans, unexcepted", K(row_index), K(task), K(row)); LOG_ERROR("task is not ddl trans, unexcepted", K(row_index), K(task), K(row));
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
} else if (OB_UNLIKELY(1 != flag) || OB_UNLIKELY(sql_no < 0) || OB_UNLIKELY(OB_INVALID_ID == row_index)) { } else if (OB_UNLIKELY(1 != flag) || OB_UNLIKELY(rollback_to_seq < 0) || OB_UNLIKELY(OB_INVALID_ID == row_index)) {
LOG_ERROR("invalid argument", K(flag), K(sql_no), K(row_index), K(row)); LOG_ERROR("invalid argument", K(flag), K(rollback_to_seq), K(row_index), K(row));
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
} else if (OB_FAIL(task.revert_by_rollback_savepoint(row_index, sql_no))) { } else if (OB_FAIL(task.revert_by_rollback_savepoint(row_index, rollback_to_seq))) {
LOG_ERROR("task revert_stmt_by_rollback_savepoint failed", KR(ret), K(sql_no), K(task)); LOG_ERROR("task revert_stmt_by_rollback_savepoint failed", KR(ret), K(rollback_to_seq), K(task));
} else { } else {
// succ // succ
LOG_DEBUG("handle rollback savepoint succ", K(row), K(task)); LOG_DEBUG("handle rollback savepoint succ", K(row), K(task));
@ -609,7 +609,7 @@ int ObLogPartTransParser::parse_dml_stmts_(const uint64_t row_index,
const char *participant_key_str = task.get_participant_key_str(); const char *participant_key_str = task.get_participant_key_str();
const uint64_t log_id = redo_log_entry_task.get_log_id(); const uint64_t log_id = redo_log_entry_task.get_log_id();
const int32_t log_offset = redo_log_entry_task.get_log_offset(); const int32_t log_offset = redo_log_entry_task.get_log_offset();
const int32_t row_sql_no = row.sql_no_; const int32_t row_seq_no = get_row_seq_(task, row);
if (OB_ISNULL(stmt_task) || OB_ISNULL(row_data_index)) { if (OB_ISNULL(stmt_task) || OB_ISNULL(row_data_index)) {
LOG_ERROR("allocate memory for DmlStmtTask or ObLogRowDataIndex fail", "Dmlsize", sizeof(DmlStmtTask), LOG_ERROR("allocate memory for DmlStmtTask or ObLogRowDataIndex fail", "Dmlsize", sizeof(DmlStmtTask),
@ -618,9 +618,9 @@ int ObLogPartTransParser::parse_dml_stmts_(const uint64_t row_index,
} else { } else {
new (row_data_index) ObLogRowDataIndex(); new (row_data_index) ObLogRowDataIndex();
if (OB_FAIL(row_data_index->init(tenant_id, participant_key_str, log_id, log_offset, row_index, is_rollback, row_sql_no))) { if (OB_FAIL(row_data_index->init(tenant_id, participant_key_str, log_id, log_offset, row_index, is_rollback, row_seq_no))) {
LOG_ERROR("row_data_index init fail", KR(ret), K(tenant_id), K(row_data_index), LOG_ERROR("row_data_index init fail", KR(ret), K(tenant_id), K(row_data_index),
K(participant_key_str), K(log_id), K(log_offset), K(row_index), K(is_rollback), K(row_sql_no), K(participant_key_str), K(log_id), K(log_offset), K(row_index), K(is_rollback), K(row_seq_no),
K(task), K(redo_log_entry_task)); K(task), K(redo_log_entry_task));
} else { } else {
new (stmt_task) DmlStmtTask(task, redo_log_entry_task, *row_data_index, row); new (stmt_task) DmlStmtTask(task, redo_log_entry_task, *row_data_index, row);
@ -654,5 +654,13 @@ int ObLogPartTransParser::parse_dml_stmts_(const uint64_t row_index,
return ret; return ret;
} }
int64_t ObLogPartTransParser::get_row_seq_(PartTransTask &task, MutatorRow &row) const
{
// only has sql_no
UNUSED(task);
return row.sql_no_;
}
} }
} }

View File

@ -98,6 +98,7 @@ private:
ObLogEntryTask &redo_log_entry_task, ObLogEntryTask &redo_log_entry_task,
PartTransTask &part_trans_task, PartTransTask &part_trans_task,
const bool is_rollback = false); const bool is_rollback = false);
int64_t get_row_seq_(PartTransTask &task, MutatorRow &row) const;
private: private:
bool inited_; bool inited_;

Some files were not shown because too many files have changed in this diff Show More