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