Get a new shard iterator on error (#32)
* Get a new shard iterator on error * Check for nil instead of empty string * Get a new shard iterator on error
This commit is contained in:
parent
c56cefb667
commit
c04f3d8a94
1 changed files with 54 additions and 26 deletions
80
consumer.go
80
consumer.go
|
|
@ -54,30 +54,10 @@ func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
|||
MaxRecordCount: c.BufferSize,
|
||||
shardID: shardID,
|
||||
}
|
||||
|
||||
params := &kinesis.GetShardIteratorInput{
|
||||
ShardId: aws.String(shardID),
|
||||
StreamName: aws.String(c.StreamName),
|
||||
}
|
||||
|
||||
if c.Checkpoint.CheckpointExists(shardID) {
|
||||
params.ShardIteratorType = aws.String("AFTER_SEQUENCE_NUMBER")
|
||||
params.StartingSequenceNumber = aws.String(c.Checkpoint.SequenceNumber())
|
||||
} else {
|
||||
params.ShardIteratorType = aws.String("TRIM_HORIZON")
|
||||
}
|
||||
|
||||
resp, err := c.svc.GetShardIterator(params)
|
||||
if err != nil {
|
||||
c.Logger.WithError(err).Error("GetShardIterator")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
shardIterator := resp.ShardIterator
|
||||
|
||||
ctx := c.Logger.WithFields(log.Fields{
|
||||
"shard": shardID,
|
||||
})
|
||||
shardIterator := c.getShardIterator(shardID)
|
||||
|
||||
ctx.Info("processing")
|
||||
|
||||
|
|
@ -89,7 +69,9 @@ func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
|||
)
|
||||
|
||||
if err != nil {
|
||||
log.Fatalf("Error GetRecords %v", err)
|
||||
ctx.WithError(err).Error("GetRecords")
|
||||
shardIterator = c.getShardIterator(shardID)
|
||||
continue
|
||||
}
|
||||
|
||||
if len(resp.Records) > 0 {
|
||||
|
|
@ -103,11 +85,57 @@ func (c *Consumer) handlerLoop(shardID string, handler Handler) {
|
|||
buf.Flush()
|
||||
}
|
||||
}
|
||||
} else if resp.NextShardIterator == aws.String("") || shardIterator == resp.NextShardIterator {
|
||||
c.Logger.Error("NextShardIterator")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
shardIterator = resp.NextShardIterator
|
||||
if resp.NextShardIterator == nil || shardIterator == resp.NextShardIterator {
|
||||
shardIterator = c.getShardIterator(shardID)
|
||||
} else {
|
||||
shardIterator = resp.NextShardIterator
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Consumer) getShardIterator(shardID string) *string {
|
||||
params := &kinesis.GetShardIteratorInput{
|
||||
ShardId: aws.String(shardID),
|
||||
StreamName: aws.String(c.StreamName),
|
||||
}
|
||||
|
||||
if c.Checkpoint.CheckpointExists(shardID) {
|
||||
params.ShardIteratorType = aws.String(string(ShardIteratorAfterSequenceNumber))
|
||||
params.StartingSequenceNumber = aws.String(c.Checkpoint.SequenceNumber())
|
||||
} else {
|
||||
params.ShardIteratorType = aws.String(string(c.ShardIteratorType))
|
||||
}
|
||||
|
||||
resp, err := c.svc.GetShardIterator(params)
|
||||
|
||||
if err != nil {
|
||||
c.Logger.WithError(err).Error("GetShardIterator")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
return resp.ShardIterator
|
||||
}
|
||||
|
||||
func (c *Consumer) getShardIterator(shardID string) *string {
|
||||
params := &kinesis.GetShardIteratorInput{
|
||||
ShardId: aws.String(shardID),
|
||||
StreamName: aws.String(c.StreamName),
|
||||
}
|
||||
|
||||
if c.Checkpoint.CheckpointExists(shardID) {
|
||||
params.ShardIteratorType = aws.String(string(ShardIteratorAfterSequenceNumber))
|
||||
params.StartingSequenceNumber = aws.String(c.Checkpoint.SequenceNumber())
|
||||
} else {
|
||||
params.ShardIteratorType = aws.String(string(c.ShardIteratorType))
|
||||
}
|
||||
|
||||
resp, err := c.svc.GetShardIterator(params)
|
||||
if err != nil {
|
||||
c.Logger.WithError(err).Error("GetShardIterator")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
return resp.ShardIterator
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue