2020-09-14 07:44:55 +00:00
|
|
|
package sectorstorage
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/filecoin-project/go-statestore"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/extern/sector-storage/storiface"
|
|
|
|
)
|
|
|
|
|
2020-09-16 15:08:05 +00:00
|
|
|
type workerCallTracker struct {
|
2020-09-14 07:44:55 +00:00
|
|
|
st *statestore.StateStore // by CallID
|
|
|
|
}
|
|
|
|
|
|
|
|
type CallState uint64
|
|
|
|
|
|
|
|
const (
|
|
|
|
CallStarted CallState = iota
|
|
|
|
CallDone
|
|
|
|
// returned -> remove
|
|
|
|
)
|
|
|
|
|
|
|
|
type Call struct {
|
2020-09-21 22:52:33 +00:00
|
|
|
ID storiface.CallID
|
|
|
|
RetType ReturnType
|
|
|
|
|
2020-09-14 07:44:55 +00:00
|
|
|
State CallState
|
|
|
|
|
2020-09-16 22:35:09 +00:00
|
|
|
Result []byte // json bytes
|
2020-09-14 07:44:55 +00:00
|
|
|
}
|
|
|
|
|
2020-09-21 22:52:33 +00:00
|
|
|
func (wt *workerCallTracker) onStart(ci storiface.CallID, rt ReturnType) error {
|
2020-09-14 07:44:55 +00:00
|
|
|
return wt.st.Begin(ci, &Call{
|
2020-09-21 23:00:17 +00:00
|
|
|
ID: ci,
|
|
|
|
RetType: rt,
|
|
|
|
State: CallStarted,
|
2020-09-14 07:44:55 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-09-16 15:08:05 +00:00
|
|
|
func (wt *workerCallTracker) onDone(ci storiface.CallID, ret []byte) error {
|
2020-09-14 07:44:55 +00:00
|
|
|
st := wt.st.Get(ci)
|
|
|
|
return st.Mutate(func(cs *Call) error {
|
|
|
|
cs.State = CallDone
|
|
|
|
cs.Result = ret
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-09-16 15:08:05 +00:00
|
|
|
func (wt *workerCallTracker) onReturned(ci storiface.CallID) error {
|
2020-09-14 07:44:55 +00:00
|
|
|
st := wt.st.Get(ci)
|
|
|
|
return st.End()
|
|
|
|
}
|
2020-09-21 22:52:33 +00:00
|
|
|
|
|
|
|
func (wt *workerCallTracker) unfinished() ([]Call, error) {
|
|
|
|
var out []Call
|
|
|
|
return out, wt.st.List(&out)
|
|
|
|
}
|