Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h 2 : #define HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h 3 : 4 : #include "fd_accdb_base.h" 5 : #include "fd_accdb_user.h" 6 : #include "../../funk/fd_funk_base.h" 7 : 8 : /* fd_accdb_admin_vt_t specifies the interface (vtable) for the account 9 : DB admin. */ 10 : 11 : struct fd_accdb_admin_vt { 12 : 13 : void 14 : (* fini)( fd_accdb_admin_t * accdb ); 15 : 16 : fd_funk_txn_xid_t 17 : (* root_get)( fd_accdb_admin_t const * admin ); 18 : 19 : void 20 : (* attach_child)( fd_accdb_admin_t * admin, 21 : fd_funk_txn_xid_t const * xid_parent, 22 : fd_funk_txn_xid_t const * xid_new ); 23 : 24 : void 25 : (* advance_root)( fd_accdb_admin_t * admin, 26 : fd_funk_txn_xid_t const * xid ); 27 : 28 : void 29 : (* cancel)( fd_accdb_admin_t * admin, 30 : fd_funk_txn_xid_t const * xid ); 31 : 32 : }; 33 : 34 : typedef struct fd_accdb_admin_vt fd_accdb_admin_vt_t; 35 : 36 : struct fd_accdb_admin_base { 37 : fd_accdb_admin_vt_t const * vt; 38 : uint accdb_type; 39 : 40 : ulong rw_active; 41 : ulong ro_active; 42 : ulong created_cnt; 43 : ulong root_cnt; /* moved to database root */ 44 : ulong root_tot_sz; /* number of bytes moved while rooting */ 45 : ulong reclaim_cnt; /* 0 lamport account removed while rooting */ 46 : ulong gc_root_cnt; /* stale rooted revisions removed while rooting */ 47 : ulong revert_cnt; /* abandoned by consensus */ 48 : 49 : /* cumulative tickcount spent on various admin operations */ 50 : long dt_vinyl; /* waiting on vinyl completinos */ 51 : long dt_copy; /* copying account data */ 52 : long dt_gc; /* garbage collecting data */ 53 : }; 54 : 55 : typedef struct fd_accdb_admin_base fd_accdb_admin_base_t; 56 : 57 : struct fd_accdb_admin { 58 : fd_accdb_admin_base_t base; 59 : 60 : uchar impl[ FD_ACCDB_IMPL_FOOTPRINT ] __attribute__((aligned(64))); 61 : }; 62 : 63 : extern int fd_accdb_log_enabled; 64 : 65 : FD_PROTOTYPES_BEGIN 66 : 67 : static inline void 68 90 : fd_accdb_admin_fini( fd_accdb_admin_t * accdb ) { 69 90 : accdb->base.vt->fini( accdb ); 70 90 : } 71 : 72 : /* Transaction-level operations ***************************************/ 73 : 74 : static inline fd_funk_txn_xid_t 75 24 : fd_accdb_root_get( fd_accdb_admin_t const * admin ) { 76 24 : return admin->base.vt->root_get( admin ); 77 24 : } 78 : 79 : /* FIXME rename these to? 80 : - fd_accdb_fork_create 81 : - fd_accdb_fork_freeze 82 : - fd_accdb_fork_commit_root 83 : - fd_accdb_fork_cancel */ 84 : 85 : /* fd_accdb_attach_child creates a new account database fork node off a 86 : frozen parent or the root. 87 : 88 : It is assumed that less than txn_max non-root transaction exist when 89 : this is called. */ 90 : 91 : static inline void 92 : fd_accdb_attach_child( fd_accdb_admin_t * admin, 93 : fd_funk_txn_xid_t const * xid_parent, 94 571926 : fd_funk_txn_xid_t const * xid_new ) { 95 571926 : admin->base.vt->attach_child( admin, xid_parent, xid_new ); 96 571926 : } 97 : 98 : /* fd_accdb_advance_root merges the given fork node into the database 99 : root. */ 100 : 101 : static inline void 102 : fd_accdb_advance_root( fd_accdb_admin_t * admin, 103 224709 : fd_funk_txn_xid_t const * xid ) { 104 224709 : admin->base.vt->advance_root( admin, xid ); 105 224709 : } 106 : 107 : /* fd_accdb_cancel removes a fork node by XID and its children 108 : (recursively). */ 109 : 110 : static inline void 111 : fd_accdb_cancel( fd_accdb_admin_t * admin, 112 66 : fd_funk_txn_xid_t const * xid ) { 113 66 : admin->base.vt->cancel( admin, xid ); 114 66 : } 115 : 116 : FD_PROTOTYPES_END 117 : 118 : #endif /* HEADER_fd_src_flamenco_accdb_fd_accdb_admin_h */