94 lines
2.8 KiB
C++
94 lines
2.8 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_STORAGE_CLOG_CB_ASYNC_WORKER
|
|
#define OCEANBASE_STORAGE_CLOG_CB_ASYNC_WORKER
|
|
|
|
#include "common/ob_queue_thread.h"
|
|
#include "lib/ob_define.h"
|
|
#include "common/ob_partition_key.h"
|
|
#include "storage/ob_storage_log_type.h"
|
|
|
|
namespace oceanbase {
|
|
namespace storage {
|
|
class ObPartitionService;
|
|
|
|
struct ObCLogCallbackAsyncTask {
|
|
ObCLogCallbackAsyncTask()
|
|
: pg_key_(),
|
|
partition_key_(),
|
|
log_type_(ObStorageLogType::OB_LOG_UNKNOWN),
|
|
log_id_(common::OB_INVALID_ID),
|
|
is_physical_drop_(false)
|
|
{}
|
|
|
|
OB_INLINE bool is_valid() const
|
|
{
|
|
return pg_key_.is_valid() && partition_key_.is_valid() && ObStorageLogType::OB_LOG_UNKNOWN != log_type_ &&
|
|
common::OB_INVALID_ID != log_id_;
|
|
}
|
|
|
|
OB_INLINE void deep_copy(const ObCLogCallbackAsyncTask& that)
|
|
{
|
|
if (&that != this) {
|
|
pg_key_ = that.pg_key_;
|
|
partition_key_ = that.partition_key_;
|
|
log_type_ = that.log_type_;
|
|
log_id_ = that.log_id_;
|
|
is_physical_drop_ = that.is_physical_drop_;
|
|
}
|
|
}
|
|
|
|
TO_STRING_KV(K(pg_key_), K(partition_key_), K(log_type_), K(log_id_), K(is_physical_drop_));
|
|
|
|
public:
|
|
common::ObPGKey pg_key_;
|
|
common::ObPartitionKey partition_key_;
|
|
int64_t log_type_;
|
|
uint64_t log_id_;
|
|
bool is_physical_drop_; // used by offline log
|
|
};
|
|
|
|
class ObCLogCallbackAsyncWorker : public common::M2SQueueThread {
|
|
public:
|
|
ObCLogCallbackAsyncWorker() : is_inited_(false), ptt_svr_(nullptr), free_queue_(), tasks_(nullptr){};
|
|
~ObCLogCallbackAsyncWorker()
|
|
{
|
|
destroy();
|
|
};
|
|
|
|
int init(ObPartitionService* ptt_svr);
|
|
void destroy();
|
|
virtual void handle(void* task, void* pdata);
|
|
int push_task(const ObCLogCallbackAsyncTask& task);
|
|
|
|
private:
|
|
int get_task(ObCLogCallbackAsyncTask*& task);
|
|
void free_task(ObCLogCallbackAsyncTask* task);
|
|
DISALLOW_COPY_AND_ASSIGN(ObCLogCallbackAsyncWorker);
|
|
|
|
private:
|
|
static const int64_t LONG_RETRY_INTERVAL = 100 * 1000; // 100ms
|
|
static const int64_t RETRY_INTERVAL = 2 * 1000; // 2ms
|
|
static const int64_t MAX_TASK_NUM = common::OB_MAX_PARTITION_NUM_PER_SERVER;
|
|
static const int64_t IDLE_INTERVAL = INT64_MAX;
|
|
|
|
bool is_inited_;
|
|
ObPartitionService* ptt_svr_;
|
|
common::ObFixedQueue<ObCLogCallbackAsyncTask> free_queue_;
|
|
ObCLogCallbackAsyncTask* tasks_;
|
|
};
|
|
|
|
} // namespace storage
|
|
} // namespace oceanbase
|
|
#endif
|