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: 64 67 95.5 %
Date: 2026-11-11 12:40:43 Functions: 6 6 100.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       69767 :                   int                       log_fails ) {
      13       69767 :   fd_sysvar_pos_t const * pos  = &fd_sysvar_pos_tbl[ idx ];
      14       69767 :   fd_pubkey_t const *     key  = &fd_sysvar_key_tbl[ idx ];
      15       69767 :   fd_sysvar_desc_t *      desc = &cache->desc      [ idx ];
      16             : 
      17             :   /* Read account from database */
      18       69767 :   fd_acc_t acc = fd_accdb_read_one( accdb, fork, key->uc );
      19       69767 :   if( FD_UNLIKELY( !acc.lamports ) ) {
      20        7454 :     if( log_fails ) FD_LOG_DEBUG(( "Sysvar %s not found", pos->name ));
      21        7454 :     fd_accdb_unread_one( accdb, &acc );
      22        7454 :     return 0;
      23        7454 :   }
      24             : 
      25             :   /* Fill data cache acc */
      26       62313 :   ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max );
      27       62313 :   uchar * data = (uchar *)cache+pos->data_off;
      28       62313 :   fd_memcpy( data, acc.data, data_sz );
      29       62313 :   desc->data_sz = (uint)data_sz;
      30       62313 :   fd_accdb_unread_one( accdb, &acc );
      31             : 
      32             :   /* Recover object cache acc from data cache acc */
      33       62313 :   return fd_sysvar_obj_restore( cache, desc, pos );
      34       69767 : }
      35             : 
      36             : static int
      37             : fd_sysvar_cache_restore1( fd_sysvar_cache_t * cache_mem,
      38             :                           fd_accdb_t *        accdb,
      39             :                           fd_accdb_fork_id_t  fork_id,
      40        8737 :                           int                 log_fails ) {
      41        8737 :   fd_sysvar_cache_t * cache = fd_sysvar_cache_join( fd_sysvar_cache_new( cache_mem ) );
      42             : 
      43        8737 :   int saw_err = 0;
      44       78503 :   for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) {
      45       69766 :     int err = sysvar_data_fill( cache, accdb, fork_id, i, log_fails );
      46       69766 :     if( err ) saw_err = 1;
      47       69766 :   }
      48             : 
      49        8737 :   fd_sysvar_cache_leave( cache );
      50             : 
      51        8737 :   return !saw_err;
      52        8737 : }
      53             : 
      54             : int
      55             : fd_sysvar_cache_restore( fd_sysvar_cache_t * cache,
      56             :                          fd_accdb_t *        accdb,
      57         392 :                          fd_accdb_fork_id_t  fork_id ) {
      58         392 :   return fd_sysvar_cache_restore1( cache, accdb, fork_id, 1 );
      59         392 : }
      60             : 
      61             : void
      62             : fd_sysvar_cache_restore_fuzz( fd_sysvar_cache_t * cache,
      63             :                               fd_accdb_t *        accdb,
      64        8346 :                               fd_accdb_fork_id_t  fork_id ) {
      65        8346 :   (void)fd_sysvar_cache_restore1( cache, accdb, fork_id, 0 );
      66        8346 : }
      67             : 
      68             : int
      69             : fd_sysvar_cache_validate( fd_bank_t const * bank,
      70         611 :                           fd_accdb_t *      accdb ) {
      71         611 :   int saw_err = 0;
      72        5497 :   for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) {
      73        4886 :     fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ i ];
      74        4886 :     fd_pubkey_t const *     key = &fd_sysvar_key_tbl[ i ];
      75        4886 :     fd_acc_t acc = fd_accdb_read_one( accdb, bank->accdb_fork_id, key->uc );
      76        4886 :     if( FD_UNLIKELY( !acc.lamports ) ) {
      77          46 :       FD_LOG_DEBUG(( "Sysvar %s not found", pos->name ));
      78        4840 :     } else {
      79        4840 :       ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max );
      80        4840 :       if( FD_UNLIKELY( !pos->validate( acc.data, data_sz ) ) ) {
      81           0 :         FD_LOG_DEBUG(( "Failed to validate sysvar %s with data_sz=%lu", pos->name, data_sz ));
      82           0 :         saw_err = 1;
      83           0 :       }
      84        4840 :     }
      85        4886 :     fd_accdb_unread_one( accdb, &acc );
      86        4886 :   }
      87         611 :   return !saw_err;
      88         611 : }
      89             : 
      90             : void
      91             : fd_sysvar_cache_restore_one( fd_sysvar_cache_t * cache,
      92             :                              fd_pubkey_t const * pubkey,
      93             :                              ulong               lamports,
      94             :                              uchar const *       acc_data,
      95      553648 :                              ulong               acc_data_len ) {
      96      553648 :   ulong idx;
      97     3681017 :   for( idx=0UL; idx<FD_SYSVAR_CACHE_ENTRY_CNT; idx++ ) {
      98     3389467 :     if( 0==memcmp( pubkey, fd_sysvar_key_tbl[ idx ].uc, sizeof(fd_pubkey_t) ) ) break;
      99     3389467 :   }
     100      553648 :   if( FD_UNLIKELY( idx==FD_SYSVAR_CACHE_ENTRY_CNT ) ) return;
     101      260059 :   if( FD_UNLIKELY( !lamports ) ) return;
     102             : 
     103      260024 :   fd_sysvar_pos_t const * pos  = &fd_sysvar_pos_tbl[ idx ];
     104      260024 :   fd_sysvar_desc_t *      desc = &cache->desc      [ idx ];
     105             : 
     106      260024 :   ulong data_sz = fd_ulong_min( acc_data_len, pos->data_max );
     107      260024 :   uchar * data    = (uchar *)cache+pos->data_off;
     108      260024 :   fd_memcpy( data, acc_data, data_sz );
     109      260024 :   desc->data_sz = (uint)data_sz;
     110             : 
     111             :   /* Recover object cache acc from data cache acc */
     112      260024 :   fd_sysvar_obj_restore( cache, desc, pos );
     113      260024 : }

Generated by: LCOV version 1.14