github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/topic/topicreadercommon/read_partition_session.go (about) 1 package topicreadercommon 2 3 import ( 4 "context" 5 "sync/atomic" 6 7 "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" 8 "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopicreader" 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext" 10 ) 11 12 type PartitionSession struct { 13 Topic string 14 PartitionID int64 15 16 ReaderID int64 17 connectionID string 18 19 ctx context.Context //nolint:containedctx 20 ctxCancel context.CancelFunc 21 StreamPartitionSessionID rawtopicreader.PartitionSessionID 22 ClientPartitionSessionID int64 23 24 lastReceivedOffsetEndVal atomic.Int64 25 committedOffsetVal atomic.Int64 26 } 27 28 func NewPartitionSession( 29 partitionContext context.Context, 30 topic string, 31 partitionID int64, 32 readerID int64, 33 connectionID string, 34 partitionSessionID rawtopicreader.PartitionSessionID, 35 clientPartitionSessionID int64, 36 committedOffset rawtopiccommon.Offset, 37 ) *PartitionSession { 38 partitionContext, cancel := xcontext.WithCancel(partitionContext) 39 40 res := &PartitionSession{ 41 Topic: topic, 42 PartitionID: partitionID, 43 ReaderID: readerID, 44 connectionID: connectionID, 45 ctx: partitionContext, 46 ctxCancel: cancel, 47 StreamPartitionSessionID: partitionSessionID, 48 ClientPartitionSessionID: clientPartitionSessionID, 49 } 50 res.committedOffsetVal.Store(committedOffset.ToInt64()) 51 res.lastReceivedOffsetEndVal.Store(committedOffset.ToInt64() - 1) 52 53 return res 54 } 55 56 func (s *PartitionSession) Context() context.Context { 57 return s.ctx 58 } 59 60 func (s *PartitionSession) SetContext(ctx context.Context) { 61 s.ctx, s.ctxCancel = xcontext.WithCancel(ctx) 62 } 63 64 func (s *PartitionSession) Close() { 65 s.ctxCancel() 66 } 67 68 func (s *PartitionSession) CommittedOffset() rawtopiccommon.Offset { 69 v := s.committedOffsetVal.Load() 70 71 var res rawtopiccommon.Offset 72 res.FromInt64(v) 73 74 return res 75 } 76 77 // SetCommittedOffsetForward set new offset if new offset greater, then old 78 func (s *PartitionSession) SetCommittedOffsetForward(v rawtopiccommon.Offset) { 79 newVal := int64(v) 80 for { 81 old := s.committedOffsetVal.Load() 82 if newVal <= old { 83 return 84 } 85 86 if s.committedOffsetVal.CompareAndSwap(old, newVal) { 87 return 88 } 89 } 90 } 91 92 func (s *PartitionSession) LastReceivedMessageOffset() rawtopiccommon.Offset { 93 v := s.lastReceivedOffsetEndVal.Load() 94 95 var res rawtopiccommon.Offset 96 res.FromInt64(v) 97 98 return res 99 } 100 101 func (s *PartitionSession) SetLastReceivedMessageOffset(v rawtopiccommon.Offset) { 102 s.lastReceivedOffsetEndVal.Store(v.ToInt64()) 103 } 104 105 func (s *PartitionSession) ToPublic() PublicPartitionSession { 106 return PublicPartitionSession{ 107 PartitionSessionID: s.ClientPartitionSessionID, 108 TopicPath: s.Topic, 109 PartitionID: s.PartitionID, 110 } 111 } 112 113 // PublicPartitionSession contains information about partition session for the event 114 // 115 // Experimental: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#experimental 116 type PublicPartitionSession struct { 117 // PartitionSessionID is unique session ID per listener object 118 PartitionSessionID int64 119 120 // TopicPath contains path for the topic 121 TopicPath string 122 123 // PartitionID contains partition id. It can be repeated for one reader if the partition will stop/start few times. 124 PartitionID int64 125 }