mirror of https://github.com/milvus-io/milvus.git
parent
a7397a90e7
commit
be0daafdb0
|
@ -1619,3 +1619,42 @@ func printMsgPack(msgPack *MsgPack) {
|
||||||
}
|
}
|
||||||
log.Println("================")
|
log.Println("================")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStream_RmqTtMsgStream_AsConsumerWithPosition(t *testing.T) {
|
||||||
|
|
||||||
|
producerChannels := []string{"insert1"}
|
||||||
|
consumerChannels := []string{"insert1"}
|
||||||
|
consumerSubName := "subInsert"
|
||||||
|
|
||||||
|
rocksdbName := "/tmp/rocksmq_asconsumer_withpos"
|
||||||
|
etcdKV := initRmq(rocksdbName)
|
||||||
|
factory := ProtoUDFactory{}
|
||||||
|
|
||||||
|
rmqClient, _ := mqclient.NewRmqClient(client.ClientOptions{Server: rocksmq.Rmq})
|
||||||
|
|
||||||
|
otherInputStream, _ := NewMqMsgStream(context.Background(), 100, 100, rmqClient, factory.NewUnmarshalDispatcher())
|
||||||
|
otherInputStream.AsProducer([]string{"root_timetick"})
|
||||||
|
otherInputStream.Start()
|
||||||
|
otherInputStream.Produce(getTimeTickMsgPack(999))
|
||||||
|
|
||||||
|
inputStream, _ := NewMqMsgStream(context.Background(), 100, 100, rmqClient, factory.NewUnmarshalDispatcher())
|
||||||
|
inputStream.AsProducer(producerChannels)
|
||||||
|
inputStream.Start()
|
||||||
|
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
inputStream.Produce(getTimeTickMsgPack(int64(i)))
|
||||||
|
}
|
||||||
|
|
||||||
|
rmqClient2, _ := mqclient.NewRmqClient(client.ClientOptions{Server: rocksmq.Rmq})
|
||||||
|
outputStream, _ := NewMqMsgStream(context.Background(), 100, 100, rmqClient2, factory.NewUnmarshalDispatcher())
|
||||||
|
outputStream.AsConsumerWithPosition(consumerChannels, consumerSubName, mqclient.SubscriptionPositionLatest)
|
||||||
|
outputStream.Start()
|
||||||
|
|
||||||
|
inputStream.Produce(getTimeTickMsgPack(1000))
|
||||||
|
pack := outputStream.Consume()
|
||||||
|
assert.NotNil(t, pack)
|
||||||
|
assert.Equal(t, 1, len(pack.Msgs))
|
||||||
|
assert.EqualValues(t, 1000, pack.Msgs[0].BeginTs())
|
||||||
|
|
||||||
|
Close(rocksdbName, inputStream, outputStream, etcdKV)
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
package rocksmq
|
package rocksmq
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -722,14 +723,30 @@ func (rmq *rocksmq) SeekToLatest(topicName, groupName string) error {
|
||||||
|
|
||||||
fixChanName, _ := fixChannelName(topicName)
|
fixChanName, _ := fixChannelName(topicName)
|
||||||
iter.Seek([]byte(fixChanName + "/"))
|
iter.Seek([]byte(fixChanName + "/"))
|
||||||
|
var last []byte
|
||||||
|
// iter.SeekToLast bypass prefix limitation
|
||||||
|
// use for range until find next prefix for now
|
||||||
if iter.Valid() {
|
if iter.Valid() {
|
||||||
iter.SeekToLast()
|
last = iter.Key().Data()
|
||||||
|
current := last
|
||||||
|
for bytes.HasPrefix(current, []byte(topicName)) {
|
||||||
|
iter.Next()
|
||||||
|
if iter.Valid() {
|
||||||
|
current = last
|
||||||
|
last = iter.Key().Data()
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// In this case there are no messages, so shouldn't return error
|
// In this case there are no messages, so shouldn't return error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
msgKey := iter.Key()
|
|
||||||
msgID, err := strconv.ParseInt(string(msgKey.Data())[FixedChannelNameLen+1:], 10, 64)
|
if len(last) <= FixedChannelNameLen {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
msgID, err := strconv.ParseInt(string(last)[FixedChannelNameLen+1:], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue