11package ethwal
22
3- import "io"
3+ import (
4+ "context"
5+ "io"
6+ "sync"
7+ "time"
8+ )
49
510type FileRollPolicy interface {
611 ShouldRoll () bool
712 Reset ()
8- }
9-
10- type FileSizeRollPolicy interface {
11- FileRollPolicy
12-
13- WrapWriter (w io.Writer ) io.Writer
14- }
1513
16- type LastBlockNumberRollPolicy interface {
17- FileRollPolicy
18-
19- LastBlockNum (blockNum uint64 )
14+ onWrite (data []byte )
15+ onBlockProcessed (blockNum uint64 )
2016}
2117
2218type fileSizeRollPolicy struct {
23- maxSize uint64
24- stats * fileStats
19+ maxSize uint64
20+ bytesWritten uint64
2521}
2622
27- func NewFileSizeRollPolicy (maxSize uint64 ) FileSizeRollPolicy {
23+ func NewFileSizeRollPolicy (maxSize uint64 ) FileRollPolicy {
2824 return & fileSizeRollPolicy {maxSize : maxSize }
2925}
3026
31- func (p * fileSizeRollPolicy ) WrapWriter (w io.Writer ) io.Writer {
32- p .stats = & fileStats {Writer : w }
33- return p .stats
34- }
35-
3627func (p * fileSizeRollPolicy ) ShouldRoll () bool {
37- return p .stats . BytesWritten >= p .maxSize
28+ return p .bytesWritten >= p .maxSize
3829}
3930
4031func (p * fileSizeRollPolicy ) Reset () {
41- p .stats = & fileStats {}
32+ p .bytesWritten = 0
33+ }
34+
35+ func (p * fileSizeRollPolicy ) onWrite (data []byte ) {
36+ p .bytesWritten += uint64 (len (data ))
4237}
4338
39+ func (p * fileSizeRollPolicy ) onBlockProcessed (blockNum uint64 ) {}
40+
4441// fileStats is a writer that keeps track of the number of bytes written to it.
45- type fileStats struct {
42+ type writerWrapper struct {
4643 io.Writer
47- BytesWritten uint64
44+
45+ fsrp FileRollPolicy
4846}
4947
50- func (w * fileStats ) Write (p []byte ) (n int , err error ) {
51- n , err = w .Writer .Write (p )
52- w .BytesWritten += uint64 (n )
53- return
48+ func (w * writerWrapper ) Write (p []byte ) (n int , err error ) {
49+ defer w .fsrp .onWrite (p )
50+ return w .Writer .Write (p )
5451}
5552
5653type lastBlockNumberRollPolicy struct {
@@ -59,7 +56,9 @@ type lastBlockNumberRollPolicy struct {
5956 lastBlockNum uint64
6057}
6158
62- func NewLastBlockNumberRollPolicy (rollInterval uint64 ) LastBlockNumberRollPolicy {
59+ func (l * lastBlockNumberRollPolicy ) onWrite (data []byte ) {}
60+
61+ func NewLastBlockNumberRollPolicy (rollInterval uint64 ) FileRollPolicy {
6362 return & lastBlockNumberRollPolicy {rollInterval : rollInterval }
6463}
6564
@@ -71,27 +70,70 @@ func (l *lastBlockNumberRollPolicy) Reset() {
7170 // noop
7271}
7372
74- func (l * lastBlockNumberRollPolicy ) LastBlockNum (blockNum uint64 ) {
73+ func (l * lastBlockNumberRollPolicy ) onBlockProcessed (blockNum uint64 ) {
7574 l .lastBlockNum = blockNum
7675}
7776
78- type fileSizeOrLastBlockNumberRollPolicy struct {
79- FileSizeRollPolicy
80- LastBlockNumberRollPolicy
77+ type timeBasedRollPolicy struct {
78+ rollInterval time.Duration
79+ onError func (err error )
80+
81+ rollFunc func () error
82+
83+ bgCtx context.Context
84+ bgCancel context.CancelFunc
85+
86+ lastTimeRolled time.Time
87+
88+ mu sync.Mutex
89+ }
90+
91+ func NewTimeBasedRollPolicy (rollInterval time.Duration , onError func (err error )) FileRollPolicy {
92+ return & timeBasedRollPolicy {rollInterval : rollInterval , lastTimeRolled : time .Now (), onError : onError }
93+ }
94+
95+ func (t * timeBasedRollPolicy ) ShouldRoll () bool {
96+ if time .Since (t .lastTimeRolled ) >= t .rollInterval {
97+ return true
98+ }
99+ return false
100+ }
101+
102+ func (t * timeBasedRollPolicy ) Reset () {
103+ t .lastTimeRolled = time .Now ()
104+ }
105+
106+ func (t * timeBasedRollPolicy ) onWrite (data []byte ) {}
107+
108+ func (t * timeBasedRollPolicy ) onBlockProcessed (blockNum uint64 ) {}
109+
110+ type FileRollPolicies []FileRollPolicy
111+
112+ func (policies FileRollPolicies ) ShouldRoll () bool {
113+ for _ , p := range policies {
114+ if p .ShouldRoll () {
115+ return true
116+ }
117+ }
118+ return false
81119}
82120
83- func NewFileSizeOrLastBlockNumberRollPolicy (maxSize , rollInterval uint64 ) FileRollPolicy {
84- return & fileSizeOrLastBlockNumberRollPolicy {
85- FileSizeRollPolicy : NewFileSizeRollPolicy (maxSize ),
86- LastBlockNumberRollPolicy : NewLastBlockNumberRollPolicy (rollInterval ),
121+ func (policies FileRollPolicies ) Reset () {
122+ for _ , p := range policies {
123+ p .Reset ()
87124 }
88125}
89126
90- func (f * fileSizeOrLastBlockNumberRollPolicy ) ShouldRoll () bool {
91- return f .FileSizeRollPolicy .ShouldRoll () || f .LastBlockNumberRollPolicy .ShouldRoll ()
127+ func (policies FileRollPolicies ) onWrite (data []byte ) {
128+ for _ , p := range policies {
129+ p .onWrite (data )
130+ }
92131}
93132
94- func (f * fileSizeOrLastBlockNumberRollPolicy ) Reset () {
95- f .FileSizeRollPolicy .Reset ()
96- f .LastBlockNumberRollPolicy .Reset ()
133+ func (policies FileRollPolicies ) onBlockProcessed (blockNum uint64 ) {
134+ for _ , p := range policies {
135+ p .onBlockProcessed (blockNum )
136+ }
97137}
138+
139+ var _ FileRollPolicy = & fileSizeRollPolicy {}
0 commit comments