@@ -10,18 +10,21 @@ use fil_actors_runtime::{actor_error, ActorDowncast, ActorError, Array, AsActorE
10
10
use fvm_ipld_amt:: Error as AmtError ;
11
11
use fvm_ipld_bitfield:: BitField ;
12
12
use fvm_ipld_blockstore:: Blockstore ;
13
+ use fvm_ipld_encoding:: CborStore ;
13
14
use fvm_shared:: error:: ExitCode ;
14
15
use fvm_shared:: sector:: SectorNumber ;
16
+ use multihash_codetable:: Code ;
15
17
16
18
use super :: SectorOnChainInfo ;
17
19
18
20
pub struct Sectors < ' db , BS > {
19
- pub amt : Array < ' db , SectorOnChainInfo , BS > ,
21
+ pub amt : Array < ' db , Cid , BS > ,
22
+ store : & ' db BS ,
20
23
}
21
24
22
25
impl < ' db , BS : Blockstore > Sectors < ' db , BS > {
23
26
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 } )
25
28
}
26
29
27
30
pub fn load_sector (
@@ -30,7 +33,7 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
30
33
) -> Result < Vec < SectorOnChainInfo > , ActorError > {
31
34
let mut sector_infos: Vec < SectorOnChainInfo > = Vec :: new ( ) ;
32
35
for sector_number in sector_numbers. iter ( ) {
33
- let sector_on_chain = self
36
+ let c = self
34
37
. amt
35
38
. get ( sector_number)
36
39
. map_err ( |e| {
@@ -41,6 +44,16 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
41
44
} ) ?
42
45
. cloned ( )
43
46
. 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) ) ?;
44
57
sector_infos. push ( sector_on_chain) ;
45
58
}
46
59
Ok ( sector_infos)
@@ -50,26 +63,50 @@ impl<'db, BS: Blockstore> Sectors<'db, BS> {
50
63
& self ,
51
64
sector_number : SectorNumber ,
52
65
) -> 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 ( ( ) )
60
95
}
61
96
62
97
pub fn store ( & mut self , infos : Vec < SectorOnChainInfo > ) -> anyhow:: Result < ( ) > {
63
98
for info in infos {
64
99
let sector_number = info. sector_number ;
65
-
66
100
if sector_number > MAX_SECTOR_NUMBER {
67
101
return Err ( anyhow ! ( "sector number {} out of range" , info. sector_number) ) ;
68
102
}
69
103
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
+ }
73
110
}
74
111
75
112
Ok ( ( ) )
0 commit comments