slog writer task use dynamic memory alloc

This commit is contained in:
nroskill
2021-11-03 20:37:46 +08:00
committed by LINxiansheng
parent 619e5e3d06
commit 2e4c947fd7
2 changed files with 42 additions and 38 deletions

View File

@ -104,8 +104,7 @@ int ObMsInfoTask::update_curr_member_list(const common::ObMemberList& curr_membe
return ret; return ret;
} }
ObSlogWriterQueueThread::ObSlogWriterQueueThread() ObSlogWriterQueueThread::ObSlogWriterQueueThread() : inited_(false), partition_service_(NULL), free_queue_(), tg_id_(-1)
: inited_(false), partition_service_(NULL), free_queue_(), tasks_(NULL), tg_id_(-1)
{} {}
ObSlogWriterQueueThread::~ObSlogWriterQueueThread() ObSlogWriterQueueThread::~ObSlogWriterQueueThread()
@ -115,49 +114,34 @@ ObSlogWriterQueueThread::~ObSlogWriterQueueThread()
void ObSlogWriterQueueThread::destroy() void ObSlogWriterQueueThread::destroy()
{ {
int ret = OB_SUCCESS;
inited_ = false; inited_ = false;
partition_service_ = NULL; partition_service_ = NULL;
if (NULL != tasks_) { ObMsInfoTask *task = nullptr;
ob_free(tasks_); while (OB_SUCC(free_queue_.pop((ObLink *&)task))) {
if (OB_NOT_NULL(task)) {
ob_free(task);
}
} }
tasks_ = NULL;
STORAGE_LOG(INFO, "ObSlogWriterQueueThread destroy"); STORAGE_LOG(INFO, "ObSlogWriterQueueThread destroy");
} }
int ObSlogWriterQueueThread::init(ObPartitionService* partition_service, int tg_id) int ObSlogWriterQueueThread::init(ObPartitionService* partition_service, int tg_id)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const int64_t max_task_num = OB_MAX_PARTITION_NUM_PER_SERVER * 2;
tg_id_ = tg_id; tg_id_ = tg_id;
if (inited_) { if (inited_) {
ret = OB_INIT_TWICE; ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObSlogWriterQueueThread has already been inited", K(ret)); STORAGE_LOG(WARN, "ObSlogWriterQueueThread has already been inited", K(ret));
} else if (NULL == partition_service) { } else if (OB_ISNULL(partition_service)) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "invalid argument", K(ret), KP(partition_service)); STORAGE_LOG(WARN, "invalid argument", K(ret), KP(partition_service));
} else if (OB_FAIL(TG_SET_HANDLER_AND_START(tg_id_, *this))) { } else if (OB_FAIL(TG_SET_HANDLER_AND_START(tg_id_, *this))) {
STORAGE_LOG(WARN, "ObSimpleThreadPool inited error.", K(ret)); STORAGE_LOG(WARN, "ObSimpleThreadPool inited error.", K(ret));
} else if (OB_SUCCESS != (ret = free_queue_.init(max_task_num))) {
STORAGE_LOG(WARN, "initialize fixed queue of tasks failed", K(ret));
} else { } else {
int64_t size = sizeof(ObMsInfoTask) * max_task_num; partition_service_ = partition_service;
ObMemAttr attr(common::OB_SERVER_TENANT_ID, ObModIds::OB_CALLBACK_TASK); inited_ = true;
if (NULL == (tasks_ = (ObMsInfoTask*)ob_malloc(size, attr))) { STORAGE_LOG(INFO, "ObSlogWriterQueueThread init success", K_(tg_id));
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(ERROR, "no memory", K(ret), K(size));
} else {
for (int64_t i = max_task_num - 1; OB_SUCC(ret) && i >= 0; --i) {
(void)new (tasks_ + i) ObMsInfoTask;
if (OB_SUCCESS != (ret = free_queue_.push(&tasks_[i]))) {
STORAGE_LOG(WARN, "push free task failed", K(ret));
}
}
if (OB_SUCC(ret)) {
partition_service_ = partition_service;
inited_ = true;
STORAGE_LOG(INFO, "ObSlogWriterQueueThread init success", K_(tg_id));
}
}
} }
if (OB_SUCCESS != ret && !inited_) { if (OB_SUCCESS != ret && !inited_) {
destroy(); destroy();
@ -171,9 +155,25 @@ int ObSlogWriterQueueThread::get_task(ObMsInfoTask*& task)
if (!inited_) { if (!inited_) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "ObSlogWriterQueueThread not init", K(ret)); STORAGE_LOG(WARN, "ObSlogWriterQueueThread not init", K(ret));
} else if (OB_SUCCESS != (ret = free_queue_.pop(task))) { } else if (OB_SUCC(free_queue_.pop((ObLink *&)task))) {
STORAGE_LOG(WARN, "pop free task failed", K(ret)); // do nothing
} else if (OB_SUCC(alloc_task(task))) {
// do nothing
} else { } else {
STORAGE_LOG(ERROR, "get task failed");
}
return ret;
}
int ObSlogWriterQueueThread::alloc_task(ObMsInfoTask *&task)
{
const ObMemAttr attr(common::OB_SERVER_TENANT_ID, ObModIds::OB_CALLBACK_TASK);
int ret = OB_SUCCESS;
if (OB_ISNULL(task = (ObMsInfoTask *)ob_malloc(sizeof(ObMsInfoTask), attr))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(WARN, "alloc task failed");
} else {
task = new (task) ObMsInfoTask;
} }
return ret; return ret;
} }
@ -184,11 +184,14 @@ void ObSlogWriterQueueThread::free_task(ObMsInfoTask* task)
if (!inited_) { if (!inited_) {
tmp_ret = OB_NOT_INIT; tmp_ret = OB_NOT_INIT;
STORAGE_LOG(ERROR, "ObSlogWriterQueueThread not init", K(tmp_ret)); STORAGE_LOG(ERROR, "ObSlogWriterQueueThread not init", K(tmp_ret));
} else if (NULL == task) { } else if (OB_ISNULL(task)) {
tmp_ret = OB_INVALID_ARGUMENT; tmp_ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(ERROR, "ObSlogWriterQueueThread invalid argument", K(tmp_ret), K(task)); STORAGE_LOG(ERROR, "ObSlogWriterQueueThread invalid argument", K(tmp_ret), K(task));
} else if (OB_SUCCESS != (tmp_ret = free_queue_.push(task))) { } else if (free_queue_.size() >= MAX_FREE_TASK_NUM) {
STORAGE_LOG(ERROR, "push free task failed", K(tmp_ret)); ob_free(task);
} else if (OB_UNLIKELY(OB_SUCCESS != (tmp_ret = free_queue_.push(task)))) {
STORAGE_LOG(WARN, "push free task failed", K(tmp_ret));
ob_free(task);
} }
} }
@ -202,9 +205,9 @@ int ObSlogWriterQueueThread::push(const ObMsInfoTask* task)
} else if (!task->is_valid()) { } else if (!task->is_valid()) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "invalid argument", K(ret), K(*task)); STORAGE_LOG(WARN, "invalid argument", K(ret), K(*task));
} else if (OB_SUCCESS != (ret = get_task(saved_task))) { } else if (OB_FAIL(get_task(saved_task))) {
STORAGE_LOG(WARN, "get free task failed", K(ret)); STORAGE_LOG(WARN, "get free task failed", K(ret));
} else if (NULL == saved_task) { } else if (OB_ISNULL(saved_task)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "Unexpected error, saved_task shouldn't be null", K(ret)); STORAGE_LOG(WARN, "Unexpected error, saved_task shouldn't be null", K(ret));
} else { } else {

View File

@ -15,7 +15,7 @@
#include "common/ob_partition_key.h" #include "common/ob_partition_key.h"
#include "common/ob_member_list.h" #include "common/ob_member_list.h"
#include "lib/queue/ob_fixed_queue.h" #include "lib/queue/ob_link_queue.h"
#include "lib/thread/thread_mgr_interface.h" #include "lib/thread/thread_mgr_interface.h"
#include "share/ob_proposal_id.h" #include "share/ob_proposal_id.h"
#include "clog/ob_log_define.h" #include "clog/ob_log_define.h"
@ -24,7 +24,7 @@ namespace oceanbase {
namespace storage { namespace storage {
class ObPartitionService; class ObPartitionService;
class ObMsInfoTask { class ObMsInfoTask : public common::ObLink {
public: public:
ObMsInfoTask() ObMsInfoTask()
: pkey_(), : pkey_(),
@ -141,6 +141,7 @@ class ObSlogWriterQueueThread : public lib::TGTaskHandler {
public: public:
static const int64_t QUEUE_THREAD_NUM = 4; static const int64_t QUEUE_THREAD_NUM = 4;
static const int64_t MINI_MODE_QUEUE_THREAD_NUM = 2; static const int64_t MINI_MODE_QUEUE_THREAD_NUM = 2;
static const int64_t MAX_FREE_TASK_NUM = 1024;
static const int64_t SLOG_FLUSH_TASK_TIMEOUT_THRESHOLD = clog::CLOG_LEADER_RECONFIRM_SYNC_TIMEOUT; static const int64_t SLOG_FLUSH_TASK_TIMEOUT_THRESHOLD = clog::CLOG_LEADER_RECONFIRM_SYNC_TIMEOUT;
ObSlogWriterQueueThread(); ObSlogWriterQueueThread();
virtual ~ObSlogWriterQueueThread(); virtual ~ObSlogWriterQueueThread();
@ -157,13 +158,13 @@ public:
private: private:
int get_task(ObMsInfoTask*& task); int get_task(ObMsInfoTask*& task);
int alloc_task(ObMsInfoTask*& task);
void free_task(ObMsInfoTask* task); void free_task(ObMsInfoTask* task);
private: private:
bool inited_; bool inited_;
ObPartitionService* partition_service_; ObPartitionService* partition_service_;
common::ObFixedQueue<ObMsInfoTask> free_queue_; common::ObLinkQueue free_queue_;
ObMsInfoTask* tasks_;
int tg_id_; int tg_id_;
private: private: