@@ -10,18 +10,21 @@ use fil_actors_runtime::{actor_error, ActorDowncast, ActorError, Array, AsActorE
1010use fvm_ipld_amt:: Error as AmtError ;
1111use fvm_ipld_bitfield:: BitField ;
1212use fvm_ipld_blockstore:: Blockstore ;
13+ use fvm_ipld_encoding:: CborStore ;
1314use fvm_shared:: error:: ExitCode ;
1415use fvm_shared:: sector:: SectorNumber ;
16+ use multihash_codetable:: Code ;
1517
1618use super :: SectorOnChainInfo ;
1719
1820pub struct Sectors < ' db , BS > {
19- pub amt : Array < ' db , SectorOnChainInfo , BS > ,
21+ pub amt : Array < ' db , Cid , BS > ,
22+ store : & ' db BS ,
2023}
2124
2225impl < ' db , BS : Blockstore > Sectors < ' db , BS > {
2326 pub fn load ( store : & ' db BS , root : & Cid ) -> Result < Self , AmtError > {
24- Ok ( Self { amt : Array :: load ( root, store) ? } )
27+ Ok ( Self { amt : Array :: load ( root, store) ?, store } )
2528 }
2629
2730 pub fn load_sector (
@@ -30,7 +33,7 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
3033 ) -> Result < Vec < SectorOnChainInfo > , ActorError > {
3134 let mut sector_infos: Vec < SectorOnChainInfo > = Vec :: new ( ) ;
3235 for sector_number in sector_numbers. iter ( ) {
33- let sector_on_chain = self
36+ let c = self
3437 . amt
3538 . get ( sector_number)
3639 . map_err ( |e| {
@@ -41,6 +44,16 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
4144 } ) ?
4245 . cloned ( )
4346 . ok_or_else ( || actor_error ! ( not_found; "sector not found: {}" , sector_number) ) ?;
47+ let sector_on_chain = self
48+ . store
49+ . get_cbor :: < SectorOnChainInfo > ( & c)
50+ . map_err ( |e| {
51+ e. downcast_default (
52+ ExitCode :: USR_ILLEGAL_STATE ,
53+ format ! ( "failed to load sector {}" , sector_number) ,
54+ )
55+ } ) ?
56+ . ok_or_else ( || actor_error ! ( not_found; "sector not found: {}" , sector_number) ) ?;
4457 sector_infos. push ( sector_on_chain) ;
4558 }
4659 Ok ( sector_infos)
@@ -50,26 +63,50 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
5063 & self ,
5164 sector_number : SectorNumber ,
5265 ) -> Result < Option < SectorOnChainInfo > , ActorError > {
53- Ok ( self
54- . amt
55- . get ( sector_number)
56- . with_context_code ( ExitCode :: USR_ILLEGAL_STATE , || {
57- format ! ( "failed to get sector {}" , sector_number)
58- } ) ?
59- . cloned ( ) )
66+ match self . amt . get ( sector_number) . with_context_code ( ExitCode :: USR_ILLEGAL_STATE , || {
67+ format ! ( "failed to get sector {}" , sector_number)
68+ } ) ? {
69+ Some ( c) => match self . store . get_cbor :: < SectorOnChainInfo > ( c) {
70+ Ok ( Some ( sector_info) ) => Ok ( Some ( sector_info) ) ,
71+ Ok ( None ) => Ok ( None ) ,
72+ Err ( e) => Err ( e. downcast_default (
73+ ExitCode :: USR_ILLEGAL_STATE ,
74+ format ! ( "failed to load sector {}" , sector_number) ,
75+ ) ) ,
76+ } ,
77+ None => Ok ( None ) ,
78+ }
79+ }
80+
81+ pub fn for_each < F > ( & self , mut f : F ) -> anyhow:: Result < ( ) >
82+ where
83+ F : FnMut ( SectorNumber , & SectorOnChainInfo ) -> anyhow:: Result < ( ) > ,
84+ {
85+ self . amt . for_each ( |i, c| {
86+ let sector_number = i as SectorNumber ;
87+ let sector_info = self
88+ . store
89+ . get_cbor :: < SectorOnChainInfo > ( c)
90+ . map_err ( |e| anyhow ! ( e. to_string( ) ) ) ?
91+ . ok_or_else ( || anyhow ! ( "sector info not found for sector {}" , sector_number) ) ?;
92+ f ( sector_number, & sector_info)
93+ } ) ?;
94+ Ok ( ( ) )
6095 }
6196
6297 pub fn store ( & mut self , infos : Vec < SectorOnChainInfo > ) -> anyhow:: Result < ( ) > {
6398 for info in infos {
6499 let sector_number = info. sector_number ;
65-
66100 if sector_number > MAX_SECTOR_NUMBER {
67101 return Err ( anyhow ! ( "sector number {} out of range" , info. sector_number) ) ;
68102 }
69103
70- self . amt . set ( sector_number, info) . map_err ( |e| {
71- e. downcast_wrap ( format ! ( "failed to store sector {}" , sector_number) )
72- } ) ?;
104+ match self . store . put_cbor ( & info, Code :: Blake2b256 ) {
105+ Ok ( c) => self . amt . set ( sector_number, c) . map_err ( |e| {
106+ e. downcast_wrap ( format ! ( "failed to store sector {}" , sector_number) )
107+ } ) ?,
108+ Err ( e) => return Err ( anyhow ! ( "failed to store sector {}: {}" , sector_number, e) ) ,
109+ }
73110 }
74111
75112 Ok ( ( ) )
0 commit comments