@@ -7,7 +7,6 @@ use constants::*;
77use futures:: { Stream , StreamExt } ;
88use solana_transaction_status:: UiTransactionEncoding ;
99use tokio:: sync:: Mutex ;
10- use tokio:: time:: timeout;
1110use std:: time:: Duration ;
1211use tracing:: { error, info, warn} ;
1312use types:: * ;
@@ -65,7 +64,6 @@ mod nft;
6564const METAPLEX_PROGRAM_ID : & str = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" ;
6665
6766const FEE_CAP : u64 = 20000 ;
68- const RESTART_SUBSCRIPTION_TIMEOUT_SECS : u64 = 180 ;
6967
7068const PLAYERS_REG_HEAD_LEN : usize = 152 ;
7169const PLAYERS_REG_INIT_LEN : usize = PLAYERS_REG_HEAD_LEN + 4 ;
@@ -1233,9 +1231,8 @@ impl TransportT for SolanaTransport {
12331231 }
12341232 } ;
12351233
1236- while let Ok ( Some ( rpc_response) ) = timeout(
1237- Duration :: from_secs( RESTART_SUBSCRIPTION_TIMEOUT_SECS ) , stream. next( )
1238- ) . await {
1234+ info!( "Start the subscription for {}" , addr) ;
1235+ while let Some ( rpc_response) = stream. next( ) . await {
12391236 let ui_account: UiAccount = rpc_response. value;
12401237
12411238 let Some ( data) = ui_account. data. decode( ) else {
@@ -1259,16 +1256,31 @@ impl TransportT for SolanaTransport {
12591256 }
12601257 } ;
12611258
1262- let ( game_state, players_reg) = match self . internal_get_game_state_and_players_reg_state(
1263- & game_account_pubkey,
1264- & state. players_reg_account,
1265- ) . await {
1266- Ok ( ( game_state, players_reg) ) => ( game_state, players_reg) ,
1267- Err ( e) => {
1268- error!( "Get players reg error: {}" , e. to_string( ) ) ;
1269- unsub( ) . await ;
1270- return ;
1271- }
1259+ info!( "GameState From Sub, versions #A{}#S{}" , state. access_version, state. settle_version) ;
1260+
1261+
1262+ // We have to make sure the we get the data that is as new as the one from subscription
1263+ // So we keep checking their access_version and settle_version.
1264+ let ( game_state, players_reg) = loop {
1265+ match self . internal_get_game_state_and_players_reg_state(
1266+ & game_account_pubkey,
1267+ & state. players_reg_account,
1268+ ) . await {
1269+ Ok ( ( game_state, players_reg) ) => {
1270+ info!( "GameState From Query, versions #A{}#S{}" , game_state. access_version, game_state. settle_version) ;
1271+ if game_state. access_version != state. access_version
1272+ || game_state. settle_version != state. settle_version {
1273+ info!( "Retry query" ) ;
1274+ continue ;
1275+ }
1276+ break ( game_state, players_reg)
1277+ }
1278+ Err ( e) => {
1279+ error!( "Get players reg error: {}" , e. to_string( ) ) ;
1280+ unsub( ) . await ;
1281+ return ;
1282+ }
1283+ } ;
12721284 } ;
12731285
12741286 let players = players_reg. players;
@@ -1288,6 +1300,7 @@ impl TransportT for SolanaTransport {
12881300 // We restart subscription regularly to avoid broken connection.
12891301 // A broken connection is the case where the connection is established,
12901302 // no error raises, but no further update is delivered.
1303+ info!( "Stop the subscription for {}" , addr) ;
12911304 unsub( ) . await ;
12921305 return ;
12931306 } ) )
0 commit comments