|
|
@ -14,17 +14,17 @@ type OffsetAssignmentFunc func() (int64, error) |
|
|
// PublishWithOffset publishes a message with offset assignment
|
|
|
// PublishWithOffset publishes a message with offset assignment
|
|
|
// TODO: This extends LocalPartition with offset support
|
|
|
// TODO: This extends LocalPartition with offset support
|
|
|
// ASSUMPTION: This will eventually be integrated into the main Publish method
|
|
|
// ASSUMPTION: This will eventually be integrated into the main Publish method
|
|
|
func (p *LocalPartition) PublishWithOffset(message *mq_pb.DataMessage, assignOffsetFn OffsetAssignmentFunc) error { |
|
|
|
|
|
|
|
|
func (p *LocalPartition) PublishWithOffset(message *mq_pb.DataMessage, assignOffsetFn OffsetAssignmentFunc) (int64, error) { |
|
|
// Assign offset for this message
|
|
|
// Assign offset for this message
|
|
|
offset, err := assignOffsetFn() |
|
|
offset, err := assignOffsetFn() |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return fmt.Errorf("failed to assign offset: %w", err) |
|
|
|
|
|
|
|
|
return 0, fmt.Errorf("failed to assign offset: %w", err) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Add message to buffer with offset
|
|
|
// Add message to buffer with offset
|
|
|
err = p.addToBufferWithOffset(message, offset) |
|
|
err = p.addToBufferWithOffset(message, offset) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return fmt.Errorf("failed to add message to buffer: %w", err) |
|
|
|
|
|
|
|
|
return 0, fmt.Errorf("failed to add message to buffer: %w", err) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Send to follower if needed (same logic as original Publish)
|
|
|
// Send to follower if needed (same logic as original Publish)
|
|
|
@ -34,13 +34,13 @@ func (p *LocalPartition) PublishWithOffset(message *mq_pb.DataMessage, assignOff |
|
|
Data: message, |
|
|
Data: message, |
|
|
}, |
|
|
}, |
|
|
}); followErr != nil { |
|
|
}); followErr != nil { |
|
|
return fmt.Errorf("send to follower %s: %v", p.Follower, followErr) |
|
|
|
|
|
|
|
|
return 0, fmt.Errorf("send to follower %s: %v", p.Follower, followErr) |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
atomic.StoreInt64(&p.AckTsNs, message.TsNs) |
|
|
atomic.StoreInt64(&p.AckTsNs, message.TsNs) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
|
return offset, nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// addToBufferWithOffset adds a message to the log buffer with a pre-assigned offset
|
|
|
// addToBufferWithOffset adds a message to the log buffer with a pre-assigned offset
|
|
|
@ -80,15 +80,15 @@ func (p *LocalPartition) GetOffsetInfo() map[string]interface{} { |
|
|
"partition_range_start": p.RangeStart, |
|
|
"partition_range_start": p.RangeStart, |
|
|
"partition_range_stop": p.RangeStop, |
|
|
"partition_range_stop": p.RangeStop, |
|
|
"partition_unix_time": p.UnixTimeNs, |
|
|
"partition_unix_time": p.UnixTimeNs, |
|
|
"buffer_name": p.LogBuffer.GetName(), |
|
|
|
|
|
"buffer_batch_index": p.LogBuffer.GetBatchIndex(), |
|
|
|
|
|
|
|
|
"buffer_name": p.LogBuffer.GetName(), |
|
|
|
|
|
"buffer_batch_index": p.LogBuffer.GetBatchIndex(), |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// OffsetAwarePublisher wraps a LocalPartition with offset assignment capability
|
|
|
// OffsetAwarePublisher wraps a LocalPartition with offset assignment capability
|
|
|
type OffsetAwarePublisher struct { |
|
|
type OffsetAwarePublisher struct { |
|
|
partition *LocalPartition |
|
|
|
|
|
assignOffsetFn OffsetAssignmentFunc |
|
|
|
|
|
|
|
|
partition *LocalPartition |
|
|
|
|
|
assignOffsetFn OffsetAssignmentFunc |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// NewOffsetAwarePublisher creates a new offset-aware publisher
|
|
|
// NewOffsetAwarePublisher creates a new offset-aware publisher
|
|
|
@ -101,7 +101,8 @@ func NewOffsetAwarePublisher(partition *LocalPartition, assignOffsetFn OffsetAss |
|
|
|
|
|
|
|
|
// Publish publishes a message with automatic offset assignment
|
|
|
// Publish publishes a message with automatic offset assignment
|
|
|
func (oap *OffsetAwarePublisher) Publish(message *mq_pb.DataMessage) error { |
|
|
func (oap *OffsetAwarePublisher) Publish(message *mq_pb.DataMessage) error { |
|
|
return oap.partition.PublishWithOffset(message, oap.assignOffsetFn) |
|
|
|
|
|
|
|
|
_, err := oap.partition.PublishWithOffset(message, oap.assignOffsetFn) |
|
|
|
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// GetPartition returns the underlying partition
|
|
|
// GetPartition returns the underlying partition
|
|
|
|