namespace {
const uint32_t HEADER_FIXED_SIZE = 25; /// preamble, version, entry tid, tag id
+const uint32_t REMAINDER_FIXED_SIZE = 8; /// data size, crc
} // anonymous namespace
+uint32_t Entry::get_fixed_size() {
+ return HEADER_FIXED_SIZE + REMAINDER_FIXED_SIZE;
+}
+
void Entry::encode(bufferlist &bl) const {
bufferlist data_bl;
::encode(preamble, data_bl);
::encode(static_cast<uint8_t>(1), data_bl);
::encode(m_entry_tid, data_bl);
::encode(m_tag_tid, data_bl);
- assert(HEADER_FIXED_SIZE == data_bl.length());
-
::encode(m_data, data_bl);
uint32_t crc = data_bl.crc32c(0);
+ uint32_t bl_offset = bl.length();
bl.claim_append(data_bl);
::encode(crc, bl);
+ assert(get_fixed_size() + m_data.length() + bl_offset == bl.length());
}
void Entry::decode(bufferlist::iterator &iter) {
{
}
+ static uint32_t get_fixed_size();
+
inline uint64_t get_tag_tid() const {
return m_tag_tid;
}
inline uint8_t get_order() const {
return m_order;
}
+ inline uint64_t get_object_size() const {
+ return 1 << m_order;
+ }
inline uint8_t get_splay_width() const {
return m_splay_width;
}
Future JournalRecorder::append(uint64_t tag_tid,
const bufferlist &payload_bl) {
+
Mutex::Locker locker(m_lock);
uint64_t entry_tid = m_journal_metadata->allocate_entry_tid(tag_tid);
bufferlist entry_bl;
::encode(Entry(future->get_tag_tid(), future->get_entry_tid(), payload_bl),
entry_bl);
+ assert(entry_bl.length() <= m_journal_metadata->get_object_size());
AppendBuffers append_buffers;
append_buffers.push_back(std::make_pair(future, entry_bl));
m_recorder = NULL;
}
+uint64_t Journaler::get_max_append_size() const {
+ return m_metadata->get_object_size() - Entry::get_fixed_size();
+}
+
Future Journaler::append(uint64_t tag_tid, const bufferlist &payload_bl) {
return m_recorder->append(tag_tid, payload_bl);
}
bool try_pop_front(ReplayEntry *replay_entry, uint64_t *tag_tid = nullptr);
void stop_replay();
+ uint64_t get_max_append_size() const;
void start_append(int flush_interval, uint64_t flush_bytes, double flush_age);
Future append(uint64_t tag_tid, const bufferlist &bl);
void flush_append(Context *on_safe);
// vim: ts=8 sw=2 smarttab
#include "journal/JournalRecorder.h"
+#include "journal/Entry.h"
#include "journal/JournalMetadata.h"
#include "test/journal/RadosTestFixture.h"
#include <limits>
journal::JournalRecorder *recorder = create_recorder(oid, metadata);
- recorder->append(123, create_payload(std::string(1 << 12, '1')));
+ recorder->append(123, create_payload(std::string(metadata->get_object_size() -
+ journal::Entry::get_fixed_size(), '1')));
journal::Future future2 = recorder->append(123, create_payload(std::string(1, '2')));
C_SaferCond cond;
journal::JournalRecorder *recorder1 = create_recorder(oid, metadata);
journal::JournalRecorder *recorder2 = create_recorder(oid, metadata);
- recorder1->append(123, create_payload(std::string(1, '1')));
- recorder2->append(234, create_payload(std::string(1 << 12, '2')));
+ recorder1->append(234, create_payload(std::string(1, '1')));
+ recorder2->append(123, create_payload(std::string(metadata->get_object_size() -
+ journal::Entry::get_fixed_size(), '2')));
journal::Future future = recorder2->append(123, create_payload(std::string(1, '3')));
MOCK_METHOD3(start_append, void(int flush_interval, uint64_t flush_bytes,
double flush_age));
+ MOCK_CONST_METHOD0(get_max_append_size, uint64_t());
MOCK_METHOD2(append, MockFutureProxy(uint64_t tag_id,
const bufferlist &bl));
MOCK_METHOD1(flush, void(Context *on_safe));
flush_age);
}
+ uint64_t get_max_append_size() const {
+ return MockJournaler::get_instance().get_max_append_size();
+ }
MockFutureProxy append(uint64_t tag_id, const bufferlist &bl) {
return MockJournaler::get_instance().append(tag_id, bl);
}