@@ -10,6 +10,7 @@ import (
10
10
"github.com/ipfs/go-cid"
11
11
cbor "github.com/ipfs/go-ipld-cbor"
12
12
logging "github.com/ipfs/go-log/v2"
13
+ "go.uber.org/multierr"
13
14
"golang.org/x/xerrors"
14
15
15
16
"github.com/filecoin-project/go-address"
@@ -129,9 +130,10 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done
129
130
var pieces []struct {
130
131
Manifest json.RawMessage `db:"direct_piece_activation_manifest"`
131
132
Size int64 `db:"piece_size"`
133
+ Start int64 `db:"direct_start_epoch"`
132
134
}
133
135
err = s .db .Select (ctx , & pieces , `
134
- SELECT direct_piece_activation_manifest, piece_size
136
+ SELECT direct_piece_activation_manifest, piece_size, direct_start_epoch
135
137
FROM sectors_snap_initial_pieces
136
138
WHERE sp_id = $1 AND sector_number = $2 ORDER BY piece_index ASC` , update .SpID , update .SectorNumber )
137
139
if err != nil {
@@ -143,23 +145,55 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done
143
145
return false , xerrors .Errorf ("getting chain head: %w" , err )
144
146
}
145
147
148
+ maddr , err := address .NewIDAddress (uint64 (update .SpID ))
149
+ if err != nil {
150
+ return false , xerrors .Errorf ("parsing miner address: %w" , err )
151
+ }
152
+
153
+ snum := abi .SectorNumber (update .SectorNumber )
154
+
155
+ onChainInfo , err := s .api .StateSectorGetInfo (ctx , maddr , snum , ts .Key ())
156
+ if err != nil {
157
+ return false , xerrors .Errorf ("getting sector info: %w" , err )
158
+ }
159
+ if onChainInfo == nil {
160
+ return false , xerrors .Errorf ("sector not found on chain" )
161
+ }
162
+
146
163
var pams []miner.PieceActivationManifest
147
164
var weight , weightVerif = big .Zero (), big .Zero ()
165
+ var minStart abi.ChainEpoch
148
166
for _ , piece := range pieces {
149
167
var pam * miner.PieceActivationManifest
150
168
err = json .Unmarshal (piece .Manifest , & pam )
151
169
if err != nil {
152
170
return false , xerrors .Errorf ("marshalling json to PieceManifest: %w" , err )
153
171
}
154
- err = seal .AllocationCheck (ctx , s .api , pam , nil , abi .ActorID (update .SpID ), ts )
172
+ unrecoverable , err : = seal .AllocationCheck (ctx , s .api , pam , onChainInfo . Expiration , abi .ActorID (update .SpID ), ts )
155
173
if err != nil {
174
+ if unrecoverable {
175
+ _ , err2 := s .db .Exec (ctx , `UPDATE sectors_snap_pipeline SET
176
+ failed = TRUE, failed_at = NOW(), failed_reason = 'alloc-check', failed_reason_msg = $1,
177
+ task_id_submit = NULL, after_submit = FALSE
178
+ WHERE sp_id = $2 AND sector_number = $3` , err .Error (), update .SpID , update .SectorNumber )
179
+
180
+ log .Errorw ("allocation check failed with an unrecoverable issue" , "sp" , update .SpID , "sector" , update .SectorNumber , "err" , err )
181
+ return true , xerrors .Errorf ("allocation check failed with an unrecoverable issue: %w" , multierr .Combine (err , err2 ))
182
+ }
183
+
156
184
return false , err
157
185
}
158
186
187
+ pieceWeight := big .Mul (abi .NewStoragePower (piece .Size ), big .NewInt (int64 (onChainInfo .Expiration - ts .Height ())))
188
+
159
189
if pam .VerifiedAllocationKey != nil {
160
- weightVerif = big .Add (weightVerif , abi . NewStoragePower ( piece . Size ) )
190
+ weightVerif = big .Add (weightVerif , pieceWeight )
161
191
} else {
162
- weight = big .Add (weight , abi .NewStoragePower (piece .Size ))
192
+ weight = big .Add (weight , pieceWeight )
193
+ }
194
+
195
+ if minStart == 0 || abi .ChainEpoch (piece .Start ) < minStart {
196
+ minStart = abi .ChainEpoch (piece .Start )
163
197
}
164
198
165
199
pams = append (pams , * pam )
@@ -170,13 +204,6 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done
170
204
return false , xerrors .Errorf ("parsing new sealed cid: %w" , err )
171
205
}
172
206
173
- maddr , err := address .NewIDAddress (uint64 (update .SpID ))
174
- if err != nil {
175
- return false , xerrors .Errorf ("parsing miner address: %w" , err )
176
- }
177
-
178
- snum := abi .SectorNumber (update .SectorNumber )
179
-
180
207
sl , err := s .api .StateSectorPartition (ctx , maddr , snum , types .EmptyTSK )
181
208
if err != nil {
182
209
return false , xerrors .Errorf ("getting sector location: %w" , err )
@@ -210,14 +237,6 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done
210
237
return false , xerrors .Errorf ("getting miner info: %w" , err )
211
238
}
212
239
213
- onChainInfo , err := s .api .StateSectorGetInfo (ctx , maddr , snum , ts .Key ())
214
- if err != nil {
215
- return false , xerrors .Errorf ("getting sector info: %w" , err )
216
- }
217
- if onChainInfo == nil {
218
- return false , xerrors .Errorf ("sector not found on chain" )
219
- }
220
-
221
240
ssize , err := onChainInfo .SealProof .SectorSize ()
222
241
if err != nil {
223
242
return false , xerrors .Errorf ("getting sector size: %w" , err )
@@ -255,7 +274,18 @@ func (s *SubmitTask) Do(taskID harmonytask.TaskID, stillOwned func() bool) (done
255
274
256
275
mcid , err := s .sender .Send (ctx , msg , mss , "update" )
257
276
if err != nil {
258
- return false , xerrors .Errorf ("pushing message to mpool: %w" , err )
277
+ if minStart != 0 && ts .Height () > minStart {
278
+ _ , err2 := s .db .Exec (ctx , `UPDATE sectors_snap_pipeline SET
279
+ failed = TRUE, failed_at = NOW(), failed_reason = 'start-expired', failed_reason_msg = $1,
280
+ task_id_submit = NULL, after_submit = FALSE
281
+ WHERE sp_id = $2 AND sector_number = $3` , err .Error (), update .SpID , update .SectorNumber )
282
+
283
+ log .Errorw ("failed to push message to mpool (beyond deal start epoch)" , "sp" , update .SpID , "sector" , update .SectorNumber , "err" , err )
284
+
285
+ return true , xerrors .Errorf ("pushing message to mpool (beyond deal start epoch): %w" , multierr .Combine (err , err2 ))
286
+ }
287
+
288
+ return false , xerrors .Errorf ("pushing message to mpool (minStart %d, timeTo %d): %w" , minStart , minStart - ts .Height (), err )
259
289
}
260
290
261
291
_ , err = s .db .Exec (ctx , `UPDATE sectors_snap_pipeline SET prove_msg_cid = $1, task_id_submit = NULL, after_submit = TRUE WHERE task_id_submit = $2` , mcid .String (), taskID )
@@ -364,7 +394,7 @@ func (s *SubmitTask) schedule(ctx context.Context, taskFunc harmonytask.AddTaskF
364
394
SectorNumber int64 `db:"sector_number"`
365
395
}
366
396
367
- err := s .db .Select (ctx , & tasks , `SELECT sp_id, sector_number FROM sectors_snap_pipeline WHERE after_encode = TRUE AND after_prove = TRUE AND after_submit = FALSE AND task_id_submit IS NULL` )
397
+ err := s .db .Select (ctx , & tasks , `SELECT sp_id, sector_number FROM sectors_snap_pipeline WHERE failed = FALSE AND after_encode = TRUE AND after_prove = TRUE AND after_submit = FALSE AND task_id_submit IS NULL` )
368
398
if err != nil {
369
399
return false , xerrors .Errorf ("getting tasks: %w" , err )
370
400
}
0 commit comments