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  }