Line data Source code
1 : /* fd_sysvar_cache_db.c contains database interactions between the 2 : sysvar cache and the account database. */ 3 : 4 : #include "../fd_bank.h" 5 : #include "fd_sysvar_cache_private.h" 6 : 7 : static int 8 : sysvar_data_fill( fd_sysvar_cache_t * cache, 9 : fd_accdb_t * accdb, 10 : fd_accdb_fork_id_t fork, 11 : ulong idx, 12 74088 : int log_fails ) { 13 74088 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ]; 14 74088 : fd_pubkey_t const * key = &fd_sysvar_key_tbl[ idx ]; 15 74088 : fd_sysvar_desc_t * desc = &cache->desc [ idx ]; 16 : 17 : /* Read account from database */ 18 74088 : fd_acc_t acc = fd_accdb_read_one( accdb, fork, key->uc ); 19 74088 : if( FD_UNLIKELY( !acc.lamports ) ) { 20 12054 : if( log_fails ) FD_LOG_DEBUG(( "Sysvar %s not found", pos->name )); 21 12054 : fd_accdb_unread_one( accdb, &acc ); 22 12054 : return 0; 23 12054 : } 24 : 25 : /* Fill data cache acc */ 26 62034 : ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max ); 27 62034 : uchar * data = (uchar *)cache+pos->data_off; 28 62034 : fd_memcpy( data, acc.data, data_sz ); 29 62034 : desc->data_sz = (uint)data_sz; 30 62034 : fd_accdb_unread_one( accdb, &acc ); 31 : 32 : /* Recover object cache acc from data cache acc */ 33 62034 : return fd_sysvar_obj_restore( cache, desc, pos ); 34 74088 : } 35 : 36 : static int 37 : fd_sysvar_cache_restore1( fd_bank_t * bank, 38 : fd_accdb_t * accdb, 39 8232 : int log_fails ) { 40 8232 : fd_sysvar_cache_t * cache = fd_sysvar_cache_join( fd_sysvar_cache_new( 41 8232 : &bank->f.sysvar_cache ) ); 42 : 43 8232 : int saw_err = 0; 44 82320 : for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) { 45 74088 : int err = sysvar_data_fill( cache, accdb, bank->accdb_fork_id, i, log_fails ); 46 74088 : if( err ) saw_err = 1; 47 74088 : } 48 : 49 8232 : fd_sysvar_cache_leave( cache ); 50 : 51 8232 : return !saw_err; 52 8232 : } 53 : 54 : int 55 : fd_sysvar_cache_restore( fd_bank_t * bank, 56 8232 : fd_accdb_t * accdb ) { 57 8232 : return fd_sysvar_cache_restore1( bank, accdb, 1 ); 58 8232 : } 59 : 60 : void 61 : fd_sysvar_cache_restore_fuzz( fd_bank_t * bank, 62 0 : fd_accdb_t * accdb ) { 63 0 : (void)fd_sysvar_cache_restore1( bank, accdb, 0 ); 64 0 : } 65 : 66 : void 67 : fd_sysvar_cache_restore_one( fd_sysvar_cache_t * cache, 68 : fd_pubkey_t const * pubkey, 69 : ulong lamports, 70 : uchar const * acc_data, 71 0 : ulong acc_data_len ) { 72 0 : ulong idx; 73 0 : for( idx=0UL; idx<FD_SYSVAR_CACHE_ENTRY_CNT; idx++ ) { 74 0 : if( 0==memcmp( pubkey, fd_sysvar_key_tbl[ idx ].uc, sizeof(fd_pubkey_t) ) ) break; 75 0 : } 76 0 : if( FD_UNLIKELY( idx==FD_SYSVAR_CACHE_ENTRY_CNT ) ) return; 77 0 : if( FD_UNLIKELY( !lamports ) ) return; 78 : 79 0 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ]; 80 0 : fd_sysvar_desc_t * desc = &cache->desc [ idx ]; 81 : 82 0 : ulong data_sz = fd_ulong_min( acc_data_len, pos->data_max ); 83 0 : uchar * data = (uchar *)cache+pos->data_off; 84 0 : fd_memcpy( data, acc_data, data_sz ); 85 0 : desc->data_sz = (uint)data_sz; 86 : 87 : /* Recover object cache acc from data cache acc */ 88 0 : fd_sysvar_obj_restore( cache, desc, pos ); 89 0 : }