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 80495 : int log_fails ) { 13 80495 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ]; 14 80495 : fd_pubkey_t const * key = &fd_sysvar_key_tbl[ idx ]; 15 80495 : fd_sysvar_desc_t * desc = &cache->desc [ idx ]; 16 : 17 : /* Read account from database */ 18 80495 : fd_acc_t acc = fd_accdb_read_one( accdb, fork, key->uc ); 19 80495 : if( FD_UNLIKELY( !acc.lamports ) ) { 20 11363 : if( log_fails ) FD_LOG_DEBUG(( "Sysvar %s not found", pos->name )); 21 11363 : fd_accdb_unread_one( accdb, &acc ); 22 11363 : return 0; 23 11363 : } 24 : 25 : /* Fill data cache acc */ 26 69132 : ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max ); 27 69132 : uchar * data = (uchar *)cache+pos->data_off; 28 69132 : fd_memcpy( data, acc.data, data_sz ); 29 69132 : desc->data_sz = (uint)data_sz; 30 69132 : fd_accdb_unread_one( accdb, &acc ); 31 : 32 : /* Recover object cache acc from data cache acc */ 33 69132 : return fd_sysvar_obj_restore( cache, desc, pos ); 34 80495 : } 35 : 36 : static int 37 : fd_sysvar_cache_restore1( fd_bank_t * bank, 38 : fd_accdb_t * accdb, 39 8956 : int log_fails ) { 40 8956 : fd_sysvar_cache_t * cache = fd_sysvar_cache_join( fd_sysvar_cache_new( 41 8956 : &bank->f.sysvar_cache ) ); 42 : 43 8956 : int saw_err = 0; 44 89456 : for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) { 45 80500 : int err = sysvar_data_fill( cache, accdb, bank->accdb_fork_id, i, log_fails ); 46 80500 : if( err ) saw_err = 1; 47 80500 : } 48 : 49 8956 : fd_sysvar_cache_leave( cache ); 50 : 51 8956 : return !saw_err; 52 8956 : } 53 : 54 : int 55 : fd_sysvar_cache_restore( fd_bank_t * bank, 56 615 : fd_accdb_t * accdb ) { 57 615 : return fd_sysvar_cache_restore1( bank, accdb, 1 ); 58 615 : } 59 : 60 : void 61 : fd_sysvar_cache_restore_fuzz( fd_bank_t * bank, 62 8343 : fd_accdb_t * accdb ) { 63 8343 : (void)fd_sysvar_cache_restore1( bank, accdb, 0 ); 64 8343 : } 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 555933 : ulong acc_data_len ) { 72 555933 : ulong idx; 73 3992307 : for( idx=0UL; idx<FD_SYSVAR_CACHE_ENTRY_CNT; idx++ ) { 74 3700220 : if( 0==memcmp( pubkey, fd_sysvar_key_tbl[ idx ].uc, sizeof(fd_pubkey_t) ) ) break; 75 3700220 : } 76 555933 : if( FD_UNLIKELY( idx==FD_SYSVAR_CACHE_ENTRY_CNT ) ) return; 77 262682 : if( FD_UNLIKELY( !lamports ) ) return; 78 : 79 262647 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ]; 80 262647 : fd_sysvar_desc_t * desc = &cache->desc [ idx ]; 81 : 82 262647 : ulong data_sz = fd_ulong_min( acc_data_len, pos->data_max ); 83 262647 : uchar * data = (uchar *)cache+pos->data_off; 84 262647 : fd_memcpy( data, acc_data, data_sz ); 85 262647 : desc->data_sz = (uint)data_sz; 86 : 87 : /* Recover object cache acc from data cache acc */ 88 262647 : fd_sysvar_obj_restore( cache, desc, pos ); 89 262647 : }