未验证 提交 8b89744c 编写于 作者: N neza2017 提交者: GitHub

search with exp (#6409)

* process float vector and binary vector field
on the search result
Signed-off-by: Nyefu.chen <yefu.chen@zilliz.com>

* add more debug info on etcd
Signed-off-by: Nyefu.chen <yefu.chen@zilliz.com>

* add debug info when grpc failed
Signed-off-by: Nyefu.chen <yefu.chen@zilliz.com>
上级 414bfe3c
...@@ -131,6 +131,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -131,6 +131,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("DataCoord Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to datacoord failed with error:\n" + err.Error()) return ret, errors.New("Connect to datacoord failed with error:\n" + err.Error())
......
...@@ -112,6 +112,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -112,6 +112,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("DataNode Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to datanode failed with error:\n" + err.Error()) return ret, errors.New("Connect to datanode failed with error:\n" + err.Error())
......
...@@ -126,6 +126,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -126,6 +126,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("IndexCoord Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to indexcoord failed with error:\n" + err.Error()) return ret, errors.New("Connect to indexcoord failed with error:\n" + err.Error())
......
...@@ -107,6 +107,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -107,6 +107,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("IndexNode Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to indexnode failed with error:\n" + err.Error()) return ret, errors.New("Connect to indexnode failed with error:\n" + err.Error())
......
...@@ -106,6 +106,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -106,6 +106,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("Proxy Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to proxy failed with error:\n" + err.Error()) return ret, errors.New("Connect to proxy failed with error:\n" + err.Error())
......
...@@ -134,6 +134,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -134,6 +134,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("QueryCoord Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to querycoord failed with error:\n" + err.Error()) return ret, errors.New("Connect to querycoord failed with error:\n" + err.Error())
......
...@@ -106,6 +106,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error) ...@@ -106,6 +106,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("QueryNode Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to querynode failed with error:\n" + err.Error()) return ret, errors.New("Connect to querynode failed with error:\n" + err.Error())
......
...@@ -155,6 +155,7 @@ func (c *GrpcClient) recall(caller func() (interface{}, error)) (interface{}, er ...@@ -155,6 +155,7 @@ func (c *GrpcClient) recall(caller func() (interface{}, error)) (interface{}, er
if err == nil { if err == nil {
return ret, nil return ret, nil
} }
log.Debug("RootCoord Client grpc error", zap.Error(err))
err = c.connect() err = c.connect()
if err != nil { if err != nil {
return ret, errors.New("Connect to rootcoord failed with error:\n" + err.Error()) return ret, errors.New("Connect to rootcoord failed with error:\n" + err.Error())
......
...@@ -1722,13 +1722,21 @@ func reduceSearchResultDataParallel(searchResultData []*schemapb.SearchResultDat ...@@ -1722,13 +1722,21 @@ func reduceSearchResultDataParallel(searchResultData []*schemapb.SearchResultDat
switch vectorType := fieldType.Vectors.Data.(type) { switch vectorType := fieldType.Vectors.Data.(type) {
case *schemapb.VectorField_BinaryVector: case *schemapb.VectorField_BinaryVector:
if ret.Results.FieldsData[k].GetVectors().GetBinaryVector() == nil { if ret.Results.FieldsData[k].GetVectors().GetBinaryVector() == nil {
ret.Results.FieldsData[k].GetVectors().Data.(*schemapb.VectorField_BinaryVector).BinaryVector = []byte{vectorType.BinaryVector[curIdx*int((dim/8))]} bvec := &schemapb.VectorField_BinaryVector{
BinaryVector: vectorType.BinaryVector[curIdx*int((dim/8)) : (curIdx+1)*int((dim/8))],
}
ret.Results.FieldsData[k].GetVectors().Data = bvec
} else { } else {
ret.Results.FieldsData[k].GetVectors().Data.(*schemapb.VectorField_BinaryVector).BinaryVector = append(ret.Results.FieldsData[k].GetVectors().Data.(*schemapb.VectorField_BinaryVector).BinaryVector, vectorType.BinaryVector[curIdx*int((dim/8)):(curIdx+1)*int((dim/8))]...) ret.Results.FieldsData[k].GetVectors().Data.(*schemapb.VectorField_BinaryVector).BinaryVector = append(ret.Results.FieldsData[k].GetVectors().Data.(*schemapb.VectorField_BinaryVector).BinaryVector, vectorType.BinaryVector[curIdx*int((dim/8)):(curIdx+1)*int((dim/8))]...)
} }
case *schemapb.VectorField_FloatVector: case *schemapb.VectorField_FloatVector:
if ret.Results.FieldsData[k].GetVectors().GetFloatVector() == nil { if ret.Results.FieldsData[k].GetVectors().GetFloatVector() == nil {
ret.Results.FieldsData[k].GetVectors().GetFloatVector().Data = []float32{vectorType.FloatVector.Data[curIdx*int(dim)]} fvec := &schemapb.VectorField_FloatVector{
FloatVector: &schemapb.FloatArray{
Data: vectorType.FloatVector.Data[curIdx*int(dim) : (curIdx+1)*int(dim)],
},
}
ret.Results.FieldsData[k].GetVectors().Data = fvec
} else { } else {
ret.Results.FieldsData[k].GetVectors().GetFloatVector().Data = append(ret.Results.FieldsData[k].GetVectors().GetFloatVector().Data, vectorType.FloatVector.Data[curIdx*int(dim):(curIdx+1)*int(dim)]...) ret.Results.FieldsData[k].GetVectors().GetFloatVector().Data = append(ret.Results.FieldsData[k].GetVectors().GetFloatVector().Data, vectorType.FloatVector.Data[curIdx*int(dim):(curIdx+1)*int(dim)]...)
} }
...@@ -1902,7 +1910,6 @@ func (st *SearchTask) PostExecute(ctx context.Context) error { ...@@ -1902,7 +1910,6 @@ func (st *SearchTask) PostExecute(ctx context.Context) error {
} }
} }
} }
log.Debug("Proxy Search PostExecute Done") log.Debug("Proxy Search PostExecute Done")
return nil return nil
} }
......
...@@ -18,6 +18,7 @@ import ( ...@@ -18,6 +18,7 @@ import (
"math" "math"
"reflect" "reflect"
"sync" "sync"
"unsafe"
oplog "github.com/opentracing/opentracing-go/log" oplog "github.com/opentracing/opentracing-go/log"
"go.uber.org/zap" "go.uber.org/zap"
...@@ -697,11 +698,65 @@ func translateHits(schema *typeutil.SchemaHelper, fieldIDs []int64, rawHits [][] ...@@ -697,11 +698,65 @@ func translateHits(schema *typeutil.SchemaHelper, fieldIDs []int64, rawHits [][]
finalResult.FieldsData = append(finalResult.FieldsData, newCol) finalResult.FieldsData = append(finalResult.FieldsData, newCol)
blobOffset += blobLen blobOffset += blobLen
case schemapb.DataType_FloatVector: case schemapb.DataType_FloatVector:
dim, err := schema.GetVectorDimFromID(fieldID)
if err != nil {
return nil, err
}
blobLen := dim * 4
var colData []float32
for _, hit := range hits {
for _, row := range hit.RowData {
dataBlob := row[blobOffset : blobOffset+blobLen]
//ref https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
ptr := unsafe.Pointer(&dataBlob[0])
farray := (*[1 << 28]float32)(ptr)
colData = append(colData, farray[:dim:dim]...)
}
}
newCol := &schemapb.FieldData{
Field: &schemapb.FieldData_Vectors{
Vectors: &schemapb.VectorField{
Dim: int64(dim),
Data: &schemapb.VectorField_FloatVector{
FloatVector: &schemapb.FloatArray{
Data: colData,
},
},
},
},
}
finalResult.FieldsData = append(finalResult.FieldsData, newCol)
blobOffset += blobLen
case schemapb.DataType_BinaryVector: case schemapb.DataType_BinaryVector:
return nil, fmt.Errorf("unsupported") dim, err := schema.GetVectorDimFromID(fieldID)
if err != nil {
return nil, err
}
blobLen := dim / 8
var colData []byte
for _, hit := range hits {
for _, row := range hit.RowData {
dataBlob := row[blobOffset : blobOffset+blobLen]
colData = append(colData, dataBlob...)
}
}
newCol := &schemapb.FieldData{
Field: &schemapb.FieldData_Vectors{
Vectors: &schemapb.VectorField{
Dim: int64(dim),
Data: &schemapb.VectorField_BinaryVector{
BinaryVector: colData,
},
},
},
}
finalResult.FieldsData = append(finalResult.FieldsData, newCol)
blobOffset += blobLen
default: default:
return nil, fmt.Errorf("unsupport data type %s", schemapb.DataType_name[int32(fieldMeta.DataType)])
} }
} }
return finalResult, nil return finalResult, nil
} }
......
...@@ -275,6 +275,7 @@ func (c *Core) sessionLoop() { ...@@ -275,6 +275,7 @@ func (c *Core) sessionLoop() {
time.Sleep(time.Second) time.Sleep(time.Second)
os.Exit(-1) os.Exit(-1)
}() }()
return
} }
} }
} }
......
...@@ -169,6 +169,7 @@ func (s *Session) getServerIDWithKey(key string, retryTimes uint) (int64, error) ...@@ -169,6 +169,7 @@ func (s *Session) getServerIDWithKey(key string, retryTimes uint) (int64, error)
// it is false. Otherwise, set it to true. // it is false. Otherwise, set it to true.
func (s *Session) registerService() (<-chan *clientv3.LeaseKeepAliveResponse, error) { func (s *Session) registerService() (<-chan *clientv3.LeaseKeepAliveResponse, error) {
var ch <-chan *clientv3.LeaseKeepAliveResponse var ch <-chan *clientv3.LeaseKeepAliveResponse
log.Debug("Session Register Begin")
registerFn := func() error { registerFn := func() error {
resp, err := s.etcdCli.Grant(s.ctx, DefaultTTL) resp, err := s.etcdCli.Grant(s.ctx, DefaultTTL)
if err != nil { if err != nil {
...@@ -207,6 +208,7 @@ func (s *Session) registerService() (<-chan *clientv3.LeaseKeepAliveResponse, er ...@@ -207,6 +208,7 @@ func (s *Session) registerService() (<-chan *clientv3.LeaseKeepAliveResponse, er
fmt.Printf("keep alive error %s\n", err) fmt.Printf("keep alive error %s\n", err)
return err return err
} }
log.Debug("Session Register End", zap.Int64("ServerID", s.ServerID))
return nil return nil
} }
err := retry.Do(s.ctx, registerFn, retry.Attempts(DefaultRetryTimes), retry.Sleep(500*time.Millisecond)) err := retry.Do(s.ctx, registerFn, retry.Attempts(DefaultRetryTimes), retry.Sleep(500*time.Millisecond))
...@@ -228,10 +230,12 @@ func (s *Session) processKeepAliveResponse(ch <-chan *clientv3.LeaseKeepAliveRes ...@@ -228,10 +230,12 @@ func (s *Session) processKeepAliveResponse(ch <-chan *clientv3.LeaseKeepAliveRes
return return
case resp, ok := <-ch: case resp, ok := <-ch:
if !ok { if !ok {
log.Debug("session keepalive channel closed")
close(failCh) close(failCh)
return return
} }
if resp == nil { if resp == nil {
log.Debug("session keepalive response failed")
close(failCh) close(failCh)
return return
} }
......
...@@ -109,11 +109,31 @@ func (helper *SchemaHelper) GetFieldFromName(fieldName string) (*schemapb.FieldS ...@@ -109,11 +109,31 @@ func (helper *SchemaHelper) GetFieldFromName(fieldName string) (*schemapb.FieldS
func (helper *SchemaHelper) GetFieldFromID(fieldID int64) (*schemapb.FieldSchema, error) { func (helper *SchemaHelper) GetFieldFromID(fieldID int64) (*schemapb.FieldSchema, error) {
offset, ok := helper.idOffset[fieldID] offset, ok := helper.idOffset[fieldID]
if !ok { if !ok {
return nil, fmt.Errorf("fieldName(%d) not found", fieldID) return nil, fmt.Errorf("fieldID(%d) not found", fieldID)
} }
return helper.schema.Fields[offset], nil return helper.schema.Fields[offset], nil
} }
func (helper *SchemaHelper) GetVectorDimFromID(filedID int64) (int, error) {
sch, err := helper.GetFieldFromID(filedID)
if err != nil {
return 0, err
}
if !IsVectorType(sch.DataType) {
return 0, fmt.Errorf("field type = %s not has dim", schemapb.DataType_name[int32(sch.DataType)])
}
for _, kv := range sch.TypeParams {
if kv.Key == "dim" {
dim, err := strconv.Atoi(kv.Value)
if err != nil {
return 0, err
}
return dim, nil
}
}
return 0, fmt.Errorf("fieldID(%d) not has dim", filedID)
}
func IsVectorType(dataType schemapb.DataType) bool { func IsVectorType(dataType schemapb.DataType) bool {
switch dataType { switch dataType {
case schemapb.DataType_FloatVector, schemapb.DataType_BinaryVector: case schemapb.DataType_FloatVector, schemapb.DataType_BinaryVector:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册