@@ -54,6 +54,7 @@ type SourcePool struct {
54
54
log * slog.Logger
55
55
metrics * metrics.Set
56
56
targetToSrc map [string ]string
57
+ srcToTarget map [string ]string
57
58
srcTopics []string
58
59
59
60
// targetOffsets is initialized with current topic high watermarks from target.
@@ -103,17 +104,20 @@ func NewSourcePool(cfg SourcePoolCfg, serverCfgs []ConsumerCfg, topics Topics, t
103
104
}
104
105
105
106
var (
107
+ srcToTarg = make (map [string ]string , len (topics ))
106
108
targToSrc = make (map [string ]string , len (topics ))
107
109
srcTopics = make ([]string , 0 , len (topics ))
108
110
)
109
111
for src , targ := range topics {
110
112
srcTopics = append (srcTopics , src )
111
113
targToSrc [targ .TargetTopic ] = src
114
+ srcToTarg [src ] = targ .TargetTopic
112
115
}
113
116
114
117
sp := & SourcePool {
115
118
cfg : cfg ,
116
119
targetToSrc : targToSrc ,
120
+ srcToTarget : srcToTarg ,
117
121
srcTopics : srcTopics ,
118
122
servers : servers ,
119
123
log : log ,
@@ -223,21 +227,28 @@ func (sp *SourcePool) GetFetches(s *Server) (kgo.Fetches, error) {
223
227
224
228
// RecordOffsets records the offsets of the latest fetched records per topic.
225
229
// This is used to resume consumption on new connections/reconnections from the source during runtime.
226
- func (sp * SourcePool ) RecordOffsets (rec * kgo.Record ) {
230
+ func (sp * SourcePool ) RecordOffsets (rec * kgo.Record ) error {
227
231
if sp .targetOffsets == nil {
228
232
sp .targetOffsets = make (TopicOffsets )
229
233
}
230
234
231
- if o , ok := sp .targetOffsets [rec .Topic ]; ok {
235
+ topic , ok := sp .srcToTarget [rec .Topic ]
236
+ if ! ok {
237
+ return fmt .Errorf ("target topic not found for src topic %s" , rec .Topic )
238
+ }
239
+
240
+ if o , ok := sp .targetOffsets [topic ]; ok {
232
241
// If the topic already exists, update the offset for the partition.
233
242
o [rec .Partition ] = kgo .NewOffset ().At (rec .Offset + 1 )
234
- sp .targetOffsets [rec . Topic ] = o
243
+ sp .targetOffsets [topic ] = o
235
244
} else {
236
245
// If the topic does not exist, create a new map for the topic.
237
246
o := make (map [int32 ]kgo.Offset )
238
247
o [rec .Partition ] = kgo .NewOffset ().At (rec .Offset + 1 )
239
- sp .targetOffsets [rec . Topic ] = o
248
+ sp .targetOffsets [topic ] = o
240
249
}
250
+
251
+ return nil
241
252
}
242
253
243
254
func (sp * SourcePool ) GetHighWatermark (ctx context.Context , cl * kgo.Client ) (kadm.ListedOffsets , error ) {
0 commit comments