}
}
}
+
+void BlueStore::_do_garbage_collection(
+ TransContext *txc,
+ CollectionRef& c,
+ OnodeRef o,
+ uint64_t& offset,
+ uint64_t& length,
+ bufferlist& bl,
+ WriteContext *wctx)
+{
+ uint64_t gc_start_offset, gc_end_offset;
+ uint64_t end = offset + length;
+ bool do_collect =
+ o->extent_map.do_write_check_depth(o->onode.size,
+ offset, end, &wctx->blob_depth,
+ &gc_start_offset,
+ &gc_end_offset);
+ if (do_collect) {
+ // we need garbage collection of blobs.
+ if (offset > gc_start_offset) {
+ bufferlist head_bl;
+ size_t read_len = offset - gc_start_offset;
+ int r = _do_read(c.get(), o, gc_start_offset, read_len, head_bl, 0);
+ assert(r == (int)read_len);
+ if (g_conf->bluestore_gc_merge_data) {
+ head_bl.claim_append(bl);
+ bl.swap(head_bl);
+ offset = gc_start_offset;
+ length = end - offset;
+ } else {
+ o->extent_map.fault_range(db, gc_start_offset, read_len);
+ _do_write_data(txc, c, o, gc_start_offset, read_len, head_bl, wctx);
+ }
+ logger->inc(l_bluestore_gc);
+ logger->inc(l_bluestore_gc_bytes, read_len);
+ }
+
+ if (end < gc_end_offset) {
+ bufferlist tail_bl;
+ size_t read_len = gc_end_offset - end;
+ int r = _do_read(c.get(), o, end, read_len, tail_bl, 0);
+ assert(r == (int)read_len);
+ if (g_conf->bluestore_gc_merge_data) {
+ bl.claim_append(tail_bl);
+ length += read_len;
+ } else {
+ o->extent_map.fault_range(db, end, read_len);
+ _do_write_data(txc, c, o, end, read_len, tail_bl, wctx);
+ }
+ logger->inc(l_bluestore_gc);
+ logger->inc(l_bluestore_gc_bytes, read_len);
+ }
+ }
+}
+
int BlueStore::_do_write(
TransContext *txc,
CollectionRef& c,
<< " target_blob_size 0x" << std::hex << wctx.target_blob_size
<< std::dec << dendl;
- uint64_t gc_start_offset = offset, gc_end_offset = end;
- bool do_collect =
- o->extent_map.do_write_check_depth(o->onode.size,
- offset, end, &wctx.blob_depth,
- &gc_start_offset,
- &gc_end_offset);
- if (do_collect) {
- // we need garbage collection of blobs.
- if (offset > gc_start_offset) {
- bufferlist head_bl;
- size_t read_len = offset - gc_start_offset;
- int r = _do_read(c.get(), o, gc_start_offset, read_len, head_bl, 0);
- assert(r == (int)read_len);
- if (g_conf->bluestore_gc_merge_data) {
- head_bl.claim_append(bl);
- bl.swap(head_bl);
- offset = gc_start_offset;
- length = end - offset;
- } else {
- o->extent_map.fault_range(db, gc_start_offset, read_len);
- _do_write_data(txc, c, o, gc_start_offset, read_len, head_bl, &wctx);
- }
- logger->inc(l_bluestore_gc);
- logger->inc(l_bluestore_gc_bytes, read_len);
- }
-
- if (end < gc_end_offset) {
- bufferlist tail_bl;
- size_t read_len = gc_end_offset - end;
- int r = _do_read(c.get(), o, end, read_len, tail_bl, 0);
- assert(r == (int)read_len);
- if (g_conf->bluestore_gc_merge_data) {
- bl.claim_append(tail_bl);
- length += read_len;
- end += read_len;
- } else {
- o->extent_map.fault_range(db, end, read_len);
- _do_write_data(txc, c, o, end, read_len, tail_bl, &wctx);
- }
- logger->inc(l_bluestore_gc);
- logger->inc(l_bluestore_gc_bytes, read_len);
- }
- }
+ _do_garbage_collection(txc, c, o, offset, length, bl, &wctx);
o->extent_map.fault_range(db, offset, length);
_do_write_data(txc, c, o, offset, length, bl, &wctx);