@@ -147,96 +147,89 @@ BtreeLBAManager::mkfs(
147147BtreeLBAManager::get_mappings_ret
148148BtreeLBAManager::get_mappings (
149149 Transaction &t,
150- laddr_t offset, extent_len_t length)
150+ laddr_t laddr,
151+ extent_len_t length)
151152{
152153 LOG_PREFIX (BtreeLBAManager::get_mappings);
153- TRACET (" {}~{} " , t, offset , length);
154+ TRACET (" {}~0x{:x} ... " , t, laddr , length);
154155 auto c = get_context (t);
155156 return with_btree_state<LBABtree, lba_pin_list_t >(
156- cache,
157- c,
158- [c, offset, length, FNAME, this ](auto &btree, auto &ret) {
157+ cache, c,
158+ [FNAME, this , c, laddr, length](auto & btree, auto & ret)
159+ {
160+ return _get_mappings (c, btree, laddr, length
161+ ).si_then ([FNAME, this , c, laddr, length, &btree, &ret](auto pin_list) {
159162 return seastar::do_with (
160- std::list<BtreeLBAMappingRef>(),
161- [offset, length, c, FNAME, this , &ret, &btree](auto &pin_list) {
162- return LBABtree::iterate_repeat (
163- c,
164- btree.upper_bound_right (c, offset),
165- [&pin_list, offset, length, c, FNAME](auto &pos) {
166- if (pos.is_end () || pos.get_key () >= (offset + length)) {
167- TRACET (" {}~{} done with {} results" ,
168- c.trans , offset, length, pin_list.size ());
169- return LBABtree::iterate_repeat_ret_inner (
170- interruptible::ready_future_marker{},
171- seastar::stop_iteration::yes);
172- }
173- TRACET (" {}~{} got {}, {}, repeat ..." ,
174- c.trans , offset, length, pos.get_key (), pos.get_val ());
175- ceph_assert ((pos.get_key () + pos.get_val ().len ) > offset);
176- pin_list.push_back (pos.get_pin (c));
177- return LBABtree::iterate_repeat_ret_inner (
178- interruptible::ready_future_marker{},
179- seastar::stop_iteration::no);
180- }).si_then ([this , &ret, c, &pin_list] {
181- return _get_original_mappings (c, pin_list
182- ).si_then ([&ret](auto _ret) {
183- ret = std::move (_ret);
184- });
185- });
186- });
163+ std::move (pin_list),
164+ [FNAME, this , c, laddr, length, &btree, &ret](auto & pin_list)
165+ {
166+ return trans_intr::do_for_each (
167+ pin_list,
168+ [FNAME, this , c, laddr, length, &btree, &ret](auto & pin)
169+ {
170+ if (!pin->is_indirect ()) {
171+ TRACET (" {}~0x{:x} got direct pin {}~0x{:x}" ,
172+ c.trans , laddr, length, pin->get_key (), pin->get_length ());
173+ ret.emplace_back (std::move (pin));
174+ return get_mappings_iertr::now ();
175+ }
176+ auto key = pin->get_key ();
177+ auto intermediate_key = pin->get_raw_val ().get_laddr ();
178+ auto intermediate_len = pin->get_length ();
179+ return _get_mappings (c, btree, intermediate_key, intermediate_len
180+ ).si_then ([FNAME, c, laddr, length, key, intermediate_key,
181+ intermediate_len, &ret](auto pin_list) {
182+ ceph_assert (pin_list.size () == 1 );
183+ auto & pin = pin_list.front ();
184+ assert (!pin->is_indirect ());
185+ assert (pin->get_key () <= intermediate_key);
186+ assert (pin->get_key () + pin->get_length () >= intermediate_key + intermediate_len);
187+ TRACET (" {}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})" ,
188+ c.trans , laddr, length, key, intermediate_len, intermediate_key,
189+ pin->get_key (), pin->get_length ());
190+ pin->make_indirect (key, intermediate_len, intermediate_key);
191+ ret.emplace_back (std::move (pin));
192+ return get_mappings_iertr::now ();
193+ });
194+ });
195+ });
187196 });
197+ });
188198}
189199
190- BtreeLBAManager::_get_original_mappings_ret
191- BtreeLBAManager::_get_original_mappings (
200+ BtreeLBAManager::_get_mappings_ret
201+ BtreeLBAManager::_get_mappings (
192202 op_context_t <laddr_t > c,
193- std::list<BtreeLBAMappingRef> &pin_list)
203+ LBABtree& btree,
204+ laddr_t laddr,
205+ extent_len_t length)
194206{
207+ LOG_PREFIX (BtreeLBAManager::_get_mappings);
208+ TRACET (" {}~0x{:x} ..." , c.trans , laddr, length);
195209 return seastar::do_with (
196- lba_pin_list_t (),
197- [this , c, &pin_list](auto &ret) {
198- return trans_intr::do_for_each (
199- pin_list,
200- [this , c, &ret](auto &pin) {
201- LOG_PREFIX (BtreeLBAManager::get_mappings);
202- if (pin->get_raw_val ().is_paddr ()) {
203- ret.emplace_back (std::move (pin));
204- return get_mappings_iertr::now ();
205- }
206- TRACET (
207- " getting original mapping for indirect mapping {}~{}" ,
208- c.trans , pin->get_key (), pin->get_length ());
209- return this ->get_mappings (
210- c.trans , pin->get_raw_val ().get_laddr (), pin->get_length ()
211- ).si_then ([&pin, &ret, c](auto new_pin_list) {
212- LOG_PREFIX (BtreeLBAManager::get_mappings);
213- assert (new_pin_list.size () == 1 );
214- auto &new_pin = new_pin_list.front ();
215- auto intermediate_key = pin->get_raw_val ().get_laddr ();
216- assert (!new_pin->is_indirect ());
217- assert (new_pin->get_key () <= intermediate_key);
218- assert (new_pin->get_key () + new_pin->get_length () >=
219- intermediate_key + pin->get_length ());
220-
221- TRACET (" Got mapping {}~{} for indirect mapping {}~{}, "
222- " intermediate_key {}" ,
223- c.trans ,
224- new_pin->get_key (), new_pin->get_length (),
225- pin->get_key (), pin->get_length (),
226- pin->get_raw_val ().get_laddr ());
227- auto &btree_new_pin = static_cast <BtreeLBAMapping&>(*new_pin);
228- btree_new_pin.make_indirect (
229- pin->get_key (),
230- pin->get_length (),
231- pin->get_raw_val ().get_laddr ());
232- ret.emplace_back (std::move (new_pin));
233- return seastar::now ();
234- }).handle_error_interruptible (
235- crimson::ct_error::input_output_error::pass_further{},
236- crimson::ct_error::assert_all (" unexpected enoent" )
237- );
210+ std::list<BtreeLBAMappingRef>(),
211+ [FNAME, c, laddr, length, &btree](auto & ret)
212+ {
213+ return LBABtree::iterate_repeat (
214+ c,
215+ btree.upper_bound_right (c, laddr),
216+ [FNAME, c, laddr, length, &ret](auto & pos)
217+ {
218+ if (pos.is_end () || pos.get_key () >= (laddr + length)) {
219+ TRACET (" {}~0x{:x} done with {} results" ,
220+ c.trans , laddr, length, ret.size ());
221+ return LBABtree::iterate_repeat_ret_inner (
222+ interruptible::ready_future_marker{},
223+ seastar::stop_iteration::yes);
238224 }
239- ).si_then ([&ret] {
225+ TRACET (" {}~0x{:x} got {}, {}, repeat ..." ,
226+ c.trans , laddr, length, pos.get_key (), pos.get_val ());
227+ ceph_assert ((pos.get_key () + pos.get_val ().len ) > laddr);
228+ ret.push_back (pos.get_pin (c));
229+ return LBABtree::iterate_repeat_ret_inner (
230+ interruptible::ready_future_marker{},
231+ seastar::stop_iteration::no);
232+ }).si_then ([&ret] {
240233 return std::move (ret);
241234 });
242235 });
@@ -245,62 +238,58 @@ BtreeLBAManager::_get_original_mappings(
245238BtreeLBAManager::get_mapping_ret
246239BtreeLBAManager::get_mapping (
247240 Transaction &t,
248- laddr_t offset )
241+ laddr_t laddr )
249242{
250243 LOG_PREFIX (BtreeLBAManager::get_mapping);
251- TRACET (" {}" , t, offset);
252- return _get_mapping (t, offset
253- ).si_then ([](auto pin) {
254- return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move (pin));
244+ TRACET (" {} ..." , t, laddr);
245+ auto c = get_context (t);
246+ return with_btree_ret<LBABtree, LBAMappingRef>(
247+ cache, c,
248+ [FNAME, this , c, laddr](auto & btree)
249+ {
250+ return _get_mapping (c, btree, laddr
251+ ).si_then ([FNAME, this , c, laddr, &btree](auto pin) {
252+ if (!pin->is_indirect ()) {
253+ TRACET (" {} got direct pin len 0x{:x}" ,
254+ c.trans , laddr, pin->get_length ());
255+ return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move (pin));
256+ }
257+ assert (laddr == pin->get_key ());
258+ auto len = pin->get_length ();
259+ laddr_t direct_laddr = pin->get_raw_val ().get_laddr ();
260+ return _get_mapping (c, btree, direct_laddr
261+ ).si_then ([FNAME, c, laddr, len](auto pin) {
262+ ceph_assert (len == pin->get_length ());
263+ TRACET (" {} got indirect pin->{}~0x{:x}" ,
264+ c.trans , laddr, pin->get_key (), len);
265+ pin->make_indirect (laddr, len);
266+ return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move (pin));
267+ });
268+ });
255269 });
256270}
257271
258272BtreeLBAManager::_get_mapping_ret
259273BtreeLBAManager::_get_mapping (
260- Transaction &t,
261- laddr_t offset)
274+ op_context_t <laddr_t > c,
275+ LBABtree& btree,
276+ laddr_t laddr)
262277{
263278 LOG_PREFIX (BtreeLBAManager::_get_mapping);
264- TRACET (" {}" , t, offset);
265- auto c = get_context (t);
266- return with_btree_ret<LBABtree, BtreeLBAMappingRef>(
267- cache,
268- c,
269- [FNAME, c, offset, this ](auto &btree) {
270- return btree.lower_bound (
271- c, offset
272- ).si_then ([FNAME, offset, c](auto iter) -> _get_mapping_ret {
273- if (iter.is_end () || iter.get_key () != offset) {
274- ERRORT (" laddr={} doesn't exist" , c.trans , offset);
275- return crimson::ct_error::enoent::make ();
276- } else {
277- TRACET (" {} got {}, {}" ,
278- c.trans , offset, iter.get_key (), iter.get_val ());
279- auto e = iter.get_pin (c);
280- return _get_mapping_ret (
281- interruptible::ready_future_marker{},
282- std::move (e));
283- }
284- }).si_then ([this , c](auto pin) -> _get_mapping_ret {
285- if (pin->get_raw_val ().is_laddr ()) {
286- return seastar::do_with (
287- std::move (pin),
288- [this , c](auto &pin) {
289- return _get_mapping (
290- c.trans , pin->get_raw_val ().get_laddr ()
291- ).si_then ([&pin](auto new_pin) {
292- ceph_assert (pin->get_length () == new_pin->get_length ());
293- new_pin->make_indirect (
294- pin->get_key (),
295- pin->get_length ());
296- return new_pin;
297- });
298- });
299- } else {
300- return get_mapping_iertr::make_ready_future<BtreeLBAMappingRef>(std::move (pin));
301- }
302- });
303- });
279+ TRACET (" {} ..." , c.trans , laddr);
280+ return btree.lower_bound (
281+ c, laddr
282+ ).si_then ([FNAME, c, laddr](auto iter) -> _get_mapping_ret {
283+ if (iter.is_end () || iter.get_key () != laddr) {
284+ ERRORT (" {} doesn't exist" , c.trans , laddr);
285+ return crimson::ct_error::enoent::make ();
286+ }
287+ TRACET (" {} got value {}" , c.trans , laddr, iter.get_val ());
288+ auto e = iter.get_pin (c);
289+ return _get_mapping_ret (
290+ interruptible::ready_future_marker{},
291+ std::move (e));
292+ });
304293}
305294
306295BtreeLBAManager::alloc_extents_ret
0 commit comments