diff --git a/internal/distributed/proxy/httpserver/handler_v1.go b/internal/distributed/proxy/httpserver/handler_v1.go index 73f108eb671e3..feb8fdd0515b7 100644 --- a/internal/distributed/proxy/httpserver/handler_v1.go +++ b/internal/distributed/proxy/httpserver/handler_v1.go @@ -95,8 +95,7 @@ func (h *HandlersV1) describeCollection(ctx context.Context, c *gin.Context, dbN return nil, err } primaryField, ok := getPrimaryField(response.Schema) - if ok && primaryField.AutoID && !response.Schema.AutoID { - log.Warn("primary filed autoID VS schema autoID", zap.String("collectionName", collectionName), zap.Bool("primary Field", primaryField.AutoID), zap.Bool("schema", response.Schema.AutoID)) + if ok && primaryField.AutoID { response.Schema.AutoID = EnableAutoID } return response.Schema, nil @@ -163,10 +162,11 @@ func (h *HandlersV1) listCollections(c *gin.Context) { func (h *HandlersV1) createCollection(c *gin.Context) { httpReq := CreateCollectionReq{ - DbName: DefaultDbName, - MetricType: DefaultMetricType, - PrimaryField: DefaultPrimaryFieldName, - VectorField: DefaultVectorFieldName, + DbName: DefaultDbName, + MetricType: DefaultMetricType, + PrimaryField: DefaultPrimaryFieldName, + VectorField: DefaultVectorFieldName, + EnableDynamicField: EnableDynamic, } if err := c.ShouldBindWith(&httpReq, binding.JSON); err != nil { log.Warn("high level restful api, the parameter of create collection is incorrect", zap.Any("request", httpReq), zap.Error(err)) @@ -209,7 +209,7 @@ func (h *HandlersV1) createCollection(c *gin.Context) { AutoID: DisableAutoID, }, }, - EnableDynamicField: EnableDynamic, + EnableDynamicField: httpReq.EnableDynamicField, }) if err != nil { log.Warn("high level restful api, marshal collection schema fail", zap.Any("request", httpReq), zap.Error(err)) @@ -741,7 +741,8 @@ func (h *HandlersV1) upsert(c *gin.Context) { if err != nil || coll == nil { return } - if coll.AutoID { + primaryField, ok := getPrimaryField(coll) + if ok && primaryField.AutoID { err := merr.WrapErrParameterInvalid("autoID: false", "autoID: true", "cannot upsert an autoID collection") c.AbortWithStatusJSON(http.StatusOK, gin.H{HTTPReturnCode: merr.Code(err), HTTPReturnMessage: err.Error()}) return diff --git a/internal/distributed/proxy/httpserver/request.go b/internal/distributed/proxy/httpserver/request.go index 228fe3be1dbd3..5368cfebcac57 100644 --- a/internal/distributed/proxy/httpserver/request.go +++ b/internal/distributed/proxy/httpserver/request.go @@ -1,13 +1,14 @@ package httpserver type CreateCollectionReq struct { - DbName string `json:"dbName"` - CollectionName string `json:"collectionName" validate:"required"` - Dimension int32 `json:"dimension" validate:"required"` - Description string `json:"description"` - MetricType string `json:"metricType"` - PrimaryField string `json:"primaryField"` - VectorField string `json:"vectorField"` + DbName string `json:"dbName"` + CollectionName string `json:"collectionName" validate:"required"` + Dimension int32 `json:"dimension" validate:"required"` + Description string `json:"description"` + MetricType string `json:"metricType"` + PrimaryField string `json:"primaryField"` + VectorField string `json:"vectorField"` + EnableDynamicField bool `json:"enableDynamicField"` } type DropCollectionReq struct { diff --git a/internal/distributed/proxy/httpserver/utils.go b/internal/distributed/proxy/httpserver/utils.go index 3e379c5e3ca74..a2e1d8c733861 100644 --- a/internal/distributed/proxy/httpserver/utils.go +++ b/internal/distributed/proxy/httpserver/utils.go @@ -196,7 +196,7 @@ func checkAndSetData(body string, collSchema *schemapb.CollectionSchema) (error, dataString := gjson.Get(data.Raw, fieldName).String() - if field.IsPrimaryKey && collSchema.AutoID { + if field.IsPrimaryKey && field.AutoID { if dataString != "" { return merr.WrapErrParameterInvalid("", "set primary key but autoID == true"), reallyDataArray } diff --git a/internal/proxy/meta_cache.go b/internal/proxy/meta_cache.go index 9f9fb1b1bb195..a6c6fd654144a 100644 --- a/internal/proxy/meta_cache.go +++ b/internal/proxy/meta_cache.go @@ -1066,6 +1066,8 @@ func (m *MetaCache) RemoveDatabase(ctx context.Context, database string) { } func (m *MetaCache) HasDatabase(ctx context.Context, database string) bool { + m.mu.RLock() + defer m.mu.RUnlock() _, ok := m.collInfo[database] return ok }