/
executionstate.go
68 lines (53 loc) · 1.51 KB
/
executionstate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package logicrunner
import (
"sync"
"github.com/pkg/errors"
"github.com/insolar/insolar/core/message"
)
type ExecutionState struct {
sync.Mutex
Ref Ref
objectbody *ObjectBody
deactivate bool
nonce uint64
Behaviour ValidationBehaviour
Current *CurrentExecution
Queue []ExecutionQueueElement
QueueProcessorActive bool
LedgerHasMoreRequests bool
LedgerQueueElement *ExecutionQueueElement
getLedgerPendingMutex sync.Mutex
// TODO not using in validation, need separate ObjectState.ExecutionState and ObjectState.Validation from ExecutionState struct
pending message.PendingState
PendingConfirmed bool
HasPendingCheckMutex sync.Mutex
}
func (es *ExecutionState) WrapError(err error, message string) error {
if err == nil {
err = errors.New(message)
} else {
err = errors.Wrap(err, message)
}
res := Error{Err: err}
if es.objectbody != nil {
res.Contract = es.objectbody.objDescriptor.HeadRef()
}
if es.Current != nil {
res.Request = es.Current.Request
}
return res
}
// releaseQueue must be calling only with es.Lock
func (es *ExecutionState) releaseQueue() ([]ExecutionQueueElement, bool) {
ledgerHasMoreRequest := false
q := es.Queue
if len(q) > maxQueueLength {
q = q[:maxQueueLength]
ledgerHasMoreRequest = true
}
es.Queue = make([]ExecutionQueueElement, 0)
return q, ledgerHasMoreRequest
}
func (es *ExecutionState) haveSomeToProcess() bool {
return len(es.Queue) > 0 || es.LedgerHasMoreRequests || es.LedgerQueueElement != nil
}