summaryrefslogtreecommitdiff
path: root/storage/tokudb/ft-index/ft/leafentry.h
diff options
context:
space:
mode:
Diffstat (limited to 'storage/tokudb/ft-index/ft/leafentry.h')
-rw-r--r--storage/tokudb/ft-index/ft/leafentry.h87
1 files changed, 39 insertions, 48 deletions
diff --git a/storage/tokudb/ft-index/ft/leafentry.h b/storage/tokudb/ft-index/ft/leafentry.h
index 5ed97dad9b5..ecaa8d77e9b 100644
--- a/storage/tokudb/ft-index/ft/leafentry.h
+++ b/storage/tokudb/ft-index/ft/leafentry.h
@@ -54,6 +54,7 @@ UNIVERSITY PATENT NOTICE:
PATENT MARKING NOTICE:
This software is covered by US Patent No. 8,185,551.
+ This software is covered by US Patent No. 8,489,638.
PATENT RIGHTS GRANT:
@@ -132,18 +133,17 @@ PATENT RIGHTS GRANT:
enum { LE_CLEAN = 0, LE_MVCC = 1 };
// This is an on-disk format. static_asserts verify everything is packed and aligned correctly.
-struct __attribute__ ((__packed__)) leafentry {
+struct leafentry {
struct leafentry_clean {
uint32_t vallen;
- uint8_t key_val[0]; //Actual key, then actual val
+ uint8_t val[0]; //actual val
}; // For the case where LEAFENTRY->type is LE_CLEAN
static_assert(4 == sizeof(leafentry::leafentry_clean), "leafentry_clean size is wrong");
- static_assert(4 == __builtin_offsetof(leafentry::leafentry_clean, key_val), "key_val is in the wrong place");
+ static_assert(4 == __builtin_offsetof(leafentry::leafentry_clean, val), "val is in the wrong place");
struct __attribute__ ((__packed__)) leafentry_mvcc {
uint32_t num_cxrs; // number of committed transaction records
uint8_t num_pxrs; // number of provisional transaction records
- uint8_t key_xrs[0]; //Actual key,
- //then TXNIDs of XRs relevant for reads:
+ uint8_t xrs[0]; //then TXNIDs of XRs relevant for reads:
// if provisional XRs exist, store OUTERMOST TXNID
// store committed TXNIDs, from most recently committed to least recently committed (newest first)
//then lengths of XRs relevant for reads (length is at most 1<<31, MSB is 1 for insert, 0 for delete):
@@ -167,37 +167,33 @@ struct __attribute__ ((__packed__)) leafentry {
// (innermost data and length with insert/delete flag are stored above, cannot be a placeholder)
}; // For the case where LEAFENTRY->type is LE_MVCC
static_assert(5 == sizeof(leafentry::leafentry_mvcc), "leafentry_mvcc size is wrong");
- static_assert(5 == __builtin_offsetof(leafentry::leafentry_mvcc, key_xrs), "key_xrs is in the wrong place");
+ static_assert(5 == __builtin_offsetof(leafentry::leafentry_mvcc, xrs), "xrs is in the wrong place");
uint8_t type; // type is LE_CLEAN or LE_MVCC
- uint32_t keylen;
+ //uint32_t keylen;
union __attribute__ ((__packed__)) {
struct leafentry_clean clean;
struct leafentry_mvcc mvcc;
} u;
};
-static_assert(10 == sizeof(leafentry), "leafentry size is wrong");
-static_assert(5 == __builtin_offsetof(leafentry, u), "union is in the wrong place");
+static_assert(6 == sizeof(leafentry), "leafentry size is wrong");
+static_assert(1 == __builtin_offsetof(leafentry, u), "union is in the wrong place");
-#define LE_CLEAN_MEMSIZE(_keylen, _vallen) \
+#define LE_CLEAN_MEMSIZE(_vallen) \
(sizeof(((LEAFENTRY)NULL)->type) /* type */ \
- +sizeof(((LEAFENTRY)NULL)->keylen) /* keylen */ \
+sizeof(((LEAFENTRY)NULL)->u.clean.vallen) /* vallen */ \
- +(_keylen) /* actual key */ \
+(_vallen)) /* actual val */
#define LE_MVCC_COMMITTED_HEADER_MEMSIZE \
(sizeof(((LEAFENTRY)NULL)->type) /* type */ \
- +sizeof(((LEAFENTRY)NULL)->keylen) /* keylen */ \
+sizeof(((LEAFENTRY)NULL)->u.mvcc.num_cxrs) /* committed */ \
+sizeof(((LEAFENTRY)NULL)->u.mvcc.num_pxrs) /* provisional */ \
+sizeof(TXNID) /* transaction */ \
+sizeof(uint32_t) /* length+bit */ \
+sizeof(uint32_t)) /* length+bit */
-#define LE_MVCC_COMMITTED_MEMSIZE(_keylen, _vallen) \
+#define LE_MVCC_COMMITTED_MEMSIZE(_vallen) \
(LE_MVCC_COMMITTED_HEADER_MEMSIZE \
- +(_keylen) /* actual key */ \
+(_vallen)) /* actual val */
@@ -208,25 +204,20 @@ typedef struct leafentry_13 *LEAFENTRY_13;
// TODO: consistency among names is very poor.
//
+// TODO: rename this helper function for deserialization
+size_t leafentry_rest_memsize(uint32_t num_puxrs, uint32_t num_cuxrs, uint8_t* start);
size_t leafentry_memsize (LEAFENTRY le); // the size of a leafentry in memory.
size_t leafentry_disksize (LEAFENTRY le); // this is the same as logsizeof_LEAFENTRY. The size of a leafentry on disk.
-void wbuf_LEAFENTRY(struct wbuf *w, LEAFENTRY le);
void wbuf_nocrc_LEAFENTRY(struct wbuf *w, LEAFENTRY le);
-int print_leafentry (FILE *outf, LEAFENTRY v); // Print a leafentry out in human-readable form.
+int print_klpair (FILE *outf, const void* key, uint32_t keylen, LEAFENTRY v); // Print a leafentry out in human-readable form.
int le_latest_is_del(LEAFENTRY le); // Return true if it is a provisional delete.
bool le_is_clean(LEAFENTRY le); //Return how many xids exist (0 does not count)
bool le_has_xids(LEAFENTRY le, XIDS xids); // Return true transaction represented by xids is still provisional in this leafentry (le's xid stack is a superset or equal to xids)
-uint32_t le_latest_keylen (LEAFENTRY le); // Return the latest keylen.
void* le_latest_val (LEAFENTRY le); // Return the latest val (return NULL for provisional deletes)
uint32_t le_latest_vallen (LEAFENTRY le); // Return the latest vallen. Returns 0 for provisional deletes.
void* le_latest_val_and_len (LEAFENTRY le, uint32_t *len);
- // Return any key or value (even if it's only provisional).
-void* le_key (LEAFENTRY le);
-uint32_t le_keylen (LEAFENTRY le);
-void* le_key_and_len (LEAFENTRY le, uint32_t *len);
-
uint64_t le_outermost_uncommitted_xid (LEAFENTRY le);
//Callback contract:
@@ -246,35 +237,35 @@ leafentry_disksize_13(LEAFENTRY_13 le);
int
toku_le_upgrade_13_14(LEAFENTRY_13 old_leafentry, // NULL if there was no stored data.
+ void** keyp,
+ uint32_t* keylen,
size_t *new_leafentry_memorysize,
- LEAFENTRY *new_leafentry_p,
- OMT *omtp,
- struct mempool *mp);
-
-void toku_le_apply_msg(FT_MSG msg,
- LEAFENTRY old_leafentry, // NULL if there was no stored data.
- TXNID oldest_referenced_xid,
- GC_INFO gc_info,
- size_t *new_leafentry_memorysize,
- LEAFENTRY *new_leafentry_p,
- OMT *omtp,
- struct mempool *mp,
- void **maybe_free,
- int64_t * numbytes_delta_p);
+ LEAFENTRY *new_leafentry_p);
+
+void
+toku_le_apply_msg(FT_MSG msg,
+ LEAFENTRY old_leafentry, // NULL if there was no stored data.
+ bn_data* data_buffer, // bn_data storing leafentry, if NULL, means there is no bn_data
+ uint32_t idx, // index in data_buffer where leafentry is stored (and should be replaced
+ TXNID oldest_referenced_xid,
+ GC_INFO gc_info,
+ LEAFENTRY *new_leafentry_p,
+ int64_t * numbytes_delta_p);
bool toku_le_worth_running_garbage_collection(LEAFENTRY le, TXNID oldest_referenced_xid_known);
-void toku_le_garbage_collect(LEAFENTRY old_leaf_entry,
- LEAFENTRY *new_leaf_entry,
- size_t *new_leaf_entry_memory_size,
- OMT *omtp,
- struct mempool *mp,
- void **maybe_free,
- const xid_omt_t &snapshot_xids,
- const rx_omt_t &referenced_xids,
- const xid_omt_t &live_root_txns,
- TXNID oldest_referenced_xid_known,
- int64_t * numbytes_delta_p);
+void
+toku_le_garbage_collect(LEAFENTRY old_leaf_entry,
+ bn_data* data_buffer,
+ uint32_t idx,
+ void* keyp,
+ uint32_t keylen,
+ LEAFENTRY *new_leaf_entry,
+ const xid_omt_t &snapshot_xids,
+ const rx_omt_t &referenced_xids,
+ const xid_omt_t &live_root_txns,
+ TXNID oldest_referenced_xid_known,
+ int64_t * numbytes_delta_p);
#endif /* TOKU_LEAFENTRY_H */