提交 cd2ffe63 编写于 作者: T Tyshawn 提交者: wangzelin.wzl

fix schedule fast gc sstable after stop server

上级 81b151f0
......@@ -509,7 +509,8 @@ void ObjectSet::reset()
if (!has_unfree) {
int64_t pos = snprintf(buf,
buf_len,
"label: %s, static_id: %d, static_info: %s, dynamic_info: %s",
"context: %p, label: %s, static_id: 0x%lx, static_info: %s, dynamic_info: %s",
mem_context_,
label,
mem_context_->get_static_id(),
common::to_cstring(mem_context_->get_static_info()),
......
......@@ -87,7 +87,7 @@ public:
{
return LABEL_CHECK == ct_;
}
int get_static_id() const
int64_t get_static_id() const
{
return static_id_;
}
......@@ -118,7 +118,8 @@ public:
char* end = (char*)memchr(cpy, '@', strlen(cpy));
if (end != nullptr) {
tmp_ct = CONTEXT_CHECK;
static_id_ = atoi(end + 1);
static_id_ = 0;
sscanf(end + 1, "0x%lx", &static_id_);
*end = '\0';
is_wildcard_ = 0 == STRCMP("*", cpy);
} else {
......@@ -278,7 +279,7 @@ private:
char label_[lib::AOBJECT_LABEL_SIZE + 1];
};
CheckType ct_;
int static_id_;
int64_t static_id_;
bool is_wildcard_;
int len_;
mod_alloc_info_t malloc_info_;
......
......@@ -32,10 +32,10 @@ __MemoryContext__& __MemoryContext__::root()
param.set_properties(ADD_CHILD_THREAD_SAFE | ALLOC_THREAD_SAFE)
.set_parallel(4)
.set_mem_attr(OB_SERVER_TENANT_ID, ObModIds::OB_ROOT_CONTEXT, ObCtxIds::DEFAULT_CTX_ID);
// ObMallocAllocator to design a non-destroy mode
const static int static_id =
StaticInfos::get_instance().add(__FILENAME__, __LINE__, __FUNCTION__);
__MemoryContext__ *tmp = new (std::nothrow) __MemoryContext__(false, DynamicInfo(), nullptr, param, static_id);
// root_context相对底层,被其他static对象依赖,而static对象之间析构顺序又是不确定的,
// So here is modeled on ObMallocAllocator to design a non-destroy mode
static StaticInfo static_info{__FILENAME__, __LINE__, __FUNCTION__};
__MemoryContext__ *tmp = new (std::nothrow) __MemoryContext__(false, DynamicInfo(), nullptr, param, &static_info);
abort_unless(tmp != nullptr);
int ret = tmp->init();
abort_unless(OB_SUCCESS == ret);
......
......@@ -35,25 +35,25 @@ namespace lib {
#define CURRENT_CONTEXT lib::Flow::current_ctx()
#define ROOT_CONTEXT lib::MemoryContext::root()
#define CREATE_CONTEXT(args...) CREATE_CONTEXT_(CONCAT(static_id, __COUNTER__), args)
#define CREATE_CONTEXT(args...) CREATE_CONTEXT_(CONCAT(static_info, __COUNTER__), args)
#define DESTROY_CONTEXT(context) lib::__MemoryContext__::destory_context(context)
#define WITH_CONTEXT(context) WITH_CONTEXT_P(true, context)
#define WITH_CONTEXT_P(condition, context) CONTEXT_P(condition, lib::ContextSource::WITH, context)
#define CREATE_WITH_TEMP_CONTEXT(...) CREATE_WITH_TEMP_CONTEXT_P(true, __VA_ARGS__)
#define CREATE_WITH_TEMP_CONTEXT_P(condition, args...) \
CREATE_WITH_TEMP_CONTEXT_P_(CONCAT(static_id, __COUNTER__), condition, args)
CREATE_WITH_TEMP_CONTEXT_P_(CONCAT(static_info, __COUNTER__), condition, args)
// The following are auxiliary macros
#define CREATE_CONTEXT_(static_id, context, args...) \
create_context(context, lib::DynamicInfo(), args, ({ \
const static int static_id = lib::StaticInfos::get_instance().add(__FILENAME__, __LINE__, __FUNCTION__); \
static_id; \
#define CREATE_CONTEXT_(static_info, context, args...) \
create_context(context, lib::DynamicInfo(), args, ({ \
static lib::StaticInfo static_info{__FILENAME__, __LINE__, __FUNCTION__}; \
&static_info; \
}))
#define CONTEXT_P(condition, context_source, ...) \
for (lib::_S<context_source> _s{condition, __VA_ARGS__}; OB_SUCC(ret) && _s.i_-- > 0; _s.i_--) \
if (OB_SUCC(_s.get_ret()))
#define CREATE_WITH_TEMP_CONTEXT_P_(static_id, condition, ...) \
const static int static_id = lib::StaticInfos::get_instance().add(__FILENAME__, __LINE__, __FUNCTION__); \
CONTEXT_P(condition, lib::ContextSource::CREATE, lib::DynamicInfo(), __VA_ARGS__, static_id)
#define CREATE_WITH_TEMP_CONTEXT_P_(static_info, condition, ...) \
static lib::StaticInfo static_info{__FILENAME__, __LINE__, __FUNCTION__}; \
CONTEXT_P(condition, lib::ContextSource::CREATE, lib::DynamicInfo(), __VA_ARGS__, &static_info)
using std::nullptr_t;
using lib::ObMemAttr;
......@@ -233,39 +233,6 @@ struct StaticInfo {
TO_STRING_KV(K(filename_), K(line_), K(function_));
};
class StaticInfos {
public:
StaticInfos() : cnt_(0)
{}
static StaticInfos& get_instance()
{
static StaticInfos one;
return one;
}
int get_cnt() const
{
return cnt_;
}
int add(const char* filename, const int line, const char* function)
{
int pos = ATOMIC_FAA(&cnt_, 1);
abort_unless(pos < MAX_NUM && nullptr == infos_[pos].filename_);
infos_[pos] = {filename, line, function};
const int static_id = pos;
OB_LOG(INFO, "add info", K(static_id), "info", infos_[static_id]);
return static_id;
}
const StaticInfo& get(const int static_id) const
{
return infos_[static_id];
}
private:
static const int MAX_NUM = 128;
StaticInfo infos_[MAX_NUM];
int cnt_;
};
struct DynamicInfo {
DynamicInfo()
: tid_(GETTID()), cid_(CO_IS_ENABLED() ? CO_ID() : 0lu), create_time_(common::ObTimeUtility::fast_current_time())
......@@ -315,30 +282,36 @@ public:
}
public:
__MemoryContext__(const bool need_free, const DynamicInfo &di, __MemoryContext__ *parent,
ContextParam &param, const int static_id)
: magic_code_(-1),
seq_id_(-1),
need_free_(need_free),
tree_node_(parent != nullptr ? &parent->tree_node_ : nullptr,
param.properties_ & ADD_CHILD_THREAD_SAFE),
di_(di),
param_(param),
properties_(param.properties_),
static_id_(static_id),
p_alloc_(nullptr),
p_arena_alloc_(nullptr),
p_safe_arena_alloc_(nullptr),
parallel_alloc_(nullptr),
freeable_alloc_(nullptr),
default_allocator_(nullptr)
{
}
int get_static_id() const { return static_id_; }
const DynamicInfo &get_dynamic_info() const { return di_; }
const StaticInfo &get_static_info() const { return StaticInfos::get_instance().get(static_id_); }
void *allocf(const int64_t size,
const ObMemAttr &attr=default_memattr)
__MemoryContext__(const bool need_free, const DynamicInfo &di, __MemoryContext__ *parent, ContextParam &param,
const StaticInfo *static_info)
: magic_code_(-1),
seq_id_(-1),
need_free_(need_free),
tree_node_(parent != nullptr ? &parent->tree_node_ : nullptr, param.properties_ & ADD_CHILD_THREAD_SAFE),
di_(di),
param_(param),
properties_(param.properties_),
static_id_(reinterpret_cast<int64_t>(static_info)),
p_alloc_(nullptr),
p_arena_alloc_(nullptr),
p_safe_arena_alloc_(nullptr),
parallel_alloc_(nullptr),
freeable_alloc_(nullptr),
default_allocator_(nullptr)
{}
int64_t get_static_id() const
{
return static_id_;
}
const DynamicInfo &get_dynamic_info() const
{
return di_;
}
const StaticInfo &get_static_info() const
{
return *reinterpret_cast<StaticInfo *>(static_id_);
}
void *allocf(const int64_t size, const ObMemAttr &attr = default_memattr)
{
return freeable_alloc_->alloc(size, attr);
}
......@@ -407,12 +380,13 @@ public:
return *default_allocator_;
}
static __MemoryContext__ &root();
bool check_magic_code() const { return MAGIC_CODE == magic_code_; }
TO_STRING_KV(KP(this),
"static_id", static_id_,
"static_info", StaticInfos::get_instance().get(static_id_),
"dynamic info", di_,
K(properties_), K(attr_));
bool check_magic_code() const
{
return MAGIC_CODE == magic_code_;
}
TO_STRING_KV(KP(this), "static_id", static_id_, "static_info", *reinterpret_cast<StaticInfo *>(static_id_),
"dynamic info", di_, K(properties_), K(attr_));
private:
static __MemoryContext__ *node2context(TreeNode *node)
{
......@@ -590,7 +564,7 @@ public:
DynamicInfo di_;
ContextParam param_;
int64_t properties_;
int static_id_;
int64_t static_id_;
common::ObMemAttr attr_;
// Delayed member
......
......@@ -180,7 +180,7 @@ void ObDumpTaskGenerator::dump_memory_leak()
pos += snprintf(buf + pos,
buf_len - pos,
"\n######## LEAK_CHECKER (origin_str = %s, label_ = %s, check_type = %d, "
"static_id_ = %d, current_ts = %ld)########\n",
"static_id_ = 0x%lx, current_ts = %ld)########\n",
get_mem_leak_checker().get_str(),
get_mem_leak_checker().get_label(),
get_mem_leak_checker().get_check_type(),
......
......@@ -116,6 +116,7 @@ void ObTableMgr::stop()
LOG_INFO("ObTableMgr::stop");
TG_STOP(lib::TGDefIDs::TableMgrGC);
TG_WAIT(lib::TGDefIDs::TableMgrGC);
is_gc_started_ = false;
LOG_INFO("timer stopped");
ObBucketWLockAllGuard guard(sstable_bucket_lock_);
enable_write_log_ = false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册