2023-11-03 12:51:01 +00:00
package lpwindow
import (
2023-11-03 20:53:15 +00:00
"context"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
2023-11-03 12:51:01 +00:00
"github.com/filecoin-project/lotus/lib/harmony/harmonytask"
"github.com/filecoin-project/lotus/lib/harmony/resources"
2023-11-03 20:53:15 +00:00
"github.com/filecoin-project/lotus/lib/promise"
"github.com/filecoin-project/lotus/provider/chainsched"
"github.com/filecoin-project/lotus/provider/lpmessage"
2023-11-03 12:51:01 +00:00
)
type WdPostSubmitTask struct {
2023-11-03 20:53:15 +00:00
sender * lpmessage . Sender
db * harmonydb . DB
submitPoStTF promise . Promise [ harmonytask . AddTaskFunc ]
2023-11-03 12:51:01 +00:00
}
func ( w * WdPostSubmitTask ) Do ( taskID harmonytask . TaskID , stillOwned func ( ) bool ) ( done bool , err error ) {
//TODO implement me
panic ( "implement me" )
}
func ( w * WdPostSubmitTask ) CanAccept ( ids [ ] harmonytask . TaskID , engine * harmonytask . TaskEngine ) ( * harmonytask . TaskID , error ) {
2023-11-03 21:00:19 +00:00
if len ( ids ) == 0 {
// probably can't happen, but panicking is bad
return nil , nil
}
if w . sender == nil {
// we can't send messages
return nil , nil
}
return & ids [ 0 ] , nil
2023-11-03 12:51:01 +00:00
}
2023-11-03 20:53:15 +00:00
func NewWdPostSubmitTask ( pcs * chainsched . ProviderChainSched , send * lpmessage . Sender ) ( * WdPostSubmitTask , error ) {
res := & WdPostSubmitTask {
sender : send ,
}
if err := pcs . AddHandler ( res . processHeadChange ) ; err != nil {
return nil , err
}
return res , nil
}
2023-11-03 12:51:01 +00:00
func ( w * WdPostSubmitTask ) TypeDetails ( ) harmonytask . TaskTypeDetails {
return harmonytask . TaskTypeDetails {
Max : 128 ,
Name : "WdPostSubmit" ,
Cost : resources . Resources {
Cpu : 0 ,
Gpu : 0 ,
2023-11-03 20:53:15 +00:00
Ram : 10 << 20 ,
2023-11-03 12:51:01 +00:00
} ,
MaxFailures : 10 ,
Follows : nil , // ??
}
}
func ( w * WdPostSubmitTask ) Adder ( taskFunc harmonytask . AddTaskFunc ) {
2023-11-03 20:53:15 +00:00
w . submitPoStTF . Set ( taskFunc )
}
func ( w * WdPostSubmitTask ) processHeadChange ( ctx context . Context , revert , apply * types . TipSet ) error {
tf := w . submitPoStTF . Val ( ctx )
qry , err := w . db . Query ( ctx , ` select sp_id, deadline, partition, submit_at_epoch from wdpost_proofs where submit_task_id is null and submit_at_epoch <= $1 ` , apply . Height ( ) )
if err != nil {
return err
}
defer qry . Close ( )
for qry . Next ( ) {
var spID int64
var deadline uint64
var partition uint64
var submitAtEpoch uint64
if err := qry . Scan ( & spID , & deadline , & partition , & submitAtEpoch ) ; err != nil {
return err
}
tf ( func ( id harmonytask . TaskID , tx * harmonydb . Tx ) ( shouldCommit bool , err error ) {
// update in transaction iff submit_task_id is still null
res , err := tx . Exec ( ` update wdpost_proofs set submit_task_id = $1 where sp_id = $2 and deadline = $3 and partition = $4 and submit_task_id is null ` , id , spID , deadline , partition )
if err != nil {
return false , err
}
if res != 1 {
return false , nil
}
return true , nil
} )
}
if err := qry . Err ( ) ; err != nil {
return err
}
return nil
2023-11-03 12:51:01 +00:00
}
var _ harmonytask . TaskInterface = & WdPostSubmitTask { }