Skip to content

Commit 8bd555e

Browse files
committed
flamenco, gossip: two-tiered value table for fast iteration in push and pullresp loops
1 parent 9653773 commit 8bd555e

File tree

9 files changed

+491
-379
lines changed

9 files changed

+491
-379
lines changed

book/api/metrics-generated.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@
376376
| gossip_​peer_​counts_​repair | `gauge` | Number of peers of each type (Repair) |
377377
| gossip_​peer_​counts_​voter | `gauge` | Number of peers of each type (Voter) |
378378
| gossip_​shred_​version_​zero | `counter` | Shred version zero |
379+
| gossip_​value_​map_​size | `gauge` | Current size of the CRDS value map |
380+
| gossip_​value_​vec_​size | `gauge` | Current size of the CRDS value vector |
379381
| gossip_​received_​packets | `counter` | Number of all gossip packets received |
380382
| gossip_​corrupted_​messages | `counter` | Number of corrupted gossip messages received |
381383
| gossip_​received_​gossip_​messages_​pull_​request | `counter` | Number of gossip messages received (Pull Request) |

src/disco/metrics/generated/fd_metrics_gossip.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ const fd_metrics_meta_t FD_METRICS_GOSSIP[FD_METRICS_GOSSIP_TOTAL] = {
1414
DECLARE_METRIC_ENUM( GOSSIP_PEER_COUNTS, GAUGE, PEER_TYPES, REPAIR ),
1515
DECLARE_METRIC_ENUM( GOSSIP_PEER_COUNTS, GAUGE, PEER_TYPES, VOTER ),
1616
DECLARE_METRIC( GOSSIP_SHRED_VERSION_ZERO, COUNTER ),
17+
DECLARE_METRIC( GOSSIP_VALUE_MAP_SIZE, GAUGE ),
18+
DECLARE_METRIC( GOSSIP_VALUE_VEC_SIZE, GAUGE ),
1719
DECLARE_METRIC( GOSSIP_RECEIVED_PACKETS, COUNTER ),
1820
DECLARE_METRIC( GOSSIP_CORRUPTED_MESSAGES, COUNTER ),
1921
DECLARE_METRIC_ENUM( GOSSIP_RECEIVED_GOSSIP_MESSAGES, COUNTER, GOSSIP_MESSAGE, PULL_REQUEST ),

src/disco/metrics/generated/fd_metrics_gossip.h

Lines changed: 190 additions & 178 deletions
Large diffs are not rendered by default.

src/disco/metrics/metrics.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,9 @@ metric introduced.
637637
<gauge name="PeerCounts" enum="PeerTypes" clickhouse_exclude="true" summary="Number of peers of each type" />
638638
<counter name="ShredVersionZero" clickhouse_exclude="true" summary="Shred version zero" />
639639

640+
<gauge name="ValueMapSize" clickhouse_exclude="true" summary="Current size of the CRDS value map" />
641+
<gauge name="ValueVecSize" clickhouse_exclude="true" summary="Current size of the CRDS value vector" />
642+
640643
<counter name="ReceivedPackets" clickhouse_exclude="true" summary="Number of all gossip packets received" />
641644
<counter name="CorruptedMessages" clickhouse_exclude="true" summary="Number of corrupted gossip messages received" />
642645
<counter name="ReceivedGossipMessages" enum="GossipMessage" clickhouse_exclude="true" summary="Number of gossip messages received" />

src/discof/gossip/fd_gossip_tile.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,9 @@ fd_gossip_update_gossip_metrics( fd_gossip_metrics_t * metrics ) {
10721072
FD_MCNT_ENUM_COPY( GOSSIP, PUSH_CRDS_DROP, metrics->push_crds_drop_reason );
10731073
FD_MGAUGE_SET( GOSSIP, PUSH_CRDS_QUEUE_COUNT, metrics->push_crds_queue_cnt );
10741074

1075+
FD_MGAUGE_SET( GOSSIP, VALUE_MAP_SIZE, metrics->value_map_cnt );
1076+
FD_MGAUGE_SET( GOSSIP, VALUE_VEC_SIZE, metrics->value_vec_cnt );
1077+
10751078
FD_MGAUGE_SET( GOSSIP, ACTIVE_PUSH_DESTINATIONS, metrics->active_push_destinations );
10761079
FD_MCNT_SET( GOSSIP, REFRESH_PUSH_STATES_FAIL_COUNT, metrics->refresh_push_states_failcnt );
10771080

src/flamenco/gossip/fd_gossip.c

Lines changed: 261 additions & 190 deletions
Large diffs are not rendered by default.

src/flamenco/gossip/fd_gossip.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ struct fd_gossip_metrics {
176176
ulong push_crds_drop_reason[FD_METRICS_COUNTER_GOSSIP_PUSH_CRDS_DROP_CNT];
177177
ulong push_crds_queue_cnt;
178178

179+
/* Value DS sizes */
180+
ulong value_map_cnt;
181+
ulong value_vec_cnt;
182+
179183
/* Active Push Destinations */
180184
ulong active_push_destinations;
181185
ulong refresh_push_states_failcnt;

src/util/tmpl/fd_vec.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ VEC_(new)( void * shmem,
161161
return shmem;
162162
}
163163

164-
FD_FN_CONST static inline VEC_T *
164+
static inline VEC_T *
165165
VEC_(join)( void * shvec ) {
166166

167167
if( FD_UNLIKELY( !shvec ) ) return NULL;
@@ -179,7 +179,7 @@ VEC_(leave)( VEC_T * join ) {
179179
return (void *)(((ulong)join) - VEC_(private_meta_footprint)());
180180
}
181181

182-
FD_FN_CONST static inline void *
182+
static inline void *
183183
VEC_(delete)( void * shvec ) {
184184

185185
if( FD_UNLIKELY( !shvec ) ) return NULL;
@@ -223,8 +223,8 @@ VEC_(contract)( VEC_T * join,
223223
}
224224

225225
static inline VEC_T *
226-
VEC_(remove)( VEC_T * join,
227-
ulong idx ) {
226+
VEC_(remove_idx)( VEC_T * join,
227+
ulong idx ) {
228228
VEC_(private_t) * vec = VEC_(private)( join );
229229
ulong cnt = vec->cnt - 1UL;
230230
join[idx] = join[cnt]; /* TODO: Consider letting user decide if self copy is cheaper than testing */
@@ -233,8 +233,14 @@ VEC_(remove)( VEC_T * join,
233233
}
234234

235235
static inline VEC_T *
236-
VEC_(remove_compact)( VEC_T * join,
237-
ulong idx ) {
236+
VEC_(remove_ele)( VEC_T * join,
237+
VEC_T * ele){
238+
return VEC_(remove_idx)( join, (ulong)(ele-join) );
239+
}
240+
241+
static inline VEC_T *
242+
VEC_(remove_compact_idx)( VEC_T * join,
243+
ulong idx ) {
238244
VEC_(private_t) * vec = VEC_(private)( join );
239245
ulong cnt = vec->cnt - 1UL;
240246
for( ; idx<cnt; idx++ ) join[idx] = join[idx+1UL];

src/util/tmpl/test_vec.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ main( int argc,
5252
FD_TEST( !memcmp( vec, ref, cnt*sizeof(MYVEC_T) ) );
5353

5454
uint r = fd_rng_uint( rng );
55-
int op = (int)(r & 3U); r>>=2;
55+
int op = (int)(r & 7U); r>>=3;
5656

5757
switch( op ) {
5858
default:
@@ -78,19 +78,28 @@ main( int argc,
7878
break;
7979
}
8080

81-
case 2: { /* remove with backfill */
81+
case 2: { /* remove with backfill via idx */
8282
if( !cnt ) break;
8383
ulong idx = fd_rng_ulong_roll( rng, cnt );
84-
FD_TEST( myvec_remove( vec, idx )==vec );
84+
FD_TEST( myvec_remove_idx( vec, idx )==vec );
8585
cnt--;
8686
ref[idx] = ref[cnt];
8787
break;
8888
}
8989

90-
case 3: { /* remove with compaction */
90+
case 3: { /* remove with backfill via ptr */
9191
if( !cnt ) break;
9292
ulong idx = fd_rng_ulong_roll( rng, cnt );
93-
FD_TEST( myvec_remove_compact( vec, idx )==vec );
93+
FD_TEST( myvec_remove_ele( vec, &vec[idx] )==vec );
94+
cnt--;
95+
ref[idx] = ref[cnt];
96+
break;
97+
}
98+
99+
case 4: { /* remove with compaction */
100+
if( !cnt ) break;
101+
ulong idx = fd_rng_ulong_roll( rng, cnt );
102+
FD_TEST( myvec_remove_compact_idx( vec, idx )==vec );
94103
cnt--;
95104
for( ; idx<cnt; idx++ ) ref[idx] = ref[idx+1UL];
96105
break;

0 commit comments

Comments
 (0)