|
5 | 5 |
|
6 | 6 | using namespace pc;
|
7 | 7 |
|
8 |
| -class manager_slot : public manager |
| 8 | +#define PC_LEADER_MAX 256 |
| 9 | +#define PC_LEADER_MIN 32 |
| 10 | + |
| 11 | +class manager_slot : public manager, |
| 12 | + public rpc_sub_i<rpc::get_slot_leaders> |
9 | 13 | {
|
10 | 14 | public:
|
| 15 | + manager_slot(); |
11 | 16 | void on_response( rpc::slot_subscribe * ) override;
|
| 17 | + void on_response( rpc::get_slot_leaders * ) override; |
| 18 | +private: |
| 19 | + rpc::get_slot_leaders ldr_[1]; |
| 20 | + uint64_t last_; |
12 | 21 | };
|
13 | 22 |
|
| 23 | +manager_slot::manager_slot() |
| 24 | +: last_( 0L ) |
| 25 | +{ |
| 26 | + ldr_->set_sub( this ); |
| 27 | + ldr_->set_limit( PC_LEADER_MAX ); |
| 28 | +} |
| 29 | + |
14 | 30 | void manager_slot::on_response( rpc::slot_subscribe *res )
|
15 | 31 | {
|
16 | 32 | manager::on_response( res );
|
17 |
| - std::cout << get_curr_time() |
18 |
| - << ',' |
19 |
| - << res->get_slot() |
20 |
| - << std::endl; |
| 33 | + uint64_t slot = get_slot(); |
| 34 | + if ( slot != last_ ) { |
| 35 | + // request next slot leader schedule |
| 36 | + if ( PC_UNLIKELY( ldr_->get_is_recv() && |
| 37 | + slot > ldr_->get_last_slot() - PC_LEADER_MIN ) ) { |
| 38 | + ldr_->set_slot( slot ); |
| 39 | + get_rpc_client()->send( ldr_ ); |
| 40 | + } |
| 41 | + |
| 42 | + // ignore first time |
| 43 | + if ( !last_ ) { |
| 44 | + last_ = slot; |
| 45 | + return; |
| 46 | + } |
| 47 | + |
| 48 | + // get leader for this slot |
| 49 | + std::string pstr; |
| 50 | + pub_key *pkey = ldr_->get_leader( slot ); |
| 51 | + if ( pkey ) { |
| 52 | + pkey->enc_base58( pstr ); |
| 53 | + } |
| 54 | + std::cout << get_curr_time() |
| 55 | + << ',' |
| 56 | + << slot |
| 57 | + << ',' |
| 58 | + << pstr |
| 59 | + << std::endl; |
| 60 | + last_ = slot; |
| 61 | + } |
| 62 | +} |
| 63 | + |
| 64 | +void manager_slot::on_response( rpc::get_slot_leaders *m ) |
| 65 | +{ |
| 66 | + if ( m->get_is_err() ) { |
| 67 | + set_err_msg( "failed to get slot leaders [" |
| 68 | + + m->get_err_msg() + "]" ); |
| 69 | + return; |
| 70 | + } |
21 | 71 | }
|
22 | 72 |
|
23 | 73 | std::string get_rpc_host()
|
@@ -66,6 +116,7 @@ int main( int argc, char **argv )
|
66 | 116 | mgr.set_rpc_host( rpc_host );
|
67 | 117 | mgr.set_dir( key_dir );
|
68 | 118 | mgr.set_do_tx( false );
|
| 119 | + std::cout << "recv_time,slot,leader" << std::endl; |
69 | 120 | if ( !mgr.init() || !mgr.bootstrap() ) {
|
70 | 121 | std::cerr << "test_slot: " << mgr.get_err_msg() << std::endl;
|
71 | 122 | return 1;
|
|
0 commit comments