Motr  M0
btree.h
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 #pragma once
23 #ifndef __MOTR_BE_BTREE_H__
24 #define __MOTR_BE_BTREE_H__
25 
26 #include "be/op.h" /* m0_be_op */
27 #include "be/seg.h"
28 #include "be/seg_xc.h"
29 #include "format/format.h" /* m0_format_header */
30 #include "format/format_xc.h"
31 #include "lib/buf.h"
32 #include "lib/cookie.h" /* m0_cookie */
33 #include "lib/cookie_xc.h" /* m0_xcode_type */
34 #include "fid/fid.h" /* m0_fid */
35 #include "fid/fid_xc.h" /* m0_fid_xc */
36 
43 /* export */
44 struct m0_be_btree;
45 struct m0_be_btree_kv_ops;
46 
47 /* import */
48 struct m0_be_bnode;
49 struct m0_be_tx;
50 struct m0_be_tx_credit;
51 
54  uint64_t bli_type;
55  uint64_t bli_gen;
56  struct m0_fid bli_fid;
57 } M0_XCA_RECORD M0_XCA_DOMAIN(be);
58 
60 struct m0_be_btree {
61  /*
62  * non-volatile fields
63  */
65  uint64_t bb_cookie_gen;
70  /*
71  * volatile-only fields
72  */
76  struct m0_be_seg *bb_seg;
78  const struct m0_be_btree_kv_ops *bb_ops;
79 } M0_XCA_RECORD M0_XCA_DOMAIN(be);
80 
83 
84  /* future versions, uncomment and update M0_BE_BTREE_FORMAT_VERSION */
85  /*M0_BE_BTREE_FORMAT_VERSION_2,*/
86  /*M0_BE_BTREE_FORMAT_VERSION_3,*/
87 
90 };
91 
92 struct m0_table;
93 struct m0_table_ops;
94 
97  uint64_t ko_type;
99  m0_bcount_t (*ko_ksize)(const void *key);
100 
103  m0_bcount_t (*ko_vsize)(const void *data);
104 
113  int (*ko_compare)(const void *key0, const void *key1);
114 };
115 
132 } M0_XCA_ENUM;
133 
151 };
152 
154 M0_EXTERN const struct m0_fid_type m0_btree_fid_type;
155 
156 
157 /* ------------------------------------------------------------------
158  * Btree construction
159  * ------------------------------------------------------------------ */
160 
166 M0_INTERNAL void m0_be_btree_init(struct m0_be_btree *tree,
167  struct m0_be_seg *seg,
168  const struct m0_be_btree_kv_ops *ops);
169 
177 M0_INTERNAL void m0_be_btree_fini(struct m0_be_btree *tree);
178 
201 M0_INTERNAL void m0_be_btree_create(struct m0_be_btree *tree,
202  struct m0_be_tx *tx,
203  struct m0_be_op *op,
204  const struct m0_fid *btree_fid);
205 
207 M0_INTERNAL void m0_be_btree_destroy(struct m0_be_btree *tree,
208  struct m0_be_tx *tx,
209  struct m0_be_op *op);
210 
220 M0_INTERNAL void m0_be_btree_truncate(struct m0_be_btree *tree,
221  struct m0_be_tx *tx,
222  struct m0_be_op *op,
223  m0_bcount_t limit);
224 
225 
226 /* ------------------------------------------------------------------
227  * Btree credits
228  * ------------------------------------------------------------------ */
229 
234 M0_INTERNAL void m0_be_btree_create_credit(const struct m0_be_btree *tree,
235  m0_bcount_t nr,
236  struct m0_be_tx_credit *accum);
237 
242 M0_INTERNAL void m0_be_btree_destroy_credit(struct m0_be_btree *tree,
243  struct m0_be_tx_credit *accum);
244 
245 
258 M0_INTERNAL void m0_be_btree_clear_credit(struct m0_be_btree *tree,
259  struct m0_be_tx_credit *fixed_part,
260  struct m0_be_tx_credit *single_record,
261  m0_bcount_t *records_nr);
262 
272 M0_INTERNAL void m0_be_btree_insert_credit(const struct m0_be_btree *tree,
273  m0_bcount_t nr,
274  m0_bcount_t ksize,
275  m0_bcount_t vsize,
276  struct m0_be_tx_credit *accum);
277 
287 M0_INTERNAL void m0_be_btree_insert_credit2(const struct m0_be_btree *tree,
288  m0_bcount_t nr,
289  m0_bcount_t ksize,
290  m0_bcount_t vsize,
291  struct m0_be_tx_credit *accum);
292 
302 M0_INTERNAL void m0_be_btree_delete_credit(const struct m0_be_btree *tree,
303  m0_bcount_t nr,
304  m0_bcount_t ksize,
305  m0_bcount_t vsize,
306  struct m0_be_tx_credit *accum);
307 
318 M0_INTERNAL void m0_be_btree_update_credit(const struct m0_be_btree *tree,
319  m0_bcount_t nr,
320  m0_bcount_t vsize,
321  struct m0_be_tx_credit *accum);
322 
331 M0_INTERNAL void m0_be_btree_update_credit2(const struct m0_be_btree *tree,
332  m0_bcount_t nr,
333  m0_bcount_t ksize,
334  m0_bcount_t vsize,
335  struct m0_be_tx_credit *accum);
336 
337 
338 /* ------------------------------------------------------------------
339  * Btree manipulation
340  * ------------------------------------------------------------------ */
341 
350 M0_INTERNAL void m0_be_btree_insert(struct m0_be_btree *tree,
351  struct m0_be_tx *tx,
352  struct m0_be_op *op,
353  const struct m0_buf *key,
354  const struct m0_buf *value);
355 
375 M0_INTERNAL void m0_be_btree_save(struct m0_be_btree *tree,
376  struct m0_be_tx *tx,
377  struct m0_be_op *op,
378  const struct m0_buf *key,
379  const struct m0_buf *val,
380  bool overwrite);
381 
389 M0_INTERNAL void m0_be_btree_update(struct m0_be_btree *tree,
390  struct m0_be_tx *tx,
391  struct m0_be_op *op,
392  const struct m0_buf *key,
393  const struct m0_buf *value);
394 
402 M0_INTERNAL void m0_be_btree_delete(struct m0_be_btree *tree,
403  struct m0_be_tx *tx,
404  struct m0_be_op *op,
405  const struct m0_buf *key);
406 
415 M0_INTERNAL void m0_be_btree_lookup(struct m0_be_btree *tree,
416  struct m0_be_op *op,
417  const struct m0_buf *key,
418  struct m0_buf *dest_value);
419 
428 M0_INTERNAL void m0_be_btree_lookup_slant(struct m0_be_btree *tree,
429  struct m0_be_op *op,
430  struct m0_buf *key,
431  struct m0_buf *value);
432 
438 M0_INTERNAL void m0_be_btree_maxkey(struct m0_be_btree *tree,
439  struct m0_be_op *op,
440  struct m0_buf *out);
441 
447 M0_INTERNAL void m0_be_btree_minkey(struct m0_be_btree *tree,
448  struct m0_be_op *op,
449  struct m0_buf *out);
450 
451 /* ------------------------------------------------------------------
452  * Btree in-place manipulation
453  * ------------------------------------------------------------------ */
454 
469  struct m0_buf ba_value;
470 
472  bool ba_write;
473 };
474 
500 M0_INTERNAL void m0_be_btree_update_inplace(struct m0_be_btree *tree,
501  struct m0_be_tx *tx,
502  struct m0_be_op *op,
503  const struct m0_buf *key,
504  struct m0_be_btree_anchor *anchor);
505 
513 M0_INTERNAL void m0_be_btree_insert_inplace(struct m0_be_btree *tree,
514  struct m0_be_tx *tx,
515  struct m0_be_op *op,
516  const struct m0_buf *key,
517  struct m0_be_btree_anchor *anchor,
518  uint64_t zonemask);
519 
530 M0_INTERNAL void m0_be_btree_save_inplace(struct m0_be_btree *tree,
531  struct m0_be_tx *tx,
532  struct m0_be_op *op,
533  const struct m0_buf *key,
534  struct m0_be_btree_anchor *anchor,
535  bool overwrite,
536  uint64_t zonemask);
537 
545 M0_INTERNAL void m0_be_btree_lookup_inplace(struct m0_be_btree *tree,
546  struct m0_be_op *op,
547  const struct m0_buf *key,
548  struct m0_be_btree_anchor *anchor);
549 
554 M0_INTERNAL void m0_be_btree_release(struct m0_be_tx *tx,
555  struct m0_be_btree_anchor *anchor);
556 
557 /* ------------------------------------------------------------------
558  * Btree cursor
559  * ------------------------------------------------------------------ */
560 
567  int bs_idx;
569 };
570 
572 enum {
575 };
576 
584  int bc_pos;
589  struct m0_be_op bc_op; /* XXX DELETEME */
590 };
591 
597 M0_INTERNAL void m0_be_btree_cursor_init(struct m0_be_btree_cursor *it,
598  struct m0_be_btree *tree);
599 
605 M0_INTERNAL void m0_be_btree_cursor_fini(struct m0_be_btree_cursor *it);
606 
627 M0_INTERNAL void m0_be_btree_cursor_get(struct m0_be_btree_cursor *it,
628  const struct m0_buf *key, bool slant);
629 
631 M0_INTERNAL int m0_be_btree_cursor_get_sync(struct m0_be_btree_cursor *it,
632  const struct m0_buf *key,
633  bool slant);
634 
643 M0_INTERNAL void m0_be_btree_cursor_next(struct m0_be_btree_cursor *it);
644 
646 M0_INTERNAL int m0_be_btree_cursor_next_sync(struct m0_be_btree_cursor *it);
647 
654 M0_INTERNAL void m0_be_btree_cursor_prev(struct m0_be_btree_cursor *it);
655 
657 M0_INTERNAL int m0_be_btree_cursor_prev_sync(struct m0_be_btree_cursor *it);
658 
664 M0_INTERNAL int m0_be_btree_cursor_first_sync(struct m0_be_btree_cursor *it);
665 
671 M0_INTERNAL int m0_be_btree_cursor_last_sync(struct m0_be_btree_cursor *it);
672 
678 M0_INTERNAL void m0_be_btree_cursor_put(struct m0_be_btree_cursor *it);
679 
688 M0_INTERNAL void m0_be_btree_cursor_kv_get(struct m0_be_btree_cursor *it,
689  struct m0_buf *key,
690  struct m0_buf *val);
691 
695 M0_INTERNAL bool m0_be_btree_is_empty(struct m0_be_btree *tree);
696 
698 #endif /* __MOTR_BE_BTREE_H__ */
699 
700 /*
701  * Local variables:
702  * c-indentation-style: "K&R"
703  * c-basic-offset: 8
704  * tab-width: 8
705  * fill-column: 80
706  * scroll-step: 1
707  * End:
708  */
709 /*
710  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
711  */
struct m0_be_btree_cursor_stack_entry bc_stack[BTREE_HEIGHT_MAX]
Definition: btree.h:588
struct m0_format_footer bb_footer
Definition: btree.h:69
M0_INTERNAL void m0_be_btree_insert_inplace(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, struct m0_be_btree_anchor *anchor, uint64_t zonemask)
Definition: btree.c:2126
M0_INTERNAL void m0_be_btree_cursor_next(struct m0_be_btree_cursor *cur)
Definition: btree.c:2358
static size_t nr
Definition: dump.c:1505
M0_INTERNAL void m0_be_btree_delete_credit(const struct m0_be_btree *tree, m0_bcount_t nr, m0_bcount_t ksize, m0_bcount_t vsize, struct m0_be_tx_credit *accum)
Definition: btree.c:1740
Definition: btree.h:566
uint64_t ko_type
Definition: btree.h:97
m0_be_btree_op
Definition: btree.h:139
Definition: idx_mock.c:52
m0_bcount_t(* ko_ksize)(const void *key)
Definition: btree.h:99
M0_INTERNAL void m0_be_btree_clear_credit(struct m0_be_btree *tree, struct m0_be_tx_credit *fixed_part, struct m0_be_tx_credit *single_record, m0_bcount_t *records_nr)
Definition: btree.c:1862
struct m0_be_bnode * bb_root
Definition: btree.h:68
M0_INTERNAL void m0_be_btree_lookup(struct m0_be_btree *tree, struct m0_be_op *op, const struct m0_buf *key, struct m0_buf *value)
Definition: btree.c:2033
struct m0_be_btree * ba_tree
Definition: btree.h:464
M0_INTERNAL void m0_be_btree_save_inplace(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, struct m0_be_btree_anchor *anchor, bool overwrite, uint64_t zonemask)
Definition: btree.c:2136
struct m0_be_bnode * bs_node
Definition: btree.h:568
struct m0_be_seg * bb_seg
Definition: btree.h:76
m0_be_btree_type
Definition: btree.h:117
struct m0_bufvec data
Definition: di.c:40
int const char const void * value
Definition: dir.c:325
static struct m0_be_emap_cursor it
Definition: extmap.c:46
M0_INTERNAL void m0_be_btree_maxkey(struct m0_be_btree *tree, struct m0_be_op *op, struct m0_buf *out)
Definition: btree.c:2049
M0_INTERNAL bool m0_be_btree_is_empty(struct m0_be_btree *tree)
Definition: btree.c:2499
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL void m0_be_btree_create(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_fid *btree_fid)
Definition: btree.c:1512
M0_INTERNAL void m0_be_btree_destroy_credit(struct m0_be_btree *tree, struct m0_be_tx_credit *accum)
Definition: btree.c:1831
int(* ko_compare)(const void *key0, const void *key1)
Definition: btree.h:113
struct m0_be_btree_backlink bb_backlink
Definition: btree.h:66
M0_INTERNAL void m0_be_btree_cursor_put(struct m0_be_btree_cursor *cursor)
Definition: btree.c:2480
M0_INTERNAL void m0_be_btree_delete(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key)
Definition: btree.c:1958
M0_INTERNAL void m0_be_btree_cursor_fini(struct m0_be_btree_cursor *cursor)
Definition: btree.c:2290
enum m0_be_btree_format_version M0_XCA_DOMAIN
op
Definition: libdemo.c:64
M0_INTERNAL int m0_be_btree_cursor_next_sync(struct m0_be_btree_cursor *cur)
Definition: btree.c:2464
Definition: buf.h:37
struct m0_be_bnode * bc_node
Definition: btree.h:587
m0_be_btree_format_version
Definition: btree.h:81
M0_INTERNAL void m0_be_btree_update_credit(const struct m0_be_btree *tree, m0_bcount_t nr, m0_bcount_t vsize, struct m0_be_tx_credit *accum)
Definition: btree.c:1750
M0_INTERNAL void m0_be_btree_insert_credit2(const struct m0_be_btree *tree, m0_bcount_t nr, m0_bcount_t ksize, m0_bcount_t vsize, struct m0_be_tx_credit *accum)
Definition: btree.c:1730
static int key
Definition: locality.c:283
M0_INTERNAL void m0_be_btree_create_credit(const struct m0_be_btree *tree, m0_bcount_t nr, struct m0_be_tx_credit *accum)
Definition: btree.c:1783
M0_INTERNAL void m0_be_btree_insert(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, const struct m0_buf *val)
Definition: btree.c:1932
M0_INTERNAL void m0_be_btree_save(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, const struct m0_buf *val, bool overwrite)
Definition: btree.c:1912
M0_INTERNAL void m0_be_btree_lookup_inplace(struct m0_be_btree *tree, struct m0_be_op *op, const struct m0_buf *key, struct m0_be_btree_anchor *anchor)
Definition: btree.c:2152
M0_INTERNAL void m0_be_btree_insert_credit(const struct m0_be_btree *tree, m0_bcount_t nr, m0_bcount_t ksize, m0_bcount_t vsize, struct m0_be_tx_credit *accum)
Definition: btree.c:1720
M0_INTERNAL void m0_be_btree_update_inplace(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, struct m0_be_btree_anchor *anchor)
Definition: btree.c:2095
M0_INTERNAL void m0_be_btree_destroy(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op)
Definition: btree.c:1538
M0_INTERNAL void m0_be_btree_release(struct m0_be_tx *tx, struct m0_be_btree_anchor *anchor)
Definition: btree.c:2180
M0_EXTERN const struct m0_fid_type m0_btree_fid_type
Definition: btree.h:154
static int key0
Definition: locality.c:282
M0_INTERNAL int m0_be_btree_cursor_prev_sync(struct m0_be_btree_cursor *cur)
Definition: btree.c:2472
M0_INTERNAL void m0_be_btree_fini(struct m0_be_btree *tree)
Definition: btree.c:1503
m0_bcount_t(* ko_vsize)(const void *data)
Definition: btree.h:103
M0_INTERNAL void m0_be_btree_minkey(struct m0_be_btree *tree, struct m0_be_op *op, struct m0_buf *out)
Definition: btree.c:2070
M0_INTERNAL void m0_be_btree_update_credit2(const struct m0_be_btree *tree, m0_bcount_t nr, m0_bcount_t ksize, m0_bcount_t vsize, struct m0_be_tx_credit *accum)
Definition: btree.c:1772
M0_INTERNAL int m0_be_btree_cursor_first_sync(struct m0_be_btree_cursor *cur)
Definition: btree.c:2348
Definition: seg.h:66
M0_INTERNAL void m0_be_btree_cursor_kv_get(struct m0_be_btree_cursor *cur, struct m0_buf *key, struct m0_buf *val)
Definition: btree.c:2485
M0_INTERNAL void m0_be_btree_update(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, const struct m0_buf *key, const struct m0_buf *val)
Definition: btree.c:1941
struct m0_be_btree * bc_tree
Definition: btree.h:586
M0_INTERNAL void m0_be_btree_lookup_slant(struct m0_be_btree *tree, struct m0_be_op *op, struct m0_buf *key, struct m0_buf *value)
Definition: btree.c:2041
Definition: fid.h:38
enum m0_be_btree_type M0_XCA_ENUM
struct m0_buf ba_value
Definition: btree.h:469
int bs_idx
Definition: btree.h:567
M0_INTERNAL void m0_be_btree_cursor_get(struct m0_be_btree_cursor *cur, const struct m0_buf *key, bool slant)
Definition: btree.c:2295
struct m0_be_rwlock bb_lock
Definition: btree.h:74
M0_INTERNAL void m0_be_btree_cursor_prev(struct m0_be_btree_cursor *cur)
Definition: btree.c:2411
struct m0_format_header bb_header
Definition: btree.h:64
struct m0_be_op bc_op
Definition: btree.h:589
M0_INTERNAL void m0_be_btree_init(struct m0_be_btree *tree, struct m0_be_seg *seg, const struct m0_be_btree_kv_ops *ops)
Definition: btree.c:1487
M0_INTERNAL void m0_be_btree_cursor_init(struct m0_be_btree_cursor *cur, struct m0_be_btree *btree)
Definition: btree.c:2281
static struct m0_be_seg * seg
Definition: btree.c:40
M0_INTERNAL int m0_be_btree_cursor_get_sync(struct m0_be_btree_cursor *cur, const struct m0_buf *key, bool slant)
Definition: btree.c:2331
#define out(...)
Definition: gen.c:41
struct m0_fom_ops ops
Definition: io_foms.c:623
Definition: op.h:74
M0_INTERNAL int m0_be_btree_cursor_last_sync(struct m0_be_btree_cursor *cur)
Definition: btree.c:2353
uint64_t bb_cookie_gen
Definition: btree.h:65
M0_INTERNAL void m0_be_btree_truncate(struct m0_be_btree *tree, struct m0_be_tx *tx, struct m0_be_op *op, m0_bcount_t limit)
Definition: btree.c:1564
static struct m0_be_ut_backend be
Definition: service_ut.c:59
const struct m0_be_btree_kv_ops * bb_ops
Definition: btree.h:78
Definition: tx.h:280
Definition: idx_mock.c:47