LCOV - code coverage report
Current view: top level - flamenco/runtime/sysvar - fd_sysvar_cache_db.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 31 49 63.3 %
Date: 2026-07-10 05:48:38 Functions: 3 5 60.0 %

          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 : }

Generated by: LCOV version 1.14