Cache type ids and names for gRPC converter
This commit is contained in:
parent
ec62f3e65f
commit
29a8eae7ed
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue