Cache type ids and names for gRPC converter

This commit is contained in:
Dhiraj Bokde 2023-10-04 11:19:19 -07:00
parent ec62f3e65f
commit 29a8eae7ed
3 changed files with 35 additions and 3 deletions

View File

@ -1,6 +1,7 @@
package converter
import (
"fmt"
"github.com/opendatahub-io/model-registry/internal/ml_metadata/proto"
"github.com/opendatahub-io/model-registry/internal/model/db"
"gorm.io/gorm"
@ -13,11 +14,12 @@ var (
// SetConverterDB must be called before using gRPC converters,
// it uses the singleton DB connection to lookup type names
func SetConverterDB(db *gorm.DB) {
func SetConverterDB(db *gorm.DB) error {
if globalDB != nil {
panic("converter global DB connection MUST only be set once")
return fmt.Errorf("converter global DB connection MUST only be set once")
}
globalDB = db
return initTypeNameCache()
}
// goverter:converter

View File

@ -6,12 +6,37 @@ import (
"github.com/opendatahub-io/model-registry/internal/model/db"
"google.golang.org/protobuf/types/known/anypb"
"google.golang.org/protobuf/types/known/structpb"
"sync"
)
var typeNameCache = map[int64]string{}
var cacheMutex = sync.Mutex{}
func initTypeNameCache() error {
cacheMutex.Lock()
defer cacheMutex.Unlock()
var types []db.Type
if err := globalDB.Model(db.Type{}).Select("id", "name").Find(&types).Error; err != nil {
return fmt.Errorf("error initializing type id cache: %w", err)
}
for _, t := range types {
typeNameCache[t.ID] = t.Name
}
return nil
}
func ConvertTypeIDToName(id int64) (*string, error) {
if id == 0 {
return nil, nil
}
cacheMutex.Lock()
defer cacheMutex.Unlock()
if name, ok := typeNameCache[id]; ok {
return &name, nil
}
if globalDB == nil {
return nil, fmt.Errorf("converter DB connection has not been initialized")
}
@ -19,6 +44,10 @@ func ConvertTypeIDToName(id int64) (*string, error) {
if err := globalDB.Model(db.Type{}).Select("name").Where("id = ?", id).First(&name).Error; err != nil {
return nil, fmt.Errorf("error getting type name for type id %d: %w", id, err)
}
// update cache
typeNameCache[id] = name
return &name, nil
}

View File

@ -827,8 +827,9 @@ func TestConvertTypeIDToName(t *testing.T) {
}
_ = dbConn.Migrator().AutoMigrate(db.Type{})
_ = dbConn.Exec("INSERT INTO Type VALUES(1,'mlmd.Dataset',NULL,1,NULL,NULL,NULL,NULL)").Error
_ = SetConverterDB(dbConn)
// add a new type after the converter cache is initialized
_ = dbConn.Exec("INSERT INTO Type VALUES(2,'mlmd.Model',NULL,1,NULL,NULL,NULL,NULL)").Error
SetConverterDB(dbConn)
type args struct {
id int64