Zhen Ye 49657c4690
enhance: add create segment message, enable empty segment flush (#37407)
issue: #37172

- add redo interceptor to implement append context refresh. (make new
timetick)
- add create segment handler for flusher.
- make empty segment flushable and directly change it into dropped.
- add create segment message into wal when creating new growing segment.
- make the insert operation into following seq: createSegment -> insert
-> insert -> flushSegment.
- make manual flush into following seq: flushTs -> flushsegment ->
flushsegment -> manualflush.

---------

Signed-off-by: chyezh <chyezh@outlook.com>
2024-11-08 10:16:34 +08:00

77 lines
2.1 KiB
Go

package utility
import (
"context"
"reflect"
"google.golang.org/protobuf/reflect/protoreflect"
"github.com/milvus-io/milvus/pkg/streaming/util/message"
)
// walCtxKey is the key type of extra append result.
type walCtxKey int
var (
extraAppendResultValue walCtxKey = 1
notPersistedValue walCtxKey = 2
)
// ExtraAppendResult is the extra append result.
type ExtraAppendResult struct {
TimeTick uint64
TxnCtx *message.TxnContext
Extra protoreflect.ProtoMessage
}
// NotPersistedHint is the hint of not persisted message.
type NotPersistedHint struct {
MessageID message.MessageID // The reused MessageID.
}
// WithNotPersisted set not persisted message to context
func WithNotPersisted(ctx context.Context, hint *NotPersistedHint) context.Context {
return context.WithValue(ctx, notPersistedValue, hint)
}
// GetNotPersisted get not persisted message from context
func GetNotPersisted(ctx context.Context) *NotPersistedHint {
val := ctx.Value(notPersistedValue)
if val == nil {
return nil
}
return val.(*NotPersistedHint)
}
// WithExtraAppendResult set extra to context
func WithExtraAppendResult(ctx context.Context, r *ExtraAppendResult) context.Context {
return context.WithValue(ctx, extraAppendResultValue, r)
}
// ModifyAppendResultExtra modify extra in context
func ModifyAppendResultExtra[M protoreflect.ProtoMessage](ctx context.Context, modifier func(old M) (new M)) {
result := ctx.Value(extraAppendResultValue)
var old M
if result.(*ExtraAppendResult).Extra != nil {
old = result.(*ExtraAppendResult).Extra.(M)
}
new := modifier(old)
if reflect.ValueOf(new).IsNil() {
result.(*ExtraAppendResult).Extra = nil
return
}
result.(*ExtraAppendResult).Extra = new
}
// ReplaceAppendResultTimeTick set time tick to context
func ReplaceAppendResultTimeTick(ctx context.Context, timeTick uint64) {
result := ctx.Value(extraAppendResultValue)
result.(*ExtraAppendResult).TimeTick = timeTick
}
// ReplaceAppendResultTxnContext set txn context to context
func ReplaceAppendResultTxnContext(ctx context.Context, txnCtx *message.TxnContext) {
result := ctx.Value(extraAppendResultValue)
result.(*ExtraAppendResult).TxnCtx = txnCtx
}