168 lines
4.4 KiB
C++
168 lines
4.4 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_UNITEST_LOGSERVICE_MOCK_PALF
|
|
#define OCEANBASE_UNITEST_LOGSERVICE_MOCK_PALF
|
|
#include <stdint.h>
|
|
#include "lib/utility/ob_print_utils.h"
|
|
#include "share/ob_errno.h"
|
|
#include "share/ob_define.h"
|
|
#include "logservice/replayservice/ob_replay_status.h"
|
|
#include "logservice/ob_log_base_header.h"
|
|
#include "logservice/palf/palf_env.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace palf
|
|
{
|
|
class MockPalfHandle;
|
|
class MockPalfBufferIterator : public PalfBufferIterator
|
|
{
|
|
public:
|
|
MockPalfBufferIterator() {destroy();}
|
|
virtual ~MockPalfBufferIterator() {destroy();}
|
|
void destroy()
|
|
{
|
|
base_id_ = 0;
|
|
cur_log_size_ = 0;
|
|
base_val_.reset();
|
|
end_ = 2048;
|
|
cb_ = NULL;
|
|
}
|
|
int init(PalfHandle *palf_handle, const LSN &start_lsn)
|
|
{
|
|
UNUSED(palf_handle);
|
|
base_val_ = start_lsn;
|
|
return OB_SUCCESS;
|
|
}
|
|
int reset(const LSN lsn) { UNUSED(lsn); return OB_SUCCESS; }
|
|
bool valid() const { return base_val_.val_ < end_; }
|
|
int next()
|
|
{
|
|
base_val_ = base_val_ + cur_log_size_;
|
|
return OB_SUCCESS;
|
|
}
|
|
int get_entry(char *&buffer, int64_t &nbytes, int64_t &ts, LSN &offset)
|
|
{
|
|
REPLAY_LOG(INFO, "[KEQING] palf get entry", K(end_), K(base_val_), K(base_id_));
|
|
uint64_t flag = base_val_.val_;
|
|
bool is_barrier = (0 == flag % 10);
|
|
int64_t cur_time = oceanbase::common::ObTimeUtility::fast_current_time();
|
|
logservice::ObLogBaseHeader header(logservice::ObLogBaseType::TRANS_SERVICE_LOG_BASE_TYPE, is_barrier, flag);
|
|
int64_t BUF_SIZE = header.get_serialize_size();
|
|
int64_t pos = 0;
|
|
char *buf = static_cast<char*>(ob_malloc(BUF_SIZE));
|
|
header.serialize(buf, BUF_SIZE, pos);
|
|
buffer = buf;
|
|
nbytes = BUF_SIZE;
|
|
cur_log_size_ = nbytes;
|
|
ts = cur_time;
|
|
offset = base_val_;
|
|
if (flag == 1024) {
|
|
end_ = 4096;
|
|
cb_->update_end_lsn(1, LSN(0, end_));
|
|
REPLAY_LOG(INFO, "[KEQING] update end offset", K(end_));
|
|
}
|
|
return OB_SUCCESS;
|
|
}
|
|
void set_cb(PalfFSCb *fs_cb) { cb_ = fs_cb; }
|
|
private:
|
|
static const int64_t TEST_LOG_FILE_SIZE = 5000;
|
|
LSN base_val_;
|
|
int64_t cur_log_size_;
|
|
int64_t base_id_;
|
|
int64_t end_;
|
|
PalfFSCb *cb_;
|
|
};
|
|
|
|
class MockPalfHandle : public PalfHandle
|
|
{
|
|
public:
|
|
MockPalfHandle() :
|
|
base_val_(0, 0),
|
|
end_val_(0, 1 << 11),
|
|
iterator_()
|
|
{}
|
|
virtual ~MockPalfHandle() {reset();}
|
|
MockPalfHandle(const LSN &base_offset, const LSN &end_offset)
|
|
: iterator_()
|
|
{
|
|
base_val_ = base_offset;
|
|
end_val_ = end_offset;
|
|
}
|
|
void reset()
|
|
{
|
|
base_val_.reset();
|
|
end_val_.reset();
|
|
iterator_.destroy();
|
|
}
|
|
void set(const LSN &base_offset, const LSN &end_offset)
|
|
{
|
|
base_val_ = base_offset;
|
|
end_val_ = end_offset;
|
|
}
|
|
const LSN &get_end_offset() const { return end_val_; }
|
|
const LSN &get_base_offset() const { return base_val_; }
|
|
int64_t get_base_ts() const { return 0; }
|
|
int unregister_file_size_cb() { return OB_SUCCESS; }
|
|
int seek(const LSN &start_lsn,
|
|
PalfBufferIterator &iter)
|
|
{
|
|
iterator_.init(this, start_lsn);
|
|
iter = iterator_;
|
|
return OB_SUCCESS;
|
|
}
|
|
void free_iterator(PalfBufferIterator *iterator)
|
|
{
|
|
ob_free(iterator);
|
|
iterator = NULL;
|
|
}
|
|
int register_file_size_cb(PalfFSCb *fs_cb)
|
|
{
|
|
iterator_.set_cb(fs_cb);
|
|
return OB_SUCCESS;
|
|
}
|
|
private:
|
|
LSN base_val_;
|
|
LSN end_val_;
|
|
MockPalfBufferIterator iterator_;
|
|
};
|
|
|
|
class MockPalfEnv : public PalfEnv
|
|
{
|
|
public:
|
|
MockPalfEnv() :
|
|
palf_handle_()
|
|
{}
|
|
virtual ~MockPalfEnv() {reset();}
|
|
void reset()
|
|
{
|
|
palf_handle_.reset();
|
|
}
|
|
int open(const int64_t id, PalfRoleChangeCb *rc_cb, PalfHandle &handle) final
|
|
{
|
|
UNUSED(id);
|
|
UNUSED(rc_cb);
|
|
handle = palf_handle_;
|
|
REPLAY_LOG(INFO, "KEQING DEBUG open", K(&palf_handle_));
|
|
return OB_SUCCESS;
|
|
}
|
|
int close(PalfHandle *handle) { UNUSED(handle); return OB_SUCCESS; }
|
|
private:
|
|
MockPalfHandle &palf_handle_;
|
|
};
|
|
|
|
} // end namesapce logservice
|
|
} // end namespace oceanbase
|
|
|
|
#endif // OCEANBASE_UNITEST_LOGSERVICE_MOCK_PALF
|