Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions book/api/metrics-generated.md
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,7 @@
| <span class="metrics-name">replay_&#8203;accdb_&#8203;reverted</span> | counter | Number of account database records reverted |
| <span class="metrics-name">replay_&#8203;accdb_&#8203;rooted</span> | counter | Number of account database entries rooted |
| <span class="metrics-name">replay_&#8203;accdb_&#8203;gc_&#8203;root</span> | counter | Number of account database entries garbage collected |
| <span class="metrics-name">replay_&#8203;accdb_&#8203;reclaimed</span> | counter | Number of account database entries reclaimed (deletion rooted) |

</div>

Expand Down
1 change: 1 addition & 0 deletions src/disco/metrics/generated/fd_metrics_replay.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ const fd_metrics_meta_t FD_METRICS_REPLAY[FD_METRICS_REPLAY_TOTAL] = {
DECLARE_METRIC( REPLAY_ACCDB_REVERTED, COUNTER ),
DECLARE_METRIC( REPLAY_ACCDB_ROOTED, COUNTER ),
DECLARE_METRIC( REPLAY_ACCDB_GC_ROOT, COUNTER ),
DECLARE_METRIC( REPLAY_ACCDB_RECLAIMED, COUNTER ),
};
8 changes: 7 additions & 1 deletion src/disco/metrics/generated/fd_metrics_replay.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,13 @@
#define FD_METRICS_COUNTER_REPLAY_ACCDB_GC_ROOT_DESC "Number of account database entries garbage collected"
#define FD_METRICS_COUNTER_REPLAY_ACCDB_GC_ROOT_CVT (FD_METRICS_CONVERTER_NONE)

#define FD_METRICS_REPLAY_TOTAL (28UL)
#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_OFF (140UL)
#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_NAME "replay_accdb_reclaimed"
#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_TYPE (FD_METRICS_TYPE_COUNTER)
#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_DESC "Number of account database entries reclaimed (deletion rooted)"
#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_CVT (FD_METRICS_CONVERTER_NONE)

#define FD_METRICS_REPLAY_TOTAL (29UL)
extern const fd_metrics_meta_t FD_METRICS_REPLAY[FD_METRICS_REPLAY_TOTAL];

#endif /* HEADER_fd_src_disco_metrics_generated_fd_metrics_replay_h */
1 change: 1 addition & 0 deletions src/disco/metrics/metrics.xml
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,7 @@ metric introduced.
<counter name="AccdbReverted" summary="Number of account database records reverted" />
<counter name="AccdbRooted" summary="Number of account database entries rooted" />
<counter name="AccdbGcRoot" summary="Number of account database entries garbage collected" />
<counter name="AccdbReclaimed" summary="Number of account database entries reclaimed (deletion rooted)" />
</tile>

<tile name="storei">
Expand Down
9 changes: 5 additions & 4 deletions src/discof/replay/fd_replay_tile.c
Original file line number Diff line number Diff line change
Expand Up @@ -495,10 +495,11 @@ metrics_write( fd_replay_tile_t * ctx ) {
FD_MCNT_SET( REPLAY, PROGCACHE_ROOTED, ctx->progcache_admin->metrics.root_cnt );
FD_MCNT_SET( REPLAY, PROGCACHE_GC_ROOT, ctx->progcache_admin->metrics.gc_root_cnt );

FD_MCNT_SET( REPLAY, ACCDB_CREATED, ctx->accdb->base.created_cnt );
FD_MCNT_SET( REPLAY, ACCDB_REVERTED, ctx->accdb_admin->metrics.revert_cnt );
FD_MCNT_SET( REPLAY, ACCDB_ROOTED, ctx->accdb_admin->metrics.root_cnt );
FD_MCNT_SET( REPLAY, ACCDB_GC_ROOT, ctx->accdb_admin->metrics.gc_root_cnt );
FD_MCNT_SET( REPLAY, ACCDB_CREATED, ctx->accdb->base.created_cnt );
FD_MCNT_SET( REPLAY, ACCDB_REVERTED, ctx->accdb_admin->metrics.revert_cnt );
FD_MCNT_SET( REPLAY, ACCDB_ROOTED, ctx->accdb_admin->metrics.root_cnt );
FD_MCNT_SET( REPLAY, ACCDB_GC_ROOT, ctx->accdb_admin->metrics.gc_root_cnt );
FD_MCNT_SET( REPLAY, ACCDB_RECLAIMED, ctx->accdb_admin->metrics.reclaim_cnt );
}

static inline ulong
Expand Down
53 changes: 46 additions & 7 deletions src/flamenco/accdb/fd_accdb_admin.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "fd_accdb_admin.h"
#include "../fd_flamenco_base.h"

fd_accdb_admin_t *
fd_accdb_admin_join( fd_accdb_admin_t * ljoin,
Expand Down Expand Up @@ -209,6 +210,35 @@ fd_accdb_cancel( fd_accdb_admin_t * accdb,
fd_accdb_txn_cancel_tree( accdb, txn );
}

/* fd_accdb_chain_reclaim "reclaims" a zero-lamport account by removing
its underlying record. */

static void
fd_accdb_chain_reclaim( fd_accdb_admin_t * accdb,
fd_funk_rec_t * rec ) {
fd_funk_t * funk = accdb->funk;

/* Phase 1: Remove record from map */

fd_funk_xid_key_pair_t pair = rec->pair;
fd_funk_rec_query_t query[1];
int rm_err = fd_funk_rec_map_remove( funk->rec_map, &pair, NULL, query, FD_MAP_FLAG_BLOCKING );
if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed (%i-%s)", rm_err, fd_map_strerror( rm_err ) ));

/* Phase 2: Invalidate record */

fd_funk_rec_t * old_rec = query->ele;
memset( &old_rec->pair, 0, sizeof(fd_funk_xid_key_pair_t) );
FD_COMPILER_MFENCE();

/* Phase 3: Free record */

old_rec->map_next = FD_FUNK_REC_IDX_NULL;
fd_funk_val_flush( old_rec, funk->alloc, funk->wksp );
fd_funk_rec_pool_release( funk->rec_pool, old_rec, 1 );
accdb->metrics.reclaim_cnt++;
}

/* fd_accdb_chain_gc_root cleans up a stale "rooted" version of a
record. */

Expand All @@ -222,7 +252,7 @@ fd_accdb_chain_gc_root( fd_accdb_admin_t * accdb,
fd_funk_rec_query_t query[1];
int rm_err = fd_funk_rec_map_remove( funk->rec_map, pair, NULL, query, FD_MAP_FLAG_BLOCKING );
if( rm_err==FD_MAP_ERR_KEY ) return;
if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed: %i-%s", rm_err, fd_map_strerror( rm_err ) ));
if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed (%i-%s)", rm_err, fd_map_strerror( rm_err ) ));

/* Phase 2: Invalidate record */

Expand Down Expand Up @@ -252,6 +282,7 @@ fd_accdb_publish_recs( fd_accdb_admin_t * accdb,
uint head = txn->rec_head_idx;
txn->rec_head_idx = FD_FUNK_REC_IDX_NULL;
txn->rec_tail_idx = FD_FUNK_REC_IDX_NULL;
fd_wksp_t * funk_wksp = accdb->funk->wksp;
while( !fd_funk_rec_idx_is_null( head ) ) {
fd_funk_rec_t * rec = &accdb->funk->rec_pool->ele[ head ];

Expand All @@ -261,13 +292,21 @@ fd_accdb_publish_recs( fd_accdb_admin_t * accdb,
fd_funk_txn_xid_set_root( pair->xid );
fd_accdb_chain_gc_root( accdb, pair );

/* Migrate record to root */
/* Root or reclaim record */
uint next = rec->next_idx;
rec->prev_idx = FD_FUNK_REC_IDX_NULL;
rec->next_idx = FD_FUNK_REC_IDX_NULL;
fd_funk_txn_xid_t const root = { .ul = { ULONG_MAX, ULONG_MAX } };
fd_funk_txn_xid_st_atomic( rec->pair.xid, &root );
accdb->metrics.root_cnt++;
fd_account_meta_t const * meta = fd_funk_val( rec, funk_wksp );
FD_CRIT( meta && rec->val_sz>=sizeof(fd_account_meta_t), "invalid funk record value" );
if( FD_LIKELY( meta->lamports ) ) {
/* Migrate record to root */
rec->prev_idx = FD_FUNK_REC_IDX_NULL;
rec->next_idx = FD_FUNK_REC_IDX_NULL;
fd_funk_txn_xid_t const root = { .ul = { ULONG_MAX, ULONG_MAX } };
fd_funk_txn_xid_st_atomic( rec->pair.xid, &root );
accdb->metrics.root_cnt++;
} else {
/* Remove record */
fd_accdb_chain_reclaim( accdb, rec );
}

head = next; /* next record */
}
Expand Down
7 changes: 4 additions & 3 deletions src/flamenco/accdb/fd_accdb_admin.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ struct fd_accdb_admin {
fd_funk_t funk[1];

struct {
ulong root_cnt;
ulong gc_root_cnt;
ulong revert_cnt;
ulong root_cnt; /* moved to database root */
ulong reclaim_cnt; /* 0 lamport account removed while rooting */
ulong gc_root_cnt; /* stale rooted revisions removed while rooting */
ulong revert_cnt; /* abandoned by consensus */
} metrics;
};

Expand Down
20 changes: 0 additions & 20 deletions src/flamenco/accdb/fd_accdb_ref.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,26 +170,6 @@ fd_accdb_ref_slot_set( fd_accdb_rw_t * rw,

FD_PROTOTYPES_END

/* fd_accdb_guardr_t tracks a rwlock being held as read-only.
Destroying this guard object detaches the caller's thread from the
rwlock. */

struct fd_accbd_guardr {
fd_rwlock_t * rwlock;
};

typedef struct fd_accdb_guardr fd_accdb_guardr_t;

/* fd_accdb_guardw_t tracks an rwlock being held exclusively.
Destroying this guard object detaches the caller's thread from the
lock. */

struct fd_accdb_guardw {
fd_rwlock_t * rwlock;
};

typedef struct fd_accdb_guardw fd_accdb_guardw_t;

/* fd_accdb_spec_t tracks a speculative access to a shared resource.
Destroying this guard object marks the end of a speculative access. */

Expand Down
Loading