@@ -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,52 @@ 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 ( || { 
92+                     anyhow ! ( "sector info not found for sector {}" ,  sector_number) 
93+                 } ) ?; 
94+             f ( sector_number,  & sector_info) 
95+         } ) ?; 
96+         Ok ( ( ) ) 
6097    } 
6198
6299    pub  fn  store ( & mut  self ,  infos :  Vec < SectorOnChainInfo > )  -> anyhow:: Result < ( ) >  { 
63100        for  info in  infos { 
64101            let  sector_number = info. sector_number ; 
65- 
66102            if  sector_number > MAX_SECTOR_NUMBER  { 
67103                return  Err ( anyhow ! ( "sector number {} out of range" ,  info. sector_number) ) ; 
68104            } 
69105
70-             self . amt . set ( sector_number,  info) . map_err ( |e| { 
71-                 e. downcast_wrap ( format ! ( "failed to store sector {}" ,  sector_number) ) 
72-             } ) ?; 
106+             match  self . store . put_cbor ( & info,  Code :: Blake2b256 )  { 
107+                 Ok ( c)  => self . amt . set ( sector_number,  c) . map_err ( |e| { 
108+                     e. downcast_wrap ( format ! ( "failed to store sector {}" ,  sector_number) ) 
109+                 } ) ?, 
110+                 Err ( e)  => return  Err ( anyhow ! ( "failed to store sector {}: {}" ,  sector_number,  e) ) , 
111+             } 
73112        } 
74113
75114        Ok ( ( ) ) 
0 commit comments