From 5c264b1519ebc853085ff994d92df96379e3cd50 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 27 Jan 2010 21:09:15 -0800 Subject: [PATCH] journal: allow pre and post padding for journal payload Replace the header.alignment fixups with an explicit post_pad. --- src/os/FileJournal.cc | 47 ++++++++++++++++++++++++++++--------------- src/os/FileJournal.h | 1 + 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/os/FileJournal.cc b/src/os/FileJournal.cc index 48b1ba3b90eac..32973e918ec52 100644 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@ -382,9 +382,23 @@ void FileJournal::prepare_multi_write(bufferlist& bl) entry_header_t h; h.seq = seq; h.len = ebl.length(); + h.pre_pad = 0; + h.post_pad = 0; h.make_magic(queue_pos, header.fsid); + + // pad? + if (queue_pos + size % header.alignment) { + h.post_pad = header.alignment - (queue_pos + size % header.alignment); + size += h.post_pad; + //dout(20) << " padding with " << pad << " bytes, queue_pos now " << queue_pos << dendl; + } + bl.append((const char*)&h, sizeof(h)); bl.claim_append(ebl); + if (h.post_pad) { + bufferptr bp = buffer::create_static(h.post_pad, zero_buf); + bl.push_back(bp); + } bl.append((const char*)&h, sizeof(h)); if (writeq.front().fin) { @@ -398,15 +412,6 @@ void FileJournal::prepare_multi_write(bufferlist& bl) queue_pos += size; - // pad... - if (queue_pos % header.alignment) { - int pad = header.alignment - (queue_pos % header.alignment); - bufferptr bp = buffer::create_static(pad, zero_buf); - bl.push_back(bp); - queue_pos += pad; - //dout(20) << " padding with " << pad << " bytes, queue_pos now " << queue_pos << dendl; - } - if (eleft) { if (--eleft == 0) { dout(20) << " hit max events per write " << g_conf.journal_max_write_entries << dendl; @@ -429,8 +434,8 @@ bool FileJournal::prepare_single_dio_write(bufferlist& bl) __u64 seq = writeq.front().seq; bufferlist &ebl = writeq.front().bl; - off64_t size = 2*sizeof(entry_header_t) + ebl.length(); - size = ROUND_UP_TO(size, header.alignment); + off64_t base_size = 2*sizeof(entry_header_t) + ebl.length(); + off64_t size = ROUND_UP_TO(base_size, header.alignment); if (!check_for_wrap(seq, &write_pos, size, true)) return false; @@ -444,9 +449,11 @@ bool FileJournal::prepare_single_dio_write(bufferlist& bl) entry_header_t *h = (entry_header_t*)bp.c_str(); h->seq = seq; h->len = ebl.length(); + h->pre_pad = 0; + h->post_pad = size - base_size; h->make_magic(write_pos, header.fsid); - ebl.copy(0, ebl.length(), bp.c_str()+sizeof(*h)); - memcpy(bp.c_str() + sizeof(*h) + ebl.length(), h, sizeof(*h)); + ebl.copy(0, ebl.length(), bp.c_str()+sizeof(*h)+h->pre_pad); + memcpy(bp.c_str() + sizeof(*h) + h->pre_pad + ebl.length() + h->post_pad, h, sizeof(*h)); bl.push_back(bp); if (writeq.front().fin) { @@ -523,7 +530,8 @@ void FileJournal::do_write(bufferlist& bl) writing = false; write_pos += bl.length(); - write_pos = ROUND_UP_TO(write_pos, header.alignment); + //write_pos = ROUND_UP_TO(write_pos, header.alignment); + assert(write_pos % header.alignment == 0); // kick finisher? // only if we haven't filled up recently! @@ -698,10 +706,16 @@ bool FileJournal::read_entry(bufferlist& bl, __u64& seq) return false; } + if (h.pre_pad) + ::lseek64(fd, h.pre_pad, SEEK_CUR); + // body bufferptr bp(h.len); ::read(fd, bp.c_str(), h.len); + if (h.post_pad) + ::lseek64(fd, h.post_pad, SEEK_CUR); + // footer entry_header_t f; ::read(fd, &f, sizeof(h)); @@ -736,8 +750,9 @@ bool FileJournal::read_entry(bufferlist& bl, __u64& seq) seq = h.seq; journalq.push_back(pair<__u64,off64_t>(h.seq, read_pos)); - read_pos += 2*sizeof(entry_header_t) + h.len; - read_pos = ROUND_UP_TO(read_pos, header.alignment); + read_pos += 2*sizeof(entry_header_t) + h.pre_pad + h.len + h.post_pad; + assert(read_pos % header.alignment == 0); + //read_pos = ROUND_UP_TO(read_pos, header.alignment); return true; } diff --git a/src/os/FileJournal.h b/src/os/FileJournal.h index f083bc7f50b6c..d453fb7985f6d 100644 --- a/src/os/FileJournal.h +++ b/src/os/FileJournal.h @@ -49,6 +49,7 @@ public: struct entry_header_t { uint64_t seq; // fs op seq # uint64_t len; + uint64_t pre_pad, post_pad; uint64_t magic1; uint64_t magic2; -- 2.39.5