mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-05 18:31:59 +08:00
Pre-check import message to prevent pipeline block indefinitely. issue: https://github.com/milvus-io/milvus/issues/42414 --------- Signed-off-by: bigsheeper <yihao.dai@zilliz.com> Co-authored-by: chyezh <chyezh@outlook.com>
52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package registry
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/cockroachdb/errors"
|
|
|
|
"github.com/milvus-io/milvus/pkg/v2/streaming/util/message"
|
|
"github.com/milvus-io/milvus/pkg/v2/util/syncutil"
|
|
)
|
|
|
|
// MessageCheckCallback is the callback function for the message type.
|
|
type MessageCheckCallback = func(ctx context.Context, msg message.BroadcastMutableMessage) error
|
|
|
|
// resetMessageCheckCallbacks resets the message check callbacks.
|
|
func resetMessageCheckCallbacks() {
|
|
messageCheckCallbacks = map[message.MessageType]*syncutil.Future[MessageCheckCallback]{
|
|
message.MessageTypeImport: syncutil.NewFuture[MessageCheckCallback](),
|
|
}
|
|
}
|
|
|
|
// messageCheckCallbacks is the map of message type to the callback function.
|
|
var messageCheckCallbacks map[message.MessageType]*syncutil.Future[MessageCheckCallback]
|
|
|
|
// RegisterMessageCheckCallback registers the callback function for the message type.
|
|
func RegisterMessageCheckCallback(typ message.MessageType, callback MessageCheckCallback) {
|
|
future, ok := messageCheckCallbacks[typ]
|
|
if !ok {
|
|
panic(fmt.Sprintf("the future of check message callback for type %s is not registered", typ))
|
|
}
|
|
if future.Ready() {
|
|
// only for test, the register callback should be called once and only once
|
|
return
|
|
}
|
|
future.Set(callback)
|
|
}
|
|
|
|
// CallMessageCheckCallback calls the callback function for the message type.
|
|
func CallMessageCheckCallback(ctx context.Context, msg message.BroadcastMutableMessage) error {
|
|
callbackFuture, ok := messageCheckCallbacks[msg.MessageType()]
|
|
if !ok {
|
|
// No callback need tobe called, return nil
|
|
return nil
|
|
}
|
|
callback, err := callbackFuture.GetWithContext(ctx)
|
|
if err != nil {
|
|
return errors.Wrap(err, "when waiting callback registered")
|
|
}
|
|
return callback(ctx, msg)
|
|
}
|