Skip to content

Commit 6172bb3

Browse files
committed
fix: use sync map for lazy load
1 parent cd3257a commit 6172bb3

File tree

2 files changed

+65
-60
lines changed

2 files changed

+65
-60
lines changed

domain/project.go

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package domain
33
import (
44
"fmt"
55
"strconv"
6+
"sync"
67

78
"github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2/api"
89
"github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2/constants"
@@ -15,21 +16,18 @@ import (
1516
type Project struct {
1617
*api.Project
1718
OnlineStore OnlineStore
18-
FeatureViewMap map[string]FeatureView
19+
FeatureViewMap sync.Map
1920
FeatureEntityMap map[string]*FeatureEntity
20-
ModelMap map[string]*Model
21-
LabelTableMap map[int]*LabelTable
21+
ModelMap sync.Map
22+
LabelTableMap sync.Map
2223

2324
apiClient *api.APIClient
2425
}
2526

2627
func NewProject(p *api.Project, isInitClient bool) *Project {
2728
project := Project{
2829
Project: p,
29-
FeatureViewMap: make(map[string]FeatureView),
3030
FeatureEntityMap: make(map[string]*FeatureEntity),
31-
ModelMap: make(map[string]*Model),
32-
LabelTableMap: make(map[int]*LabelTable),
3331
}
3432

3533
switch p.OnlineDatasourceType {
@@ -89,50 +87,58 @@ func (p *Project) SetApiClient(apiClient *api.APIClient) {
8987
}
9088

9189
func (p *Project) GetFeatureView(name string) FeatureView {
92-
if _, exists := p.FeatureViewMap[name]; !exists {
93-
err := p.loadFeatureView(name)
94-
if err != nil {
95-
return nil
96-
}
90+
if value, exists := p.FeatureViewMap.Load(name); exists {
91+
return value.(FeatureView)
9792
}
98-
99-
return p.FeatureViewMap[name]
93+
if err := p.loadFeatureView(name); err != nil {
94+
return nil
95+
}
96+
if value, exists := p.FeatureViewMap.Load(name); exists {
97+
return value.(FeatureView)
98+
}
99+
return nil
100100
}
101101

102102
func (p *Project) GetFeatureEntity(name string) *FeatureEntity {
103103
return p.FeatureEntityMap[name]
104104
}
105105

106106
func (p *Project) GetLabelTable(labelTableId int) *LabelTable {
107-
if _, exists := p.LabelTableMap[labelTableId]; !exists {
108-
err := p.loadLabelTable(labelTableId)
109-
if err != nil {
110-
return nil
111-
}
107+
if value, exists := p.LabelTableMap.Load(labelTableId); exists {
108+
return value.(*LabelTable)
112109
}
113-
114-
return p.LabelTableMap[labelTableId]
110+
if err := p.loadLabelTable(labelTableId); err != nil {
111+
return nil
112+
}
113+
if value, exists := p.LabelTableMap.Load(labelTableId); exists {
114+
return value.(*LabelTable)
115+
}
116+
return nil
115117
}
116118

117119
func (p *Project) GetModel(name string) *Model {
118-
if _, exists := p.ModelMap[name]; !exists {
119-
err := p.loadModelFeature(name)
120-
if err != nil {
121-
return nil
122-
}
120+
if value, exists := p.ModelMap.Load(name); exists {
121+
return value.(*Model)
123122
}
124-
125-
return p.ModelMap[name]
123+
if err := p.loadModelFeature(name); err != nil {
124+
return nil
125+
}
126+
if value, exists := p.ModelMap.Load(name); exists {
127+
return value.(*Model)
128+
}
129+
return nil
126130
}
127131
func (p *Project) GetModelFeature(name string) *Model {
128-
if _, exists := p.ModelMap[name]; !exists {
129-
err := p.loadModelFeature(name)
130-
if err != nil {
131-
return nil
132-
}
132+
if value, exists := p.ModelMap.Load(name); exists {
133+
return value.(*Model)
133134
}
134-
135-
return p.ModelMap[name]
135+
if err := p.loadModelFeature(name); err != nil {
136+
return nil
137+
}
138+
if value, exists := p.ModelMap.Load(name); exists {
139+
return value.(*Model)
140+
}
141+
return nil
136142
}
137143

138144
func (p *Project) loadFeatureView(featureViewName string) error {
@@ -166,7 +172,7 @@ func (p *Project) loadFeatureView(featureViewName string) error {
166172
return fmt.Errorf("feature entity not exist, name=%s", featureView.FeatureEntityName)
167173
}
168174
featureViewDomain := NewFeatureView(featureView, p, entity)
169-
p.FeatureViewMap[featureView.Name] = featureViewDomain
175+
p.FeatureViewMap.Store(featureView.Name, featureViewDomain)
170176
}
171177

172178
if len(listFeatureViews.FeatureViews) == 0 || pageSize*pageNumber > listFeatureViews.TotalCount {
@@ -186,7 +192,7 @@ func (p *Project) loadLabelTable(labelTableId int) error {
186192
return err
187193
}
188194
labelTableDomain := NewLabelTable(getLabelTableResponse.LabelTable)
189-
p.LabelTableMap[labelTableId] = labelTableDomain
195+
p.LabelTableMap.Store(labelTableId, labelTableDomain)
190196

191197
return nil
192198
}
@@ -207,17 +213,13 @@ func (p *Project) loadModelFeature(modelFeatureName string) error {
207213
return err
208214
}
209215
model := getModelFeatureResponse.Model
210-
var labelTableDomain *LabelTable
211-
if _, exists := p.LabelTableMap[model.LabelTableId]; !exists {
212-
err := p.loadLabelTable(model.LabelTableId)
213-
if err != nil {
214-
fmt.Printf("get label table error, err=%v", err)
215-
return err
216-
}
216+
labelTableDomain := p.GetLabelTable(model.LabelTableId)
217+
if labelTableDomain == nil {
218+
fmt.Printf("label table not exist, id=%d", model.LabelTableId)
219+
return fmt.Errorf("label table not exist, id=%d", model.LabelTableId)
217220
}
218-
labelTableDomain = p.LabelTableMap[model.LabelTableId]
219221
modelDomain := NewModel(model, p, labelTableDomain)
220-
p.ModelMap[model.Name] = modelDomain
222+
p.ModelMap.Store(model.Name, modelDomain)
221223
}
222224

223225
if len(listModelFeatures.Models) == 0 || pageSize*pageNumber > listModelFeatures.TotalCount {

featurestore/feature_store_client.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ func (c *FeatureStoreClient) LoadProjectData() error {
266266
p.Signature = c.signature
267267

268268
project := domain.NewProject(p, c.datasourceInitClient)
269+
project.SetApiClient(c.client)
269270
projectData[project.ProjectName] = project
270271

271272
var (
@@ -319,7 +320,7 @@ func (c *FeatureStoreClient) LoadProjectData() error {
319320
}
320321

321322
featureViewDomain := domain.NewFeatureView(featureView, project, project.FeatureEntityMap[featureView.FeatureEntityName])
322-
project.FeatureViewMap[featureView.Name] = featureViewDomain
323+
project.FeatureViewMap.Store(featureView.Name, featureViewDomain)
323324

324325
}
325326

@@ -333,7 +334,6 @@ func (c *FeatureStoreClient) LoadProjectData() error {
333334

334335
pagenumber = 1
335336
// get model
336-
labelTableMap := make(map[string]*domain.LabelTable)
337337
for {
338338
listModelsResponse, err := c.client.FsModelApi.ListModels(pagesize, pagenumber, strconv.Itoa(project.ProjectId))
339339
if err != nil {
@@ -348,20 +348,13 @@ func (c *FeatureStoreClient) LoadProjectData() error {
348348
return err
349349
}
350350
model := getModelResponse.Model
351-
var labelTableDomain *domain.LabelTable
352-
if labelTable, exists := labelTableMap[model.LabelDatasourceTable]; !exists || labelTable == nil {
353-
getLabelTableResponse, err := c.client.LabelTableApi.GetLabelTableByID(strconv.Itoa(model.LabelTableId))
354-
if err != nil {
355-
c.logError(fmt.Errorf("get label table error, err=%v", err))
356-
return err
357-
}
358-
labelTableDomain = domain.NewLabelTable(getLabelTableResponse.LabelTable)
359-
labelTableMap[model.LabelDatasourceTable] = labelTableDomain
360-
} else {
361-
labelTableDomain = labelTable
351+
labelTable := project.GetLabelTable(model.LabelTableId)
352+
if labelTable == nil {
353+
c.logError(fmt.Errorf("not found label table, labelTableId:%d", model.LabelTableId))
354+
return fmt.Errorf("not found label table, labelTableId:%d", model.LabelTableId)
362355
}
363-
modelDomain := domain.NewModel(model, project, labelTableDomain)
364-
project.ModelMap[model.Name] = modelDomain
356+
modelDomain := domain.NewModel(model, project, labelTable)
357+
project.ModelMap.Store(model.Name, modelDomain)
365358

366359
}
367360

@@ -472,6 +465,16 @@ func (c *FeatureStoreClient) lazyLoadProjectData() error {
472465
}
473466

474467
func (c *FeatureStoreClient) loopLoadProjectData() {
468+
func() {
469+
defer func() {
470+
if r := recover(); r != nil {
471+
fmt.Println("Recovered from panic:", r)
472+
}
473+
}()
474+
475+
c.LoadProjectData()
476+
}()
477+
475478
ticker := time.NewTicker(time.Minute)
476479
defer ticker.Stop()
477480
for {

0 commit comments

Comments
 (0)