Skip to content

Commit 5272011

Browse files
add BitVector type
1 parent a2050c4 commit 5272011

File tree

12 files changed

+1256
-1875
lines changed

12 files changed

+1256
-1875
lines changed

src/discof/gossip/fd_gossip_tile.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,8 @@ gossip_deliver_fun( fd_crds_data_t * data,
346346
ulong bitmap_len = 0;
347347
uchar * bitmap_dst = last_vote_msg_+sizeof(uint)+struct_len;
348348
if ( FD_LIKELY( data->inner.restart_last_voted_fork_slots.offsets.discriminant==fd_restart_slots_offsets_enum_raw_offsets ) ) {
349-
uchar * bitmap_src = data->inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets.bits.bits;
350-
bitmap_len = data->inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets.bits.bits_len;
349+
uchar * bitmap_src = data->inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets_bitvec;
350+
bitmap_len = data->inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets_bitvec_len;
351351
memcpy( bitmap_dst, bitmap_src, bitmap_len );
352352
} else {
353353
uchar bitmap_src [ FD_RESTART_RAW_BITMAP_BYTES_MAX ];
@@ -724,7 +724,7 @@ after_credit( fd_gossip_tile_ctx_t * ctx,
724724
sizeof(fd_gossip_restart_last_voted_fork_slots_t) );
725725

726726
restart_last_vote_msg.inner.restart_last_voted_fork_slots.shred_version = fd_gossip_get_shred_version( ctx->gossip );
727-
restart_last_vote_msg.inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets.bits.bits = ctx->restart_last_vote_msg + sizeof(fd_gossip_restart_last_voted_fork_slots_t);
727+
restart_last_vote_msg.inner.restart_last_voted_fork_slots.offsets.inner.raw_offsets.offsets_bitvec = ctx->restart_last_vote_msg + sizeof(fd_gossip_restart_last_voted_fork_slots_t);
728728

729729
/* Convert the raw bitmap into RunLengthEncoding before sending out */
730730
fd_restart_run_length_encoding_inner_t runlength_encoding[ FD_RESTART_PACKET_BITMAP_BYTES_MAX/sizeof(ushort) ];

src/discof/restart/fd_restart.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,17 @@ fd_restart_recv_last_voted_fork_slots( fd_restart_t * restart,
111111

112112
/* Decode the bitmap in the message and aggregate validator stake into slot_to_stake */
113113
/* The gossip tile should have already converted the bitmap into raw format */
114-
if( FD_UNLIKELY( msg->last_voted_slot+1<msg->offsets.inner.raw_offsets.offsets.len ) ) {
114+
if( FD_UNLIKELY( msg->last_voted_slot+1<msg->offsets.inner.raw_offsets.offsets_len ) ) {
115115
FD_LOG_WARNING(( "Received invalid last_voted_fork_slot message from validator %s because %lu<%lu",
116-
FD_BASE58_ENC_32_ALLOCA( pubkey ), msg->last_voted_slot+1, msg->offsets.inner.raw_offsets.offsets.len ));
116+
FD_BASE58_ENC_32_ALLOCA( pubkey ), msg->last_voted_slot+1, msg->offsets.inner.raw_offsets.offsets_len ));
117117
}
118-
for( ulong i=0; i<msg->offsets.inner.raw_offsets.offsets.len; i++ ) {
118+
for( ulong i=0; i<msg->offsets.inner.raw_offsets.offsets_len; i++ ) {
119119
if( FD_UNLIKELY( msg->last_voted_slot<restart->funk_root+i ) ) break;
120120

121121
ulong slot = msg->last_voted_slot-i;
122122
ulong byte_off = i/BITS_PER_UCHAR;
123123
int bit_off = i%BITS_PER_UCHAR;
124-
int bit = fd_uchar_extract_bit( msg->offsets.inner.raw_offsets.offsets.bits.bits[byte_off], bit_off );
124+
int bit = fd_uchar_extract_bit( msg->offsets.inner.raw_offsets.offsets_bitvec[byte_off], bit_off );
125125
if( FD_LIKELY( bit ) ) {
126126
ulong offset = slot-restart->funk_root;
127127
ulong slot_epoch = fd_slot_to_epoch( restart->epoch_schedule, slot, NULL );
@@ -189,7 +189,7 @@ fd_restart_recv_gossip_msg( fd_restart_t * restart,
189189
Bitmap in raw format (uchar* - bitmap size is specified in the gossip message)
190190
*/
191191
fd_gossip_restart_last_voted_fork_slots_t * msg = (fd_gossip_restart_last_voted_fork_slots_t * ) fd_type_pun( src );
192-
msg->offsets.inner.raw_offsets.offsets.bits.bits = src + sizeof(fd_gossip_restart_last_voted_fork_slots_t);
192+
msg->offsets.inner.raw_offsets.offsets_bitvec = src + sizeof(fd_gossip_restart_last_voted_fork_slots_t);
193193
fd_restart_recv_last_voted_fork_slots( restart, msg, out_heaviest_fork_found );
194194
}
195195
}
@@ -315,10 +315,10 @@ fd_restart_convert_runlength_to_raw_bitmap( fd_gossip_restart_last_voted_fork_sl
315315
bit_cnt += cnt;
316316
*out_bitmap_len = (bit_cnt-1)/BITS_PER_UCHAR+1;
317317
}
318-
msg->offsets.discriminant = fd_restart_slots_offsets_enum_raw_offsets;
319-
msg->offsets.inner.raw_offsets.offsets.has_bits = 1;
320-
msg->offsets.inner.raw_offsets.offsets.len = bit_cnt;
321-
msg->offsets.inner.raw_offsets.offsets.bits.bits_len = *out_bitmap_len;
318+
msg->offsets.discriminant = fd_restart_slots_offsets_enum_raw_offsets;
319+
msg->offsets.inner.raw_offsets.has_offsets = 1;
320+
msg->offsets.inner.raw_offsets.offsets_len = bit_cnt;
321+
msg->offsets.inner.raw_offsets.offsets_bitvec_len = *out_bitmap_len;
322322
}
323323

324324
void
@@ -328,12 +328,12 @@ fd_restart_convert_raw_bitmap_to_runlength( fd_gossip_restart_last_voted_fork_sl
328328
int last_bit = 1;
329329
ulong offsets_len = 0;
330330
for( ulong raw_bitmap_iter=0;
331-
raw_bitmap_iter<msg->offsets.inner.raw_offsets.offsets.len &&
331+
raw_bitmap_iter<msg->offsets.inner.raw_offsets.offsets_len &&
332332
offsets_len<FD_RESTART_PACKET_BITMAP_BYTES_MAX/sizeof(ushort);
333333
raw_bitmap_iter++ ) {
334334
ulong idx = raw_bitmap_iter/BITS_PER_UCHAR;
335335
int off = raw_bitmap_iter%BITS_PER_UCHAR;
336-
int bit = fd_uchar_extract_bit( msg->offsets.inner.raw_offsets.offsets.bits.bits[idx], off );
336+
int bit = fd_uchar_extract_bit( msg->offsets.inner.raw_offsets.offsets_bitvec[idx], off );
337337
if( FD_LIKELY( bit==last_bit ) ) {
338338
cnt++;
339339
} else {
@@ -428,10 +428,10 @@ fd_restart_init( fd_restart_t * restart,
428428
uchar * bitmap = out_buf+sizeof(fd_gossip_restart_last_voted_fork_slots_t);
429429
fd_memset( bitmap, 0, num_slots/BITS_PER_UCHAR+1 );
430430
msg->offsets.discriminant = fd_restart_slots_offsets_enum_raw_offsets;
431-
msg->offsets.inner.raw_offsets.offsets.has_bits = 1;
432-
msg->offsets.inner.raw_offsets.offsets.len = num_slots;
433-
msg->offsets.inner.raw_offsets.offsets.bits.bits = bitmap;
434-
msg->offsets.inner.raw_offsets.offsets.bits.bits_len = ( num_slots-1 )/BITS_PER_UCHAR+1;
431+
msg->offsets.inner.raw_offsets.has_offsets = 1;
432+
msg->offsets.inner.raw_offsets.offsets_len = num_slots;
433+
msg->offsets.inner.raw_offsets.offsets_bitvec = bitmap;
434+
msg->offsets.inner.raw_offsets.offsets_bitvec_len = ( num_slots-1 )/BITS_PER_UCHAR+1;
435435
*out_buf_len = sizeof(fd_gossip_restart_last_voted_fork_slots_t)+( num_slots-1 )/BITS_PER_UCHAR+1;
436436
FD_LOG_NOTICE(( "[%s] last_voted_slot=%lu, bank_hash=%s, encoding %lu bits in bitmap",
437437
__func__, msg->last_voted_slot, FD_BASE58_ENC_32_ALLOCA( &tower_bank_hash ), num_slots ));
@@ -457,14 +457,14 @@ fd_restart_init( fd_restart_t * restart,
457457
}
458458

459459
for( ulong i=start_slot; i<slot_history->next_slot; i++ ) {
460-
ulong in_idx = ( i/BITS_PER_ULONG )%( slot_history->bits.bits->blocks_len );
460+
ulong in_idx = ( i/BITS_PER_ULONG )%( slot_history->bits_bitvec_len );
461461
int in_bit_off = i%BITS_PER_ULONG;
462462

463463
ulong offset_from_end = end_slot-i;
464464
ulong out_idx = offset_from_end/BITS_PER_UCHAR;
465465
int out_bit_off = offset_from_end%BITS_PER_UCHAR;
466466

467-
if( FD_LIKELY( fd_ulong_extract_bit( slot_history->bits.bits->blocks[in_idx], in_bit_off ) ) ) {
467+
if( FD_LIKELY( fd_ulong_extract_bit( slot_history->bits_bitvec[in_idx], in_bit_off ) ) ) {
468468
/* bit#i in slot_history is 1 */
469469
bitmap[out_idx] = fd_uchar_set_bit( bitmap[out_idx], out_bit_off );
470470
}

src/flamenco/gossip/fd_gossip.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,13 +1241,12 @@ fd_gossip_random_pull( fd_gossip_t * glob, fd_pending_event_arg_t * arg ) {
12411241
fd_gossip_msg_new_disc(&gmsg, fd_gossip_msg_enum_pull_req);
12421242
fd_gossip_pull_req_t * req = &gmsg.inner.pull_req;
12431243
fd_crds_filter_t * filter = &req->filter;
1244-
filter->mask_bits = nmaskbits;
1245-
filter->filter.keys_len = nkeys;
1246-
filter->filter.keys = keys;
1247-
fd_gossip_bitvec_u64_t * bitvec = &filter->filter.bits;
1248-
bitvec->len = FD_BLOOM_NUM_BITS;
1249-
bitvec->has_bits = 1;
1250-
bitvec->bits.vec_len = FD_BLOOM_NUM_BITS/64U;
1244+
filter->mask_bits = nmaskbits;
1245+
filter->filter.keys_len = nkeys;
1246+
filter->filter.keys = keys;
1247+
filter->filter.bits_len = FD_BLOOM_NUM_BITS;
1248+
filter->filter.has_bits = 1;
1249+
filter->filter.bits_bitvec_len = FD_BLOOM_NUM_BITS/64U;
12511250

12521251
/* The "value" in the request is always my own contact info (v2) */
12531252
fd_crds_value_t * value = &req->value;
@@ -1261,7 +1260,7 @@ fd_gossip_random_pull( fd_gossip_t * glob, fd_pending_event_arg_t * arg ) {
12611260
ulong index = fd_gossip_filter_selection_iter_idx( iter );
12621261
filter->mask = (nmaskbits == 0 ? ~0UL : ((index << (64U - nmaskbits)) | (~0UL >> nmaskbits)));
12631262
filter->filter.num_bits_set = num_bits_set[index];
1264-
bitvec->bits.vec = bits + (index*CHUNKSIZE);
1263+
filter->filter.bits_bitvec = bits + (index*CHUNKSIZE);
12651264
fd_gossip_send(glob, &ele->key, &gmsg);
12661265
}
12671266
}
@@ -1862,8 +1861,7 @@ fd_gossip_handle_pull_req(fd_gossip_t * glob, const fd_gossip_peer_addr_t * from
18621861
fd_crds_filter_t * filter = &msg->filter;
18631862
ulong nkeys = filter->filter.keys_len;
18641863
ulong * keys = filter->filter.keys;
1865-
fd_gossip_bitvec_u64_t * bitvec = &filter->filter.bits;
1866-
ulong * bitvec2 = bitvec->bits.vec;
1864+
ulong * inner = filter->filter.bits_bitvec;
18671865
ulong expire = FD_NANOSEC_TO_MILLI(glob->now) - FD_GOSSIP_PULL_TIMEOUT;
18681866
ulong hits = 0;
18691867
ulong misses = 0;
@@ -1883,8 +1881,8 @@ fd_gossip_handle_pull_req(fd_gossip_t * glob, const fd_gossip_peer_addr_t * from
18831881
}
18841882
int miss = 0;
18851883
for (ulong i = 0; i < nkeys; ++i) {
1886-
ulong pos = fd_gossip_bloom_pos(hash, keys[i], bitvec->len);
1887-
ulong * j = bitvec2 + (pos>>6U); /* divide by 64 */
1884+
ulong pos = fd_gossip_bloom_pos(hash, keys[i], filter->filter.bits_len);
1885+
ulong * j = inner + (pos>>6U); /* divide by 64 */
18881886
ulong bit = 1UL<<(pos & 63U);
18891887
if (!((*j) & bit)) {
18901888
miss = 1;

src/flamenco/runtime/sysvar/fd_sysvar_slot_history.c

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@ fd_sysvar_slot_history_set( fd_slot_history_global_t * history,
2222
return;
2323
}
2424

25-
fd_slot_history_inner_global_t * inner = (fd_slot_history_inner_global_t *)((uchar*)&history->bits + history->bits.bits_offset);
26-
ulong * blocks = (ulong *)((uchar*)inner + inner->blocks_offset);
27-
ulong blocks_len = inner->blocks_len;
25+
ulong * blocks = (ulong *)((uchar*)history + history->bits_bitvec_offset);
26+
ulong blocks_len = history->bits_bitvec_len;
2827

2928
// Skipped slots, delete them from history
3029
for( ulong j = history->next_slot; j < i; j++ ) {
@@ -61,20 +60,16 @@ fd_sysvar_slot_history_init( fd_exec_slot_ctx_t * slot_ctx, fd_spad_t * runtime_
6160

6261
/* We need to construct the gaddr-aware slot history object */
6362
ulong total_sz = sizeof(fd_slot_history_global_t) + alignof(fd_slot_history_global_t) +
64-
sizeof(fd_slot_history_inner_global_t) + alignof(fd_slot_history_inner_global_t) +
6563
(sizeof(ulong) + alignof(ulong)) * blocks_len;
6664

6765
uchar * mem = fd_spad_alloc( runtime_spad, alignof(fd_slot_history_global_t), total_sz );
68-
fd_slot_history_global_t * history = (fd_slot_history_global_t *)mem;
69-
fd_slot_history_inner_global_t * inner = (fd_slot_history_inner_global_t *)fd_ulong_align_up( (ulong)((uchar*)history + sizeof(fd_slot_history_global_t)), alignof(fd_slot_history_inner_global_t) );
70-
ulong * blocks = (ulong *)fd_ulong_align_up( (ulong)((uchar*)inner + sizeof(fd_slot_history_inner_global_t)), alignof(ulong) );
66+
fd_slot_history_global_t * history = (fd_slot_history_global_t *)mem;
67+
ulong * blocks = (ulong *)fd_ulong_align_up( (ulong)((uchar*)history + sizeof(fd_slot_history_global_t)), alignof(ulong) );
7168

72-
history->next_slot = slot_ctx->slot_bank.slot + 1UL;
73-
history->bits.bits_offset = (ulong)((uchar*)inner - (uchar*)history);
74-
history->bits.len = slot_history_max_entries;
75-
76-
inner->blocks_len = blocks_len;
77-
inner->blocks_offset = (ulong)((uchar*)blocks - (uchar*)inner);
69+
history->next_slot = slot_ctx->slot_bank.slot + 1UL;
70+
history->bits_bitvec_offset = (ulong)((uchar*)blocks - (uchar*)history);
71+
history->bits_len = slot_history_max_entries;
72+
history->bits_bitvec_len = blocks_len;
7873
memset( blocks, 0, sizeof(ulong) * blocks_len );
7974

8075
/* TODO: handle slot != 0 init case */
@@ -186,15 +181,11 @@ fd_sysvar_slot_history_find_slot( fd_slot_history_global_t const * history,
186181
ulong slot,
187182
fd_wksp_t * wksp ) {
188183
(void)wksp;
189-
fd_slot_history_inner_global_t * inner = (fd_slot_history_inner_global_t *)((uchar*)&history->bits + history->bits.bits_offset);
190-
if( FD_UNLIKELY( !inner ) ) {
191-
FD_LOG_ERR(( "Unable to find slot history inner" ));
192-
}
193-
ulong * blocks = (ulong *)((uchar*)inner + inner->blocks_offset);
184+
ulong * blocks = (ulong *)((uchar*)history + history->bits_bitvec_offset);
194185
if( FD_UNLIKELY( !blocks ) ) {
195186
FD_LOG_ERR(( "Unable to find slot history blocks" ));
196187
}
197-
ulong blocks_len = inner->blocks_len;
188+
ulong blocks_len = history->bits_bitvec_len;
198189

199190

200191
if( slot > history->next_slot - 1UL ) {

0 commit comments

Comments
 (0)