@@ -813,25 +813,42 @@ where
813
813
}
814
814
815
815
fn send_peer_storage ( & self , their_node_id : PublicKey ) {
816
+ static MAX_PEER_STORAGE_SIZE : usize = 65000 ;
816
817
let random_bytes = self . entropy_source . get_secure_random_bytes ( ) ;
818
+ let random_usize = usize:: from_le_bytes ( random_bytes[ 0 ..8 ] . try_into ( ) . unwrap ( ) ) ;
817
819
818
- // TODO(aditya): Choose n random channels so that peer storage does not exceed 64k.
819
820
let monitors = self . monitors . read ( ) . unwrap ( ) ;
820
821
let mut monitors_list = PeerStorageMonitorHolderList { monitors : Vec :: new ( ) } ;
822
+ let mut curr_size = 0 ;
821
823
822
- for ( chan_id, mon) in monitors. iter ( ) {
824
+ // Randomising Keys in the HashMap to fetch monitors without repetition.
825
+ let mut keys: Vec < & ChannelId > = monitors. keys ( ) . collect ( ) ;
826
+ for i in ( 1 ..keys. len ( ) ) . rev ( ) {
827
+ let j = random_usize % ( i + 1 ) ;
828
+ keys. swap ( i, j) ;
829
+ }
830
+
831
+ for chan_id in keys {
832
+ let mon = & monitors[ chan_id] ;
823
833
let mut ser_chan = VecWriter ( Vec :: new ( ) ) ;
824
834
let min_seen_secret = mon. monitor . get_min_seen_secret ( ) ;
825
835
let counterparty_node_id = mon. monitor . get_counterparty_node_id ( ) ;
826
836
827
837
match write_util ( & mon. monitor . inner . lock ( ) . unwrap ( ) , true , & mut ser_chan) {
828
838
Ok ( _) => {
839
+ let mut ser_channel = Vec :: new ( ) ;
829
840
let peer_storage_monitor = PeerStorageMonitorHolder {
830
841
channel_id : * chan_id,
831
842
min_seen_secret,
832
843
counterparty_node_id,
833
844
monitor_bytes : ser_chan. 0 ,
834
845
} ;
846
+ peer_storage_monitor. write ( & mut ser_channel) . unwrap ( ) ;
847
+
848
+ curr_size += ser_channel. len ( ) ;
849
+ if curr_size > MAX_PEER_STORAGE_SIZE {
850
+ break ;
851
+ }
835
852
836
853
monitors_list. monitors . push ( peer_storage_monitor) ;
837
854
} ,
0 commit comments