Skip to content

[BUG]: Handle version file creation with empty file paths #4552

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go/pkg/sysdb/coordinator/coordinator.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func (s *Coordinator) GetCollectionSize(ctx context.Context, collectionID types.
}

func (s *Coordinator) GetCollectionWithSegments(ctx context.Context, collectionID types.UniqueID) (*model.Collection, []*model.Segment, error) {
return s.catalog.GetCollectionWithSegments(ctx, collectionID)
return s.catalog.GetCollectionWithSegments(ctx, collectionID, false)
}

func (s *Coordinator) CheckCollection(ctx context.Context, collectionID types.UniqueID) (bool, error) {
Expand Down
125 changes: 109 additions & 16 deletions go/pkg/sysdb/coordinator/coordinator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,15 @@ func (suite *APIsTestSuite) TestCreateGetDeleteCollections() {
sort.Slice(results, func(i, j int) bool {
return results[i].Name < results[j].Name
})
suite.Equal(suite.sampleCollections, results)
suite.Len(results, len(suite.sampleCollections))
for i, collection := range results {
suite.Equal(suite.sampleCollections[i].ID, collection.ID)
suite.Equal(suite.sampleCollections[i].Name, collection.Name)
suite.Equal(suite.sampleCollections[i].TenantID, collection.TenantID)
suite.Equal(suite.sampleCollections[i].DatabaseName, collection.DatabaseName)
suite.Equal(suite.sampleCollections[i].Dimension, collection.Dimension)
suite.Equal(suite.sampleCollections[i].Metadata, collection.Metadata)
}

// Duplicate create fails
_, _, err = suite.coordinator.CreateCollection(ctx, &model.CreateCollection{
Expand Down Expand Up @@ -448,14 +456,26 @@ func (suite *APIsTestSuite) TestCreateGetDeleteCollections() {
for _, collection := range suite.sampleCollections {
result, err := suite.coordinator.GetCollections(ctx, types.NilUniqueID(), &collection.Name, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{collection}, result)
suite.Equal(len(result), 1)
suite.Equal(collection.ID, result[0].ID)
suite.Equal(collection.Name, result[0].Name)
suite.Equal(collection.TenantID, result[0].TenantID)
suite.Equal(collection.DatabaseName, result[0].DatabaseName)
suite.Equal(collection.Dimension, result[0].Dimension)
suite.Equal(collection.Metadata, result[0].Metadata)
}

// Find by id
for _, collection := range suite.sampleCollections {
result, err := suite.coordinator.GetCollections(ctx, collection.ID, nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{collection}, result)
suite.Equal(len(result), 1)
suite.Equal(collection.ID, result[0].ID)
suite.Equal(collection.Name, result[0].Name)
suite.Equal(collection.TenantID, result[0].TenantID)
suite.Equal(collection.DatabaseName, result[0].DatabaseName)
suite.Equal(collection.Dimension, result[0].Dimension)
suite.Equal(collection.Metadata, result[0].Metadata)
}

// Delete
Expand All @@ -470,10 +490,18 @@ func (suite *APIsTestSuite) TestCreateGetDeleteCollections() {

results, err = suite.coordinator.GetCollections(ctx, types.NilUniqueID(), nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
result_ids := make([]types.UniqueID, len(results))
for i, result := range results {
result_ids[i] = result.ID
}

suite.NotContains(results, c1)
sample_ids := make([]types.UniqueID, len(suite.sampleCollections))
for i, collection := range suite.sampleCollections {
sample_ids[i] = collection.ID
}
suite.NotContains(result_ids, c1.ID)
suite.Len(results, len(suite.sampleCollections)-1)
suite.ElementsMatch(results, suite.sampleCollections[1:])
suite.ElementsMatch(result_ids, sample_ids[1:])
byIDResult, err := suite.coordinator.GetCollections(ctx, c1.ID, nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Empty(byIDResult)
Expand Down Expand Up @@ -632,40 +660,88 @@ func (suite *APIsTestSuite) TestUpdateCollections() {
coll.Name = "new_name"
result, err := suite.coordinator.UpdateCollection(ctx, &model.UpdateCollection{ID: coll.ID, Name: &coll.Name})
suite.NoError(err)
suite.Equal(coll, result)
suite.Equal(coll.ID, result.ID)
suite.Equal(coll.Name, result.Name)
suite.Equal(coll.TenantID, result.TenantID)
suite.Equal(coll.DatabaseName, result.DatabaseName)
suite.Equal(coll.Dimension, result.Dimension)
suite.Equal(coll.Metadata, result.Metadata)

resultList, err := suite.coordinator.GetCollections(ctx, types.NilUniqueID(), &coll.Name, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{coll}, resultList)
suite.Equal(len(resultList), 1)
suite.Equal(coll.ID, resultList[0].ID)
suite.Equal(coll.Name, resultList[0].Name)
suite.Equal(coll.TenantID, resultList[0].TenantID)
suite.Equal(coll.DatabaseName, resultList[0].DatabaseName)
suite.Equal(coll.Dimension, resultList[0].Dimension)
suite.Equal(coll.Metadata, resultList[0].Metadata)

// Update dimension
newDimension := int32(128)
coll.Dimension = &newDimension
result, err = suite.coordinator.UpdateCollection(ctx, &model.UpdateCollection{ID: coll.ID, Dimension: coll.Dimension})
suite.NoError(err)
suite.Equal(coll, result)
suite.Equal(coll.ID, result.ID)
suite.Equal(coll.Name, result.Name)
suite.Equal(coll.TenantID, result.TenantID)
suite.Equal(coll.DatabaseName, result.DatabaseName)
suite.Equal(coll.Dimension, result.Dimension)
suite.Equal(coll.Metadata, result.Metadata)

resultList, err = suite.coordinator.GetCollections(ctx, coll.ID, nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{coll}, resultList)
suite.Equal(len(resultList), 1)
suite.Equal(coll.ID, resultList[0].ID)
suite.Equal(coll.Name, resultList[0].Name)
suite.Equal(coll.TenantID, resultList[0].TenantID)
suite.Equal(coll.DatabaseName, resultList[0].DatabaseName)
suite.Equal(coll.Dimension, resultList[0].Dimension)
suite.Equal(coll.Metadata, resultList[0].Metadata)

// Reset the metadata
newMetadata := model.NewCollectionMetadata[model.CollectionMetadataValueType]()
newMetadata.Add("test_str2", &model.CollectionMetadataValueStringType{Value: "str2"})
coll.Metadata = newMetadata
result, err = suite.coordinator.UpdateCollection(ctx, &model.UpdateCollection{ID: coll.ID, Metadata: coll.Metadata})
suite.NoError(err)
suite.Equal(coll, result)
suite.Equal(coll.ID, result.ID)
suite.Equal(coll.Name, result.Name)
suite.Equal(coll.TenantID, result.TenantID)
suite.Equal(coll.DatabaseName, result.DatabaseName)
suite.Equal(coll.Dimension, result.Dimension)
suite.Equal(coll.Metadata, result.Metadata)

resultList, err = suite.coordinator.GetCollections(ctx, coll.ID, nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{coll}, resultList)
suite.Equal(len(resultList), 1)
suite.Equal(coll.ID, resultList[0].ID)
suite.Equal(coll.Name, resultList[0].Name)
suite.Equal(coll.TenantID, resultList[0].TenantID)
suite.Equal(coll.DatabaseName, resultList[0].DatabaseName)
suite.Equal(coll.Dimension, resultList[0].Dimension)
suite.Equal(coll.Metadata, resultList[0].Metadata)

// Delete all metadata keys
coll.Metadata = nil
result, err = suite.coordinator.UpdateCollection(ctx, &model.UpdateCollection{ID: coll.ID, Metadata: coll.Metadata, ResetMetadata: true})
suite.NoError(err)
suite.Equal(coll, result)
suite.Equal(coll.ID, result.ID)
suite.Equal(coll.Name, result.Name)
suite.Equal(coll.TenantID, result.TenantID)
suite.Equal(coll.DatabaseName, result.DatabaseName)
suite.Equal(coll.Dimension, result.Dimension)
suite.Equal(coll.Metadata, result.Metadata)

resultList, err = suite.coordinator.GetCollections(ctx, coll.ID, nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
suite.Equal([]*model.Collection{coll}, resultList)
suite.Equal(len(resultList), 1)
suite.Equal(coll.ID, resultList[0].ID)
suite.Equal(coll.Name, resultList[0].Name)
suite.Equal(coll.TenantID, resultList[0].TenantID)
suite.Equal(coll.DatabaseName, resultList[0].DatabaseName)
suite.Equal(coll.Dimension, resultList[0].Dimension)
suite.Equal(coll.Metadata, resultList[0].Metadata)
}

func (suite *APIsTestSuite) TestGetOrCreateCollectionsTwice() {
Expand Down Expand Up @@ -794,7 +870,14 @@ func (suite *APIsTestSuite) TestGetMultipleWithDatabase() {
sort.Slice(result, func(i, j int) bool {
return result[i].Name < result[j].Name
})
suite.Equal(suite.sampleCollections, result)
for index, collection := range result {
suite.Equal(suite.sampleCollections[index].ID, collection.ID)
suite.Equal(suite.sampleCollections[index].Name, collection.Name)
suite.Equal(suite.sampleCollections[index].TenantID, collection.TenantID)
suite.Equal(suite.sampleCollections[index].DatabaseName, collection.DatabaseName)
suite.Equal(suite.sampleCollections[index].Dimension, collection.Dimension)
suite.Equal(suite.sampleCollections[index].Metadata, collection.Metadata)
}

result, err = suite.coordinator.GetCollections(ctx, types.NilUniqueID(), nil, suite.tenantName, suite.databaseName, nil, nil)
suite.NoError(err)
Expand Down Expand Up @@ -876,15 +959,25 @@ func (suite *APIsTestSuite) TestCreateDatabaseWithTenants() {
result, err := suite.coordinator.GetCollections(ctx, types.NilUniqueID(), nil, newTenantName, newDatabaseName, nil, nil)
suite.NoError(err)
suite.Len(result, 1)
suite.Equal(expected[0], result[0])
suite.Equal(expected[0].ID, result[0].ID)
suite.Equal(expected[0].Name, result[0].Name)
suite.Equal(expected[0].TenantID, result[0].TenantID)
suite.Equal(expected[0].DatabaseName, result[0].DatabaseName)
suite.Equal(expected[0].Dimension, result[0].Dimension)
suite.Equal(expected[0].Metadata, result[0].Metadata)

expected = []*model.Collection{suite.sampleCollections[1]}
expected[0].TenantID = suite.tenantName
expected[0].DatabaseName = newDatabaseName
result, err = suite.coordinator.GetCollections(ctx, types.NilUniqueID(), nil, suite.tenantName, newDatabaseName, nil, nil)
suite.NoError(err)
suite.Len(result, 1)
suite.Equal(expected[0], result[0])
suite.Equal(expected[0].ID, result[0].ID)
suite.Equal(expected[0].Name, result[0].Name)
suite.Equal(expected[0].TenantID, result[0].TenantID)
suite.Equal(expected[0].DatabaseName, result[0].DatabaseName)
suite.Equal(expected[0].Dimension, result[0].Dimension)
suite.Equal(expected[0].Metadata, result[0].Metadata)

// A new tenant DOES NOT have a default database. This does not error, instead 0
// results are returned
Expand Down
6 changes: 6 additions & 0 deletions go/pkg/sysdb/coordinator/model/collection.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package model

import (
"time"

"github.com/chroma-core/chroma/go/pkg/types"
)

Expand All @@ -21,6 +23,10 @@ type Collection struct {
TotalRecordsPostCompaction uint64
SizeBytesPostCompaction uint64 // Note: This represents the size of the records off the log
LastCompactionTimeSecs uint64
IsDeleted bool
VersionFileName string
CreatedAt time.Time
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is created at different than the Ts field?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't know. The person with that knowledge decided to leave us :(

DatabaseId types.UniqueID
}

type CollectionToGc struct {
Expand Down
4 changes: 4 additions & 0 deletions go/pkg/sysdb/coordinator/model_db_convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ func convertCollectionToModel(collectionAndMetadataList []*dbmodel.CollectionAnd
LastCompactionTimeSecs: collectionAndMetadata.Collection.LastCompactionTimeSecs,
RootCollectionID: rootCollectionID,
LineageFileName: collectionAndMetadata.Collection.LineageFileName,
IsDeleted: collectionAndMetadata.Collection.IsDeleted,
VersionFileName: collectionAndMetadata.Collection.VersionFileName,
CreatedAt: collectionAndMetadata.Collection.CreatedAt,
DatabaseId: types.MustParse(collectionAndMetadata.Collection.DatabaseID),
}
collection.Metadata = convertCollectionMetadataToModel(collectionAndMetadata.CollectionMetadata)
collections = append(collections, collection)
Expand Down
3 changes: 3 additions & 0 deletions go/pkg/sysdb/coordinator/model_db_convert_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ func TestConvertCollectionToModel(t *testing.T) {
collectionTotalRecordsPostCompaction := uint64(100)
collectionSizeBytesPostCompaction := uint64(500000)
collectionLastCompactionTimeSecs := uint64(1741037006)
dbId := types.NewUniqueID()
collectionAndMetadata := &dbmodel.CollectionAndMetadata{
Collection: &dbmodel.Collection{
ID: collectionID.String(),
Expand All @@ -147,6 +148,7 @@ func TestConvertCollectionToModel(t *testing.T) {
TotalRecordsPostCompaction: collectionTotalRecordsPostCompaction,
SizeBytesPostCompaction: collectionSizeBytesPostCompaction,
LastCompactionTimeSecs: collectionLastCompactionTimeSecs,
DatabaseID: dbId.String(),
},
CollectionMetadata: []*dbmodel.CollectionMetadata{},
}
Expand All @@ -161,4 +163,5 @@ func TestConvertCollectionToModel(t *testing.T) {
assert.Equal(t, collectionSizeBytesPostCompaction, modelCollections[0].SizeBytesPostCompaction)
assert.Equal(t, collectionLastCompactionTimeSecs, modelCollections[0].LastCompactionTimeSecs)
assert.Nil(t, modelCollections[0].Metadata)
assert.Equal(t, dbId, modelCollections[0].DatabaseId)
}
Loading
Loading