mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-06 17:18:35 +08:00
170 lines
4.5 KiB
Go
170 lines
4.5 KiB
Go
package adaptor
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
|
|
"github.com/milvus-io/milvus-proto/go-api/v2/msgpb"
|
|
"github.com/milvus-io/milvus/pkg/mq/msgstream"
|
|
"github.com/milvus-io/milvus/pkg/streaming/util/message"
|
|
"github.com/milvus-io/milvus/pkg/streaming/walimpls/impls/rmq"
|
|
)
|
|
|
|
func TestMsgPackAdaptorHandler(t *testing.T) {
|
|
id := rmq.NewRmqID(1)
|
|
|
|
h := NewMsgPackAdaptorHandler()
|
|
insertMsg := message.CreateTestInsertMessage(t, 1, 100, 10, id)
|
|
insertImmutableMessage := insertMsg.IntoImmutableMessage(id)
|
|
ch := make(chan *msgstream.MsgPack, 1)
|
|
go func() {
|
|
for msgPack := range h.Chan() {
|
|
ch <- msgPack
|
|
}
|
|
close(ch)
|
|
}()
|
|
ok, err := h.Handle(context.Background(), insertImmutableMessage)
|
|
assert.True(t, ok)
|
|
assert.NoError(t, err)
|
|
msgPack := <-ch
|
|
|
|
assert.Equal(t, uint64(10), msgPack.BeginTs)
|
|
assert.Equal(t, uint64(10), msgPack.EndTs)
|
|
for _, tsMsg := range msgPack.Msgs {
|
|
assert.Equal(t, uint64(10), tsMsg.BeginTs())
|
|
assert.Equal(t, uint64(10), tsMsg.EndTs())
|
|
for _, ts := range tsMsg.(*msgstream.InsertMsg).Timestamps {
|
|
assert.Equal(t, uint64(10), ts)
|
|
}
|
|
}
|
|
|
|
deleteMsg, err := message.NewDeleteMessageBuilderV1().
|
|
WithVChannel("vchan1").
|
|
WithHeader(&message.DeleteMessageHeader{
|
|
CollectionId: 1,
|
|
}).
|
|
WithBody(&msgpb.DeleteRequest{
|
|
Base: &commonpb.MsgBase{
|
|
MsgType: commonpb.MsgType_Delete,
|
|
},
|
|
CollectionID: 1,
|
|
PartitionID: 1,
|
|
Timestamps: []uint64{10},
|
|
}).
|
|
BuildMutable()
|
|
assert.NoError(t, err)
|
|
|
|
deleteImmutableMsg := deleteMsg.
|
|
WithTimeTick(11).
|
|
WithLastConfirmedUseMessageID().
|
|
IntoImmutableMessage(id)
|
|
|
|
ok, err = h.Handle(context.Background(), deleteImmutableMsg)
|
|
assert.True(t, ok)
|
|
assert.NoError(t, err)
|
|
msgPack = <-ch
|
|
assert.Equal(t, uint64(11), msgPack.BeginTs)
|
|
assert.Equal(t, uint64(11), msgPack.EndTs)
|
|
for _, tsMsg := range msgPack.Msgs {
|
|
assert.Equal(t, uint64(11), tsMsg.BeginTs())
|
|
assert.Equal(t, uint64(11), tsMsg.EndTs())
|
|
for _, ts := range tsMsg.(*msgstream.DeleteMsg).Timestamps {
|
|
assert.Equal(t, uint64(11), ts)
|
|
}
|
|
}
|
|
|
|
// Create a txn message
|
|
msg, err := message.NewBeginTxnMessageBuilderV2().
|
|
WithVChannel("vchan1").
|
|
WithHeader(&message.BeginTxnMessageHeader{
|
|
KeepaliveMilliseconds: 1000,
|
|
}).
|
|
WithBody(&message.BeginTxnMessageBody{}).
|
|
BuildMutable()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, msg)
|
|
|
|
txnCtx := message.TxnContext{
|
|
TxnID: 1,
|
|
Keepalive: time.Second,
|
|
}
|
|
|
|
beginImmutableMsg, err := message.AsImmutableBeginTxnMessageV2(msg.WithTimeTick(9).
|
|
WithTxnContext(txnCtx).
|
|
WithLastConfirmedUseMessageID().
|
|
IntoImmutableMessage(rmq.NewRmqID(2)))
|
|
assert.NoError(t, err)
|
|
|
|
msg, err = message.NewCommitTxnMessageBuilderV2().
|
|
WithVChannel("vchan1").
|
|
WithHeader(&message.CommitTxnMessageHeader{}).
|
|
WithBody(&message.CommitTxnMessageBody{}).
|
|
BuildMutable()
|
|
assert.NoError(t, err)
|
|
|
|
commitImmutableMsg, err := message.AsImmutableCommitTxnMessageV2(msg.WithTimeTick(12).
|
|
WithTxnContext(txnCtx).
|
|
WithTxnContext(message.TxnContext{}).
|
|
WithLastConfirmedUseMessageID().
|
|
IntoImmutableMessage(rmq.NewRmqID(3)))
|
|
assert.NoError(t, err)
|
|
|
|
txn, err := message.NewImmutableTxnMessageBuilder(beginImmutableMsg).
|
|
Add(insertMsg.WithTxnContext(txnCtx).IntoImmutableMessage(id)).
|
|
Add(deleteMsg.WithTxnContext(txnCtx).IntoImmutableMessage(id)).
|
|
Build(commitImmutableMsg)
|
|
assert.NoError(t, err)
|
|
|
|
ok, err = h.Handle(context.Background(), txn)
|
|
assert.True(t, ok)
|
|
assert.NoError(t, err)
|
|
msgPack = <-ch
|
|
|
|
assert.Equal(t, uint64(12), msgPack.BeginTs)
|
|
assert.Equal(t, uint64(12), msgPack.EndTs)
|
|
|
|
// Create flush message
|
|
msg, err = message.NewFlushMessageBuilderV2().
|
|
WithVChannel("vchan1").
|
|
WithHeader(&message.FlushMessageHeader{}).
|
|
WithBody(&message.FlushMessageBody{}).
|
|
BuildMutable()
|
|
assert.NoError(t, err)
|
|
|
|
flushMsg := msg.
|
|
WithTimeTick(13).
|
|
WithLastConfirmedUseMessageID().
|
|
IntoImmutableMessage(rmq.NewRmqID(4))
|
|
|
|
ok, err = h.Handle(context.Background(), flushMsg)
|
|
assert.True(t, ok)
|
|
assert.NoError(t, err)
|
|
|
|
msgPack = <-ch
|
|
|
|
assert.Equal(t, uint64(13), msgPack.BeginTs)
|
|
assert.Equal(t, uint64(13), msgPack.EndTs)
|
|
|
|
h.Close()
|
|
<-ch
|
|
}
|
|
|
|
func TestMsgPackAdaptorHandlerTimeout(t *testing.T) {
|
|
id := rmq.NewRmqID(1)
|
|
|
|
insertMsg := message.CreateTestInsertMessage(t, 1, 100, 10, id)
|
|
insertImmutableMessage := insertMsg.IntoImmutableMessage(id)
|
|
|
|
h := NewMsgPackAdaptorHandler()
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
|
|
ok, err := h.Handle(ctx, insertImmutableMessage)
|
|
assert.True(t, ok)
|
|
assert.ErrorIs(t, err, ctx.Err())
|
|
}
|