TQueue: binlog test
GitOrigin-RevId: 030ff54f52a397d46239aced21bf801fab649c59
This commit is contained in:
parent
892d8b8351
commit
523ab2e1ec
144
test/tqueue.cpp
144
test/tqueue.cpp
@ -217,7 +217,7 @@ class TQueueBinlog : public TQueue::Callback {
|
|||||||
public:
|
public:
|
||||||
struct LogEvent : public Storer {
|
struct LogEvent : public Storer {
|
||||||
LogEvent() = default;
|
LogEvent() = default;
|
||||||
int32 queue_id;
|
int64 queue_id;
|
||||||
int32 event_id;
|
int32 event_id;
|
||||||
int32 expire_at;
|
int32 expire_at;
|
||||||
Slice data;
|
Slice data;
|
||||||
@ -233,10 +233,11 @@ class TQueueBinlog : public TQueue::Callback {
|
|||||||
|
|
||||||
template <class ParserT>
|
template <class ParserT>
|
||||||
void parse(ParserT &&parser) {
|
void parse(ParserT &&parser) {
|
||||||
|
using td::parse;
|
||||||
parse(queue_id, parser);
|
parse(queue_id, parser);
|
||||||
parse(event_id, parser);
|
parse(event_id, parser);
|
||||||
parse(expire_at, parser);
|
parse(expire_at, parser);
|
||||||
parse(data, parser);
|
data = parser.template fetch_string<Slice>();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const override {
|
size_t size() const override {
|
||||||
@ -286,7 +287,7 @@ class TQueueBinlog : public TQueue::Callback {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<BinlogT> binlog_;
|
std::shared_ptr<BinlogT> binlog_;
|
||||||
int32 magic_{0};
|
int32 magic_{2314};
|
||||||
};
|
};
|
||||||
|
|
||||||
class MemoryStorage : public TQueue::Callback {
|
class MemoryStorage : public TQueue::Callback {
|
||||||
@ -357,63 +358,118 @@ TEST(TQueue, hands) {
|
|||||||
ASSERT_EQ(1u, tqueue.get(qid, head, 0, events_span).move_as_ok());
|
ASSERT_EQ(1u, tqueue.get(qid, head, 0, events_span).move_as_ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(TQueue, random) {
|
class TestTQueue {
|
||||||
// Just do random ops with one queue
|
public:
|
||||||
auto qid = 12;
|
CSlice binlog_path() {
|
||||||
EventId first_id = EventId::from_int32(EventId::MAX_ID - 100).move_as_ok();
|
return "test_binlog";
|
||||||
//first_id = {};
|
}
|
||||||
|
TestTQueue() {
|
||||||
|
auto memory_storage = td::make_unique<MemoryStorage>();
|
||||||
|
memory_storage_ = memory_storage.get();
|
||||||
|
memory_.set_callback(std::move(memory_storage));
|
||||||
|
|
||||||
TQueue tqueue_memory;
|
auto tqueue_binlog = make_unique<TQueueBinlog<Binlog>>();
|
||||||
//auto memory_storage = td::make_unique<MemoryStorage>();
|
Binlog::destroy(binlog_path()).ensure();
|
||||||
//auto memory_storage_ptr = memory_storage.get();
|
auto binlog = std::make_shared<Binlog>();
|
||||||
//tqueue_memory.set_callback(std::move(memory_storage));
|
binlog->init(binlog_path().str(), [&](const BinlogEvent &event) { UNREACHABLE(); }).ensure();
|
||||||
|
tqueue_binlog->set_binlog(binlog);
|
||||||
|
binlog_.set_callback(std::move(tqueue_binlog));
|
||||||
|
}
|
||||||
|
|
||||||
TQueue tqueue_binlog;
|
void restart(Random::Xorshift128plus &rnd) {
|
||||||
auto binlog_storage = td::make_unique<MemoryStorage>();
|
memory_.extract_callback().release();
|
||||||
auto binlog_storage_ptr = binlog_storage.get();
|
auto memory_storage = unique_ptr<MemoryStorage>(memory_storage_);
|
||||||
tqueue_binlog.set_callback(std::move(binlog_storage));
|
memory_ = TQueue();
|
||||||
|
memory_storage->replay(memory_);
|
||||||
|
memory_.set_callback(std::move(memory_storage));
|
||||||
|
|
||||||
Random::Xorshift128plus rnd(123);
|
if (rnd.fast(0, 100) != 0) {
|
||||||
auto push_event = [&] {
|
return;
|
||||||
auto data = PSTRING() << rnd();
|
}
|
||||||
tqueue_memory.push(qid, data, 0, first_id);
|
|
||||||
tqueue_binlog.push(qid, data, 0, first_id);
|
|
||||||
};
|
|
||||||
auto get_head = [&] { ASSERT_EQ(tqueue_memory.get_head(qid), tqueue_binlog.get_head(qid)); };
|
|
||||||
auto get_tail = [&] { ASSERT_EQ(tqueue_memory.get_tail(qid), tqueue_binlog.get_tail(qid)); };
|
|
||||||
|
|
||||||
TQueue::Event events_a[100];
|
LOG(ERROR) << "RESTART BINLOG";
|
||||||
auto events_span_a = MutableSpan<TQueue::Event>(events_a, 100);
|
binlog_ = TQueue();
|
||||||
TQueue::Event events_b[100];
|
auto tqueue_binlog = make_unique<TQueueBinlog<Binlog>>();
|
||||||
auto events_span_b = MutableSpan<TQueue::Event>(events_b, 100);
|
auto binlog = std::make_shared<Binlog>();
|
||||||
|
binlog->init(binlog_path().str(), [&](const BinlogEvent &event) { tqueue_binlog->replay(event, binlog_); })
|
||||||
|
.ensure();
|
||||||
|
tqueue_binlog->set_binlog(binlog);
|
||||||
|
binlog_.set_callback(std::move(tqueue_binlog));
|
||||||
|
}
|
||||||
|
|
||||||
auto get = [&] {
|
EventId push(TQueueId queue_id, string data, double expire_at, EventId new_id = EventId()) {
|
||||||
auto a_from = tqueue_memory.get_head(qid);
|
auto a_id = baseline_.push(queue_id, data, expire_at, new_id);
|
||||||
auto b_from = tqueue_binlog.get_head(qid);
|
auto b_id = memory_.push(queue_id, data, expire_at, new_id);
|
||||||
|
auto c_id = binlog_.push(queue_id, data, expire_at, new_id);
|
||||||
|
ASSERT_EQ(a_id, b_id);
|
||||||
|
ASSERT_EQ(a_id, c_id);
|
||||||
|
return a_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_head_tail(TQueueId qid) {
|
||||||
|
ASSERT_EQ(baseline_.get_head(qid), memory_.get_head(qid));
|
||||||
|
ASSERT_EQ(baseline_.get_head(qid), binlog_.get_head(qid));
|
||||||
|
ASSERT_EQ(baseline_.get_tail(qid), memory_.get_tail(qid));
|
||||||
|
ASSERT_EQ(baseline_.get_tail(qid), binlog_.get_tail(qid));
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_get(TQueueId qid, Random::Xorshift128plus &rnd) {
|
||||||
|
TQueue::Event a[10];
|
||||||
|
MutableSpan<TQueue::Event> a_span(a, 10);
|
||||||
|
TQueue::Event b[10];
|
||||||
|
MutableSpan<TQueue::Event> b_span(b, 10);
|
||||||
|
TQueue::Event c[10];
|
||||||
|
MutableSpan<TQueue::Event> c_span(b, 10);
|
||||||
|
|
||||||
|
auto a_from = baseline_.get_head(qid);
|
||||||
|
auto b_from = memory_.get_head(qid);
|
||||||
|
auto c_from = binlog_.get_head(qid);
|
||||||
ASSERT_EQ(a_from, b_from);
|
ASSERT_EQ(a_from, b_from);
|
||||||
|
ASSERT_EQ(a_from, c_from);
|
||||||
|
|
||||||
auto tmp = a_from.advance(rnd.fast(-10, 10));
|
auto tmp = a_from.advance(rnd.fast(-10, 10));
|
||||||
if (tmp.is_ok()) {
|
if (tmp.is_ok()) {
|
||||||
a_from = tmp.move_as_ok();
|
a_from = tmp.move_as_ok();
|
||||||
}
|
}
|
||||||
auto a_size = tqueue_memory.get(qid, a_from, 0, events_span_a).move_as_ok();
|
auto a_size = baseline_.get(qid, a_from, 0, a_span).move_as_ok();
|
||||||
auto b_size = tqueue_binlog.get(qid, a_from, 0, events_span_b).move_as_ok();
|
auto b_size = memory_.get(qid, a_from, 0, b_span).move_as_ok();
|
||||||
|
auto c_size = binlog_.get(qid, a_from, 0, c_span).move_as_ok();
|
||||||
ASSERT_EQ(a_size, b_size);
|
ASSERT_EQ(a_size, b_size);
|
||||||
|
ASSERT_EQ(a_size, c_size);
|
||||||
for (size_t i = 0; i < a_size; i++) {
|
for (size_t i = 0; i < a_size; i++) {
|
||||||
ASSERT_EQ(events_span_a[i].id, events_span_b[i].id);
|
ASSERT_EQ(a_span[i].id, b_span[i].id);
|
||||||
ASSERT_EQ(events_span_a[i].data, events_span_b[i].data);
|
ASSERT_EQ(a_span[i].id, c_span[i].id);
|
||||||
|
ASSERT_EQ(a_span[i].data, b_span[i].data);
|
||||||
|
ASSERT_EQ(a_span[i].data, c_span[i].data);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
auto restart = [&] {
|
private:
|
||||||
tqueue_binlog.extract_callback().release();
|
TQueue baseline_;
|
||||||
binlog_storage = unique_ptr<MemoryStorage>(binlog_storage_ptr);
|
TQueue memory_;
|
||||||
tqueue_binlog = TQueue();
|
TQueue binlog_;
|
||||||
binlog_storage->replay(tqueue_binlog);
|
MemoryStorage *memory_storage_{nullptr};
|
||||||
tqueue_binlog.set_callback(std::move(binlog_storage));
|
//TQueue binlog_;
|
||||||
};
|
};
|
||||||
|
|
||||||
RandomSteps steps({{push_event, 100}, {get_head, 10}, {get_tail, 10}, {get, 40}, {restart, 1}});
|
TEST(TQueue, random) {
|
||||||
|
Random::Xorshift128plus rnd(123);
|
||||||
|
auto next_qid = [&] { return rnd.fast(1, 10); };
|
||||||
|
auto next_first_id = [&] {
|
||||||
|
if (rnd.fast(0, 3) == 0) {
|
||||||
|
return EventId::from_int32(EventId::MAX_ID - 20).move_as_ok();
|
||||||
|
}
|
||||||
|
return EventId::from_int32(rnd.fast(1000000000, 1500000000)).move_as_ok();
|
||||||
|
};
|
||||||
|
TestTQueue q;
|
||||||
|
auto push_event = [&] {
|
||||||
|
auto data = PSTRING() << rnd();
|
||||||
|
q.push(next_qid(), data, 0, next_first_id());
|
||||||
|
};
|
||||||
|
auto check_head_tail = [&] { q.check_head_tail(next_qid()); };
|
||||||
|
auto restart = [&] { q.restart(rnd); };
|
||||||
|
auto get = [&] { q.check_get(next_qid(), rnd); };
|
||||||
|
RandomSteps steps({{push_event, 100}, {check_head_tail, 10}, {get, 40}, {restart, 1}});
|
||||||
for (int i = 0; i < 1000000; i++) {
|
for (int i = 0; i < 1000000; i++) {
|
||||||
steps.step(rnd);
|
steps.step(rnd);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user