@@ -33,14 +33,14 @@ type BuiltinActors struct {
33
33
Metadata BuiltinActorsMetadata
34
34
}
35
35
36
- func NewBuiltinActors (networkName string , loadAllActorVersions bool , lotusApi api.FullNode ) (* BuiltinActors , error ) {
36
+ func NewBuiltinActors (networkName string , lotusApi api.FullNode ) (* BuiltinActors , error ) {
37
37
networkVersion , err := lotusApi .StateNetworkVersion (context .Background (), types .EmptyTSK )
38
38
if err != nil {
39
39
zap .S ().Errorf ("could not get lotus network version!: %s" , err .Error ())
40
40
return nil , err
41
41
}
42
42
43
- actorCids , err := loadActorCids (networkVersion , loadAllActorVersions , lotusApi )
43
+ actorCids , err := loadActorCids (lotusApi )
44
44
if err != nil {
45
45
zap .S ().Errorf ("could not get actors cids!: %s" , err .Error ())
46
46
return nil , err
@@ -57,8 +57,8 @@ func NewBuiltinActors(networkName string, loadAllActorVersions bool, lotusApi ap
57
57
58
58
func (a * BuiltinActors ) IsActor (actorCode cid.Cid , actorName string ) bool {
59
59
// Try the latest actors' version first
60
- for _ , actors := range a .Metadata .ActorsNameCidMapByVersion {
61
- if cid , ok := actors [actorName ]; ok {
60
+ for _ , actorCids := range a .Metadata .ActorsNameCidMapByVersion {
61
+ if cid , ok := actorCids [actorName ]; ok {
62
62
if actorCode == cid {
63
63
return true
64
64
}
@@ -87,15 +87,17 @@ func (a *BuiltinActors) GetActorNameFromCid(actorCode cid.Cid) (string, error) {
87
87
return name , nil
88
88
}
89
89
90
- return UnknownStr , fmt .Errorf ("invalid actor code CID: %s" , actorCode )
90
+ // Fallback: Check all actors
91
+ return a .getActorNameFromCidByVersionFallback (actorCode )
91
92
}
92
93
93
94
func (a * BuiltinActors ) GetActorCid (name string ) (cid.Cid , error ) {
94
95
if cid , ok := a .Metadata .ActorsNameCidMapByVersion [a .Metadata .Version ][name ]; ok {
95
96
return cid , nil
96
97
}
97
98
98
- return cid.Cid {}, fmt .Errorf ("actor '%s' not found in metadata" , name )
99
+ // Fallback: Check all actors
100
+ return a .getActorCidByVersionFallback (name )
99
101
}
100
102
101
103
func (a * BuiltinActors ) GetActorNameFromCidByVersion (actorCode cid.Cid , version network.Version ) (string , error ) {
@@ -112,37 +114,55 @@ func (a *BuiltinActors) GetActorNameFromCidByVersion(actorCode cid.Cid, version
112
114
return name , nil
113
115
}
114
116
115
- return UnknownStr , fmt .Errorf ("invalid actor code CID: %s" , actorCode )
117
+ // Fallback: Check all actors
118
+ return a .getActorNameFromCidByVersionFallback (actorCode )
116
119
}
117
120
118
121
func (a * BuiltinActors ) GetActorCidByVersion (name string , version network.Version ) (cid.Cid , error ) {
119
122
if cid , ok := a .Metadata .ActorsNameCidMapByVersion [version ][name ]; ok {
120
123
return cid , nil
121
124
}
125
+ // Fallback: Check all actors
126
+ return a .getActorCidByVersionFallback (name )
127
+ }
122
128
129
+ func (a * BuiltinActors ) getActorCidByVersionFallback (name string ) (cid.Cid , error ) {
130
+ for _ , actorCids := range a .Metadata .ActorsNameCidMapByVersion {
131
+ for foundName , cid := range actorCids {
132
+ if foundName == name {
133
+ return cid , nil
134
+ }
135
+ }
136
+ }
123
137
return cid.Cid {}, fmt .Errorf ("actor '%s' not found in metadata" , name )
124
138
}
125
139
126
- func loadActorCids (currentNetworkVersion network.Version , loadAllActorVersions bool , lotusApi api.FullNode ) (map [network.Version ]ActorCidMap , error ) {
140
+ func (a * BuiltinActors ) getActorNameFromCidByVersionFallback (actorCode cid.Cid ) (string , error ) {
141
+ for _ , actorCids := range a .Metadata .ActorsNameCidMapByVersion {
142
+ for name , cid := range actorCids {
143
+ if actorCode == cid {
144
+ return name , nil
145
+ }
146
+ }
147
+ }
148
+ return UnknownStr , fmt .Errorf ("invalid actor code CID: %s" , actorCode )
149
+ }
150
+
151
+ func loadActorCids (lotusApi api.FullNode ) (map [network.Version ]ActorCidMap , error ) {
152
+ zap .S ().Info ("loading all actor versions" )
127
153
var (
128
154
numWorkers = 5
129
- networkVersions []network.Version
155
+ networkVersions = make ( []network.Version , LatestVersion + 1 )
130
156
actorCidsMap = make (map [network.Version ]ActorCidMap )
131
157
)
132
158
133
- if loadAllActorVersions {
134
- zap .S ().Info ("loading all actor versions" )
135
- networkVersions = make ([]network.Version , LatestVersion + 1 )
136
- for i := network .Version0 ; i <= LatestVersion ; i ++ {
137
- networkVersions [i ] = i
138
- }
139
- } else {
140
- zap .S ().Info ("loading current actor version" )
141
- networkVersions = []network.Version {currentNetworkVersion }
159
+ for i := network .Version0 ; i <= LatestVersion ; i ++ {
160
+ networkVersions [i ] = i
142
161
}
143
162
144
163
versionChannel := make (chan network.Version , len (networkVersions ))
145
164
actorCidsChannel := make (chan map [network.Version ]ActorCidMap )
165
+ errChannel := make (chan error )
146
166
147
167
for i := 0 ; i < numWorkers ; i ++ {
148
168
go func (i int ) {
@@ -151,7 +171,8 @@ func loadActorCids(currentNetworkVersion network.Version, loadAllActorVersions b
151
171
actorCids , err := lotusApi .StateActorCodeCIDs (context .Background (), version )
152
172
if err != nil {
153
173
zap .S ().Errorf ("worker %d: error loading actor cids for version %d: %s" , i , version , err .Error ())
154
- actorCids = ActorCidMap {}
174
+ errChannel <- err
175
+ return
155
176
}
156
177
actorCidsChannel <- map [network.Version ]ActorCidMap {version : actorCids }
157
178
}
@@ -163,17 +184,31 @@ func loadActorCids(currentNetworkVersion network.Version, loadAllActorVersions b
163
184
}
164
185
165
186
var received int
166
- for actorCids := range actorCidsChannel {
167
- for version , actors := range actorCids {
168
- actorCidsMap [version ] = actors
187
+ var err error
188
+ for {
189
+ select {
190
+ case actorCids := <- actorCidsChannel :
191
+ for version , actors := range actorCids {
192
+ actorCidsMap [version ] = actors
193
+ }
194
+ received ++
195
+
196
+ case mErr := <- errChannel :
197
+ err = mErr
169
198
}
170
- received ++
171
- if received == len (networkVersions ) {
199
+
200
+ if received == len (networkVersions ) || err != nil {
172
201
break
173
202
}
174
203
}
204
+
175
205
close (versionChannel )
206
+ close (errChannel )
176
207
close (actorCidsChannel )
177
208
209
+ if err != nil {
210
+ return nil , err
211
+ }
212
+
178
213
return actorCidsMap , nil
179
214
}
0 commit comments