11package streamconsumergroup
22
33import (
4- "fmt"
5- "net/http"
64 "sync"
75 "time"
86
97 "github.com/v3io/v3io-go/pkg/common"
10- "github.com/v3io/v3io-go/pkg/dataplane"
11- "github.com/v3io/v3io-go/pkg/errors"
128
139 "github.com/nuclio/errors"
1410 "github.com/nuclio/logger"
1511)
1612
17- var errShardNotFound = errors .New ("Shard not found" )
18- var errShardSequenceNumberAttributeNotFound = errors .New ("Shard sequenceNumber attribute" )
13+ var ErrShardNotFound = errors .New ("Shard not found" )
14+ var ErrShardSequenceNumberAttributeNotFound = errors .New ("Shard sequenceNumber attribute" )
1915
2016type sequenceNumberHandler struct {
2117 logger logger.Logger
22- streamConsumerGroup * streamConsumerGroup
18+ member * member
2319 markedShardSequenceNumbers []uint64
2420 markedShardSequenceNumbersLock sync.RWMutex
2521 stopMarkedShardSequenceNumberCommitterChan chan struct {}
2622 lastCommittedShardSequenceNumbers []uint64
2723}
2824
29- func newSequenceNumberHandler (streamConsumerGroup * streamConsumerGroup ) (* sequenceNumberHandler , error ) {
25+ func newSequenceNumberHandler (member * member ) (* sequenceNumberHandler , error ) {
3026
3127 return & sequenceNumberHandler {
32- logger : streamConsumerGroup .logger .GetChild ("sequenceNumberHandler" ),
33- streamConsumerGroup : streamConsumerGroup ,
34- markedShardSequenceNumbers : make ([]uint64 , streamConsumerGroup .totalNumShards ),
28+ logger : member .logger .GetChild ("sequenceNumberHandler" ),
29+ member : member ,
30+ markedShardSequenceNumbers : make ([]uint64 , member . streamConsumerGroup .totalNumShards ),
3531 stopMarkedShardSequenceNumberCommitterChan : make (chan struct {}, 1 ),
3632 }, nil
3733}
@@ -40,7 +36,7 @@ func (snh *sequenceNumberHandler) start() error {
4036 snh .logger .DebugWith ("Starting sequenceNumber handler" )
4137
4238 // stopped on stop()
43- go snh .markedShardSequenceNumbersCommitter (snh .streamConsumerGroup .config .SequenceNumber .CommitInterval ,
39+ go snh .markedShardSequenceNumbersCommitter (snh .member . streamConsumerGroup .config .SequenceNumber .CommitInterval ,
4440 snh .stopMarkedShardSequenceNumberCommitterChan )
4541
4642 return nil
@@ -68,112 +64,6 @@ func (snh *sequenceNumberHandler) markShardSequenceNumber(shardID int, sequenceN
6864 return nil
6965}
7066
71- func (snh * sequenceNumberHandler ) getShardLocationFromPersistency (shardID int ) (string , error ) {
72- snh .logger .DebugWith ("Getting shard sequenceNumber from persistency" , "shardID" , shardID )
73-
74- shardPath , err := snh .streamConsumerGroup .getShardPath (shardID )
75- if err != nil {
76- return "" , errors .Wrapf (err , "Failed getting shard path: %v" , shardID )
77- }
78-
79- seekShardInput := v3io.SeekShardInput {
80- Path : shardPath ,
81- }
82-
83- // get the shard sequenceNumber from the item
84- shardSequenceNumber , err := snh .getShardSequenceNumberFromItemAttributes (shardPath )
85- if err != nil {
86-
87- // if the error is that the attribute wasn't found, but the shard was found - seek the shard
88- // according to the configuration
89- if err != errShardSequenceNumberAttributeNotFound {
90- return "" , errors .Wrap (err , "Failed to get shard sequenceNumber from item attributes" )
91- }
92-
93- seekShardInput .Type = snh .streamConsumerGroup .config .Claim .RecordBatchFetch .InitialLocation
94- } else {
95-
96- // use sequence number
97- seekShardInput .Type = v3io .SeekShardInputTypeSequence
98- seekShardInput .StartingSequenceNumber = shardSequenceNumber + 1
99- }
100-
101- return snh .getShardLocationWithSeek (shardPath , & seekShardInput )
102- }
103-
104- // returns the sequenceNumber, an error re: the shard itself and an error re: the attribute in the shard
105- func (snh * sequenceNumberHandler ) getShardSequenceNumberFromItemAttributes (shardPath string ) (uint64 , error ) {
106- response , err := snh .streamConsumerGroup .container .GetItemSync (& v3io.GetItemInput {
107- Path : shardPath ,
108- AttributeNames : []string {snh .getShardCommittedSequenceNumberAttributeName ()},
109- })
110-
111- if err != nil {
112- errWithStatusCode , errHasStatusCode := err .(v3ioerrors.ErrorWithStatusCode )
113- if ! errHasStatusCode {
114- return 0 , errors .Wrap (err , "Got error without status code" )
115- }
116-
117- if errWithStatusCode .StatusCode () != http .StatusNotFound {
118- return 0 , errors .Wrap (err , "Failed getting shard item" )
119- }
120-
121- // TODO: remove after errors.Is support added
122- snh .logger .DebugWith ("Could not find shard, probably doesn't exist yet" , "path" , shardPath )
123-
124- return 0 , errShardNotFound
125- }
126-
127- defer response .Release ()
128-
129- getItemOutput := response .Output .(* v3io.GetItemOutput )
130-
131- // return the attribute name
132- sequenceNumber , err := getItemOutput .Item .GetFieldUint64 (snh .getShardCommittedSequenceNumberAttributeName ())
133- if err != nil && err == v3ioerrors .ErrNotFound {
134- return 0 , errShardSequenceNumberAttributeNotFound
135- }
136-
137- // return the sequenceNumber we found
138- return sequenceNumber , nil
139- }
140-
141- func (snh * sequenceNumberHandler ) getShardLocationWithSeek (shardPath string , seekShardInput * v3io.SeekShardInput ) (string , error ) {
142-
143- snh .logger .DebugWith ("Seeking shard" , "shardPath" , shardPath , "seekShardInput" , seekShardInput )
144-
145- response , err := snh .streamConsumerGroup .container .SeekShardSync (seekShardInput )
146- if err != nil {
147- return "" , errors .Wrap (err , "Failed to seek shard" )
148- }
149- defer response .Release ()
150-
151- location := response .Output .(* v3io.SeekShardOutput ).Location
152-
153- snh .logger .DebugWith ("Seek shard succeeded" , "shardPath" , shardPath , "location" , location )
154-
155- return location , nil
156- }
157-
158- func (snh * sequenceNumberHandler ) getShardCommittedSequenceNumberAttributeName () string {
159- return fmt .Sprintf ("__%s_committed_sequence_number" , snh .streamConsumerGroup .name )
160- }
161-
162- func (snh * sequenceNumberHandler ) setShardSequenceNumberInPersistency (shardID int , sequenceNumber uint64 ) error {
163- snh .logger .DebugWith ("Setting shard sequenceNumber in persistency" , "shardID" , shardID , "sequenceNumber" , sequenceNumber )
164- shardPath , err := snh .streamConsumerGroup .getShardPath (shardID )
165- if err != nil {
166- return errors .Wrapf (err , "Failed getting shard path: %v" , shardID )
167- }
168-
169- return snh .streamConsumerGroup .container .UpdateItemSync (& v3io.UpdateItemInput {
170- Path : shardPath ,
171- Attributes : map [string ]interface {}{
172- snh .getShardCommittedSequenceNumberAttributeName (): sequenceNumber ,
173- },
174- })
175- }
176-
17767func (snh * sequenceNumberHandler ) markedShardSequenceNumbersCommitter (interval time.Duration , stopChan chan struct {}) {
17868 for {
17969 select {
@@ -218,7 +108,7 @@ func (snh *sequenceNumberHandler) commitMarkedShardSequenceNumbers() error {
218108 continue
219109 }
220110
221- if err := snh .setShardSequenceNumberInPersistency (shardID , sequenceNumber ); err != nil {
111+ if err := snh .member . streamConsumerGroup . setShardSequenceNumberInPersistency (shardID , sequenceNumber ); err != nil {
222112 snh .logger .WarnWith ("Failed committing shard sequenceNumber" , "shardID" , shardID ,
223113 "sequenceNumber" , sequenceNumber ,
224114 "err" , errors .GetErrorStackString (err , 10 ))
0 commit comments