@@ -132,38 +132,34 @@ BtreeLBAManager::get_mappings(
132132 LOG_PREFIX (BtreeLBAManager::get_mappings);
133133 TRACET (" {}~0x{:x} ..." , t, laddr, length);
134134 auto c = get_context (t);
135- return with_btree_state<LBABtree, lba_pin_list_t >(
135+ return with_btree_state<LBABtree, lba_mapping_list_t >(
136136 cache, c,
137137 [FNAME, this , c, laddr, length](auto & btree, auto & ret)
138138 {
139- return _get_mappings (c, btree, laddr, length
140- ).si_then ([FNAME, this , c, laddr, length, &btree, &ret](auto pin_list ) {
139+ return get_cursors (c, btree, laddr, length
140+ ).si_then ([FNAME, this , c, laddr, length, &btree, &ret](auto cursors ) {
141141 return seastar::do_with (
142- std::move (pin_list ),
143- [FNAME, this , c, laddr, length, &btree, &ret](auto & pin_list )
142+ std::move (cursors ),
143+ [FNAME, this , c, laddr, length, &btree, &ret](auto & cursors )
144144 {
145145 return trans_intr::do_for_each (
146- pin_list ,
147- [FNAME, this , c, laddr, length, &btree, &ret](auto & pin )
146+ cursors ,
147+ [FNAME, this , c, laddr, length, &btree, &ret](auto & cursor )
148148 {
149- if (!pin ->is_indirect ()) {
150- TRACET ( " {}~0x{:x} got direct pin {}~0x{:x} " ,
151- c. trans , laddr, length, pin-> get_key (), pin-> get_length ());
152- ret.emplace_back ( std::move (pin ));
149+ if (!cursor ->is_indirect ()) {
150+ ret. emplace_back ( LBAMapping::create_direct ( std::move (cursor)));
151+ TRACET ( " {}~0x{:x} got {} " ,
152+ c. trans , laddr, length, ret.back ( ));
153153 return get_mappings_iertr::now ();
154154 }
155- auto key = pin->get_key ();
156- auto intermediate_key = pin->get_raw_val ().get_laddr ();
157- auto intermediate_len = pin->get_length ();
158- return get_indirect_pin (c, btree, key, intermediate_key, intermediate_len
159- ).si_then ([FNAME, c, &ret, laddr, length](auto pin) {
160- TRACET (" {}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})" ,
161- c.trans , laddr, length,
162- pin->get_key (), pin->get_length (),
163- pin->get_intermediate_key (),
164- pin->get_intermediate_base (),
165- pin->get_intermediate_length ());
166- ret.emplace_back (std::move (pin));
155+ assert (cursor->val ->refcount == EXTENT_DEFAULT_REF_COUNT);
156+ assert (cursor->val ->checksum == 0 );
157+ return resolve_indirect_cursor (c, btree, *cursor
158+ ).si_then ([FNAME, c, &ret, &cursor, laddr, length](auto direct) {
159+ ret.emplace_back (LBAMapping::create_indirect (
160+ std::move (direct), std::move (cursor)));
161+ TRACET (" {}~0x{:x} got {}" ,
162+ c.trans , laddr, length, ret.back ());
167163 return get_mappings_iertr::now ();
168164 });
169165 });
@@ -172,17 +168,17 @@ BtreeLBAManager::get_mappings(
172168 });
173169}
174170
175- BtreeLBAManager::_get_mappings_ret
176- BtreeLBAManager::_get_mappings (
171+ BtreeLBAManager::_get_cursors_ret
172+ BtreeLBAManager::get_cursors (
177173 op_context_t c,
178174 LBABtree& btree,
179175 laddr_t laddr,
180176 extent_len_t length)
181177{
182- LOG_PREFIX (BtreeLBAManager::_get_mappings );
178+ LOG_PREFIX (BtreeLBAManager::get_cursors );
183179 TRACET (" {}~0x{:x} ..." , c.trans , laddr, length);
184180 return seastar::do_with (
185- std::list<BtreeLBAMappingRef >(),
181+ std::list<LBACursorRef >(),
186182 [FNAME, c, laddr, length, &btree](auto & ret)
187183 {
188184 return LBABtree::iterate_repeat (
@@ -191,16 +187,16 @@ BtreeLBAManager::_get_mappings(
191187 [FNAME, c, laddr, length, &ret](auto & pos)
192188 {
193189 if (pos.is_end () || pos.get_key () >= (laddr + length)) {
194- TRACET (" {}~0x{:x} done with {} results" ,
195- c.trans , laddr, length, ret.size ());
190+ TRACET (" {}~0x{:x} done with {} results, stop at {} " ,
191+ c.trans , laddr, length, ret.size (), pos );
196192 return LBABtree::iterate_repeat_ret_inner (
197193 interruptible::ready_future_marker{},
198194 seastar::stop_iteration::yes);
199195 }
200- TRACET (" {}~0x{:x} got {}, {}, repeat ..." ,
201- c.trans , laddr, length, pos. get_key (), pos. get_val () );
196+ TRACET (" {}~0x{:x} got {}, repeat ..." ,
197+ c.trans , laddr, length, pos);
202198 ceph_assert ((pos.get_key () + pos.get_val ().len ) > laddr);
203- ret.push_back (pos.get_pin (c));
199+ ret.emplace_back (pos.get_cursor (c));
204200 return LBABtree::iterate_repeat_ret_inner (
205201 interruptible::ready_future_marker{},
206202 seastar::stop_iteration::no);
@@ -210,25 +206,27 @@ BtreeLBAManager::_get_mappings(
210206 });
211207}
212208
213- BtreeLBAManager::get_indirect_pin_ret
214- BtreeLBAManager::get_indirect_pin (
209+ BtreeLBAManager::resolve_indirect_cursor_ret
210+ BtreeLBAManager::resolve_indirect_cursor (
215211 op_context_t c,
216212 LBABtree& btree,
217- laddr_t key,
218- laddr_t intermediate_key,
219- extent_len_t length)
213+ const LBACursor &indirect_cursor)
220214{
221- return _get_mappings (c, btree, intermediate_key, length
222- ).si_then ([key, intermediate_key, length](auto pin_list) {
223- ceph_assert (pin_list.size () == 1 );
224- auto & pin = pin_list.front ();
225- assert (!pin->is_indirect ());
226- assert (pin->get_key () <= intermediate_key);
227- assert (pin->get_key () + pin->get_length () >= intermediate_key + length);
228- pin->make_indirect (key, length, intermediate_key);
229- assert (pin->get_key () == key);
230- assert (pin->get_length () == length);
231- return std::move (pin);
215+ ceph_assert (indirect_cursor.is_indirect ());
216+ return get_cursors (
217+ c,
218+ btree,
219+ indirect_cursor.get_intermediate_key (),
220+ indirect_cursor.get_length ()
221+ ).si_then ([&indirect_cursor](auto cursors) {
222+ ceph_assert (cursors.size () == 1 );
223+ auto & direct_cursor = cursors.front ();
224+ auto intermediate_key = indirect_cursor.get_intermediate_key ();
225+ assert (!direct_cursor->is_indirect ());
226+ assert (direct_cursor->get_laddr () <= intermediate_key);
227+ assert (direct_cursor->get_laddr () + direct_cursor->get_length ()
228+ >= intermediate_key + indirect_cursor.get_length ());
229+ return std::move (direct_cursor);
232230 });
233231}
234232
@@ -240,54 +238,55 @@ BtreeLBAManager::get_mapping(
240238 LOG_PREFIX (BtreeLBAManager::get_mapping);
241239 TRACET (" {} ..." , t, laddr);
242240 auto c = get_context (t);
243- return with_btree_ret <LBABtree, LBAMappingRef >(
241+ return with_btree <LBABtree>(
244242 cache, c,
245243 [FNAME, this , c, laddr](auto & btree)
246244 {
247- return _get_mapping (c, btree, laddr
248- ).si_then ([FNAME, this , c, laddr, &btree](auto pin) {
249- if (!pin->is_indirect ()) {
250- TRACET (" {} got direct pin len 0x{:x}" ,
251- c.trans , laddr, pin->get_length ());
252- return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move (pin));
245+ return get_cursor (c, btree, laddr
246+ ).si_then ([FNAME, this , c, laddr, &btree](LBACursorRef cursor) {
247+ if (!cursor->is_indirect ()) {
248+ TRACET (" {} got direct cursor {}" ,
249+ c.trans , laddr, *cursor);
250+ auto mapping = LBAMapping::create_direct (std::move (cursor));
251+ return get_mapping_iertr::make_ready_future<
252+ LBAMapping>(std::move (mapping));
253253 }
254- assert (laddr == pin-> get_key ());
255- auto len = pin-> get_length ( );
256- laddr_t direct_laddr = pin-> get_raw_val (). get_laddr ( );
257- return get_indirect_pin (c, btree, laddr, direct_laddr, len
258- ).si_then ([FNAME, c, laddr]( auto pin) {
259- TRACET ( " {} got indirect pin {}~0x{:x}->{}({}~0x{:x}) " ,
260- c. trans , laddr,
261- pin-> get_key ( ), pin-> get_length (),
262- pin-> get_intermediate_key () ,
263- pin-> get_intermediate_base (),
264- pin-> get_intermediate_length ());
265- return get_mapping_iertr::make_ready_future<LBAMappingRef >(std::move (pin ));
254+ assert (laddr == cursor-> get_laddr ());
255+ assert (cursor-> val -> refcount == EXTENT_DEFAULT_REF_COUNT );
256+ assert (cursor-> val -> checksum == 0 );
257+ return resolve_indirect_cursor (c, btree, *cursor
258+ ).si_then ([FNAME, c, laddr, indirect= std::move (cursor)]
259+ ( auto direct) mutable {
260+ auto mapping = LBAMapping::create_indirect (
261+ std::move (direct ), std::move (indirect));
262+ TRACET ( " {} got indirect mapping {} " ,
263+ c. trans , laddr, mapping);
264+ return get_mapping_iertr::make_ready_future<
265+ LBAMapping >(std::move (mapping ));
266266 });
267267 });
268268 });
269269}
270270
271- BtreeLBAManager::_get_mapping_ret
272- BtreeLBAManager::_get_mapping (
271+ BtreeLBAManager::_get_cursor_ret
272+ BtreeLBAManager::get_cursor (
273273 op_context_t c,
274274 LBABtree& btree,
275275 laddr_t laddr)
276276{
277- LOG_PREFIX (BtreeLBAManager::_get_mapping );
277+ LOG_PREFIX (BtreeLBAManager::get_cursor );
278278 TRACET (" {} ..." , c.trans , laddr);
279279 return btree.lower_bound (
280280 c, laddr
281- ).si_then ([FNAME, c, laddr](auto iter) -> _get_mapping_ret {
281+ ).si_then ([FNAME, c, laddr](auto iter) -> _get_cursor_ret {
282282 if (iter.is_end () || iter.get_key () != laddr) {
283283 ERRORT (" {} doesn't exist" , c.trans , laddr);
284284 return crimson::ct_error::enoent::make ();
285285 }
286286 TRACET (" {} got value {}" , c.trans , laddr, iter.get_val ());
287- auto e = iter.get_pin (c);
288- return _get_mapping_ret (
287+ return _get_cursor_ret (
289288 interruptible::ready_future_marker{},
290- std::move (e ));
289+ iter. get_cursor (c ));
291290 });
292291}
293292
0 commit comments