From a6b865e7a2b46517deb2047438c8e4f451d22ec6 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 21 Dec 2018 17:10:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A1.=20sql.Rows?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=90=8E=E6=9C=AA=E5=85=B3=E9=97=AD=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8D=A0=E7=94=A8db=E9=93=BE=E6=8E=A5=202.?= =?UTF-8?q?=20=E6=9C=8D=E5=8A=A1=E5=90=AF=E5=8A=A8=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E7=94=A8AppDBInit=E6=96=B9=E6=B3=95=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?db=E8=BF=9E=E6=8E=A5=E6=B1=A0=E4=B8=8A=E9=99=90=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E8=80=97=E5=B0=BDmysql=E8=BF=9E=E6=8E=A5=203?= =?UTF-8?q?.=20app=E5=92=8Cworkmanager=E5=A2=9E=E5=8A=A0db=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E7=94=A8=E6=9D=A5=E6=A0=87=E7=A4=BA=E8=AF=A5?= =?UTF-8?q?worker=E5=92=8Capp=E6=98=AF=E5=90=A6=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=EF=BC=8C=E4=BB=8E=E8=80=8C=E4=BC=B0=E8=AE=A1?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E8=AE=BE=E7=BD=AE=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9E=E6=8E=A5=E7=9A=84=E4=B8=8A=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/appsrv/appsrv.go | 21 ++++++------ pkg/appsrv/workers.go | 19 +++++++++-- pkg/cloudcommon/app.go | 6 ++-- pkg/cloudcommon/cronman/cronman.go | 13 +++++-- pkg/cloudcommon/database.go | 34 +++++++++++++++++++ pkg/cloudcommon/db/db_dispatcher.go | 10 +++--- pkg/cloudcommon/db/taskman/handler.go | 2 +- pkg/cloudcommon/db/taskman/localtaskworker.go | 2 +- pkg/cloudcommon/db/taskman/taskobjs.go | 7 +++- pkg/compute/models/capabilities.go | 3 ++ pkg/compute/models/cloudaccounts.go | 2 ++ pkg/compute/models/guestnetworks.go | 1 + pkg/compute/models/guests.go | 1 + pkg/compute/models/hosts.go | 1 + pkg/compute/models/loadbalanceragents.go | 1 + pkg/compute/models/networks.go | 2 ++ pkg/compute/models/specs.go | 1 + pkg/compute/service/service.go | 2 +- pkg/scheduler/db/models/metadata.go | 1 + pkg/util/logclient/logclient.go | 2 +- pkg/webconsole/service/service.go | 2 +- pkg/yunionconf/service/service.go | 2 +- 22 files changed, 107 insertions(+), 28 deletions(-) diff --git a/pkg/appsrv/appsrv.go b/pkg/appsrv/appsrv.go index b498328efc..5121277058 100644 --- a/pkg/appsrv/appsrv.go +++ b/pkg/appsrv/appsrv.go @@ -47,12 +47,12 @@ const ( DEFAULT_PROCESS_TIMEOUT = 15 * time.Second ) -func NewApplication(name string, connMax int) *Application { +func NewApplication(name string, connMax int, db bool) *Application { app := Application{name: name, context: context.Background(), connMax: connMax, - session: NewWorkerManager("HttpRequestWorkerManager", connMax, DEFAULT_BACKLOG), - systemSession: NewWorkerManager("InternalHttpRequestWorkerManager", 1, DEFAULT_BACKLOG), + session: NewWorkerManager("HttpRequestWorkerManager", connMax, DEFAULT_BACKLOG, db), + systemSession: NewWorkerManager("InternalHttpRequestWorkerManager", 1, DEFAULT_BACKLOG, false), roots: make(map[string]*RadixNode), rootLock: &sync.RWMutex{}, idleTimeout: DEFAULT_IDLE_TIMEOUT, @@ -273,7 +273,7 @@ func (app *Application) defaultHandle(w http.ResponseWriter, r *http.Request, ri return nil, nil } -func (app *Application) addDefaultHandler(method string, prefix string, handler func(context.Context, http.ResponseWriter, *http.Request), name string) { +func (app *Application) AddDefaultHandler(method string, prefix string, handler func(context.Context, http.ResponseWriter, *http.Request), name string) { segs := SplitPath(prefix) hi := newHandlerInfo(method, segs, handler, nil, name, nil) hi.SetSkipLog(true).SetWorkerManager(app.systemSession) @@ -281,11 +281,11 @@ func (app *Application) addDefaultHandler(method string, prefix string, handler } func (app *Application) addDefaultHandlers() { - app.addDefaultHandler("GET", "/version", VersionHandler, "version") - app.addDefaultHandler("GET", "/stats", StatisticHandler, "stats") - app.addDefaultHandler("POST", "/ping", PingHandler, "ping") - app.addDefaultHandler("GET", "/ping", PingHandler, "ping") - app.addDefaultHandler("GET", "/worker_stats", WorkerStatsHandler, "worker_stats") + app.AddDefaultHandler("GET", "/version", VersionHandler, "version") + app.AddDefaultHandler("GET", "/stats", StatisticHandler, "stats") + app.AddDefaultHandler("POST", "/ping", PingHandler, "ping") + app.AddDefaultHandler("GET", "/ping", PingHandler, "ping") + app.AddDefaultHandler("GET", "/worker_stats", WorkerStatsHandler, "worker_stats") } func timeoutHandle(h http.Handler) http.HandlerFunc { @@ -301,11 +301,12 @@ func timeoutHandle(h http.Handler) http.HandlerFunc { } func (app *Application) initServer(addr string) *http.Server { - db := AppContextDB(app.context) + /* db := AppContextDB(app.context) if db != nil { db.SetMaxIdleConns(app.connMax + 1) db.SetMaxOpenConns(app.connMax + 1) } + */ app.addDefaultHandlers() s := &http.Server{ Addr: addr, diff --git a/pkg/appsrv/workers.go b/pkg/appsrv/workers.go index 3a8d7076f9..9b98505847 100644 --- a/pkg/appsrv/workers.go +++ b/pkg/appsrv/workers.go @@ -129,9 +129,10 @@ type SWorkerManager struct { detachedWorker *SWorkerList workerLock *sync.Mutex workerId uint64 + dbWorker bool } -func NewWorkerManager(name string, workerCount int, backlog int) *SWorkerManager { +func NewWorkerManager(name string, workerCount int, backlog int, dbWorker bool) *SWorkerManager { manager := SWorkerManager{name: name, queue: NewRing(workerCount * backlog), workerCount: workerCount, @@ -139,7 +140,9 @@ func NewWorkerManager(name string, workerCount int, backlog int) *SWorkerManager activeWorker: newWorkerList(), detachedWorker: newWorkerList(), workerLock: &sync.Mutex{}, - workerId: 0} + workerId: 0, + dbWorker: dbWorker, + } workerManagers = append(workerManagers, &manager) return &manager @@ -206,7 +209,7 @@ func (wm *SWorkerManager) scheduleWithLock() { } go worker.run() } else { - log.Warningf("[%s] BUSY activeWork %d max %d queue: %d", wm, wm.activeWorker.size(), wm.workerCount, wm.queue.Size()) + log.Warningf("[%s] BUSY activeWork %d detachedWork %d max %d queue: %d", wm, wm.ActiveWorkerCount(), wm.DetachedWorkerCount(), wm.workerCount, wm.queue.Size()) } } @@ -247,3 +250,13 @@ func WorkerStatsHandler(ctx context.Context, w http.ResponseWriter, r *http.Requ result.Add(jsonutils.Marshal(&stats), "workers") fmt.Fprintf(w, result.String()) } + +func GetDBConnectionCount() int { + conn := 0 + for i := 0; i < len(workerManagers); i += 1 { + if workerManagers[i].dbWorker { + conn += workerManagers[i].workerCount + } + } + return conn +} diff --git a/pkg/cloudcommon/app.go b/pkg/cloudcommon/app.go index c8c6523caf..0f4588b492 100644 --- a/pkg/cloudcommon/app.go +++ b/pkg/cloudcommon/app.go @@ -8,9 +8,9 @@ import ( "yunion.io/x/onecloud/pkg/appsrv" ) -func InitApp(options *Options) *appsrv.Application { +func InitApp(options *Options, dbAccess bool) *appsrv.Application { // cache := appsrv.NewCache(options.AuthTokenCacheSize) - app := appsrv.NewApplication(options.ApplicationID, options.RequestWorkerCount) + app := appsrv.NewApplication(options.ApplicationID, options.RequestWorkerCount, dbAccess) app.CORSAllowHosts(options.CorsHosts) // app.SetContext(appsrv.APP_CONTEXT_KEY_CACHE, cache) @@ -21,6 +21,8 @@ func InitApp(options *Options) *appsrv.Application { } func ServeForever(app *appsrv.Application, options *Options) { + AppDBInit(app) + addr := net.JoinHostPort(options.Address, strconv.Itoa(options.Port)) proto := "http" if options.EnableSsl { diff --git a/pkg/cloudcommon/cronman/cronman.go b/pkg/cloudcommon/cronman/cronman.go index 75d897e31b..9946a03a99 100644 --- a/pkg/cloudcommon/cronman/cronman.go +++ b/pkg/cloudcommon/cronman/cronman.go @@ -8,6 +8,7 @@ import ( "yunion.io/x/log" "yunion.io/x/onecloud/pkg/appctx" + "yunion.io/x/onecloud/pkg/appsrv" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" ) @@ -18,7 +19,8 @@ var manager *SCronJobManager func init() { manager = &SCronJobManager{ - jobs: make([]*SCronJob, 0), + jobs: make([]*SCronJob, 0), + workers: appsrv.NewWorkerManager("CronJobWorkers", 4, 1024, true), } } @@ -88,6 +90,7 @@ type SCronJobManager struct { add chan *SCronJob stop chan struct{} running bool + workers *appsrv.SWorkerManager } func GetCronJobManager() *SCronJobManager { @@ -171,7 +174,7 @@ func (self *SCronJobManager) run() { if job.Next.After(now) || job.Next.IsZero() { break } - go job.runJob(false) + job.runJob(false) job.Next = job.Timer.Next(now) heap.Fix(&self.jobs, i) } @@ -187,6 +190,12 @@ func (self *SCronJobManager) run() { } func (job *SCronJob) runJob(isStart bool) { + manager.workers.Run(func() { + job.runJobInWorker(isStart) + }, nil, nil) +} + +func (job *SCronJob) runJobInWorker(isStart bool) { defer func() { if r := recover(); r != nil { log.Errorf("CronJob task %s run error: %s", job.Name, r) diff --git a/pkg/cloudcommon/database.go b/pkg/cloudcommon/database.go index 03db1d2f2e..f9d7ad1836 100644 --- a/pkg/cloudcommon/database.go +++ b/pkg/cloudcommon/database.go @@ -1,15 +1,24 @@ package cloudcommon import ( + "context" "database/sql" + "fmt" + "net/http" + "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/appsrv" "yunion.io/x/onecloud/pkg/cloudcommon/consts" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" ) +const ( + MIN_DB_CONN_MAX = 5 +) + func InitDB(options *DBOptions) { if options.GlobalVirtualResourceNamespace { consts.EnableGlobalVirtualResourceNamespace() @@ -33,3 +42,28 @@ func InitDB(options *DBOptions) { func CloseDB() { sqlchemy.CloseDB() } + +func AppDBInit(app *appsrv.Application) { + dbConn := sqlchemy.GetDB() + if dbConn != nil { + connMax := appsrv.GetDBConnectionCount() + if connMax < MIN_DB_CONN_MAX { + connMax = MIN_DB_CONN_MAX + } + log.Infof("Total %d db workers, set db connection max", connMax) + dbConn.SetMaxIdleConns(connMax) + dbConn.SetMaxOpenConns(connMax*2 + 1) + } + + app.AddDefaultHandler("GET", "/db_stats", DBStatsHandler, "db_stats") +} + +func DBStatsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { + result := jsonutils.NewDict() + dbConn := sqlchemy.GetDB() + if dbConn != nil { + stats := dbConn.Stats() + result.Add(jsonutils.Marshal(&stats), "db_stats") + } + fmt.Fprintf(w, result.String()) +} diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index aec1b351c8..1b03d0fe48 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -305,10 +305,6 @@ func listItemQueryFilters(manager IModelManager, ctx context.Context, q *sqlchem } func query2List(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, q *sqlchemy.SQuery, query jsonutils.JSONObject) ([]jsonutils.JSONObject, error) { - rows, err := q.Rows() - if err != nil { - return nil, err - } listF := listFields(manager, userCred) fieldFilter := jsonutils.GetQueryStringArray(query, "field") if len(fieldFilter) > 0 && IsAdminAllowList(userCred, manager) { @@ -332,6 +328,11 @@ func query2List(manager IModelManager, ctx context.Context, userCred mcclient.To return nil, err } results := make([]jsonutils.JSONObject, 0) + rows, err := q.Rows() + if err != nil { + return nil, err + } + defer rows.Close() for rows.Next() { itemValue := reflect.Indirect(reflect.ValueOf(item)) itemValue.Set(itemInitValue) @@ -758,6 +759,7 @@ func FetchModelObjects(modelManager IModelManager, query *sqlchemy.SQuery, targe } return err } + defer rows.Close() targetsValue := reflect.Indirect(reflect.ValueOf(targets)) for rows.Next() { diff --git a/pkg/cloudcommon/db/taskman/handler.go b/pkg/cloudcommon/db/taskman/handler.go index 84a80d6550..479d0234fe 100644 --- a/pkg/cloudcommon/db/taskman/handler.go +++ b/pkg/cloudcommon/db/taskman/handler.go @@ -11,7 +11,7 @@ import ( var taskWorkMan *appsrv.SWorkerManager func init() { - taskWorkMan = appsrv.NewWorkerManager("TaskWorkerManager", 4, 1024) + taskWorkMan = appsrv.NewWorkerManager("TaskWorkerManager", 4, 1024, true) } func AddTaskHandler(prefix string, app *appsrv.Application) { diff --git a/pkg/cloudcommon/db/taskman/localtaskworker.go b/pkg/cloudcommon/db/taskman/localtaskworker.go index 3b2f70c4a8..edd78634b8 100644 --- a/pkg/cloudcommon/db/taskman/localtaskworker.go +++ b/pkg/cloudcommon/db/taskman/localtaskworker.go @@ -12,7 +12,7 @@ import ( var localTaskWorkerMan *appsrv.SWorkerManager func init() { - localTaskWorkerMan = appsrv.NewWorkerManager("LocalTaskWorkerManager", 4, 1024) + localTaskWorkerMan = appsrv.NewWorkerManager("LocalTaskWorkerManager", 4, 1024, false) } func Error2TaskData(err error) jsonutils.JSONObject { diff --git a/pkg/cloudcommon/db/taskman/taskobjs.go b/pkg/cloudcommon/db/taskman/taskobjs.go index 5fd8aaf7bd..765798cb67 100644 --- a/pkg/cloudcommon/db/taskman/taskobjs.go +++ b/pkg/cloudcommon/db/taskman/taskobjs.go @@ -1,6 +1,8 @@ package taskman import ( + "database/sql" + "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -29,9 +31,12 @@ func (manager *STaskObjectManager) GetObjectIds(task *STask) []string { q := taskobjs.Query(taskobjs.Field("obj_id")).Equals("task_id", task.Id) rows, err := q.Rows() if err != nil { - log.Errorf("TaskObjectManager GetObjectIds fail %s", err) + if err != sql.ErrNoRows { + log.Errorf("TaskObjectManager GetObjectIds fail %s", err) + } return nil } + defer rows.Close() for rows.Next() { var objId string err = rows.Scan(&objId) diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index d6fb559df4..dbd3fb51e2 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -57,6 +57,7 @@ func getHypervisors(zone *SZone) []string { if err != nil { return nil } + defer rows.Close() hypervisors := make([]string, 0) for rows.Next() { var hostType string @@ -80,6 +81,7 @@ func getStorageTypes(zone *SZone) []string { if err != nil { return nil } + defer rows.Close() storageTypes := make([]string, 0) for rows.Next() { var storageType, mediumType string @@ -106,6 +108,7 @@ func getGPUs(zone *SZone) []string { if err != nil { return nil } + defer rows.Close() gpus := make([]string, 0) for rows.Next() { var model string diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 66ca78f13b..dffdedf171 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -588,6 +588,7 @@ func (self *SCloudaccount) getProjectIds() []string { if err != nil { return nil } + defer rows.Close() ret := make([]string, 0) for rows.Next() { var projId string @@ -606,6 +607,7 @@ func (self *SCloudaccount) getVersion() string { if err != nil { return "" } + defer rows.Close() ret := make([]string, 0) for rows.Next() { var projId string diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index 9aec20d6ae..385a16a51e 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -574,6 +574,7 @@ func (manager *SGuestnetworkManager) getRecentlyReleasedIPAddresses(networkId st log.Errorf("GetRecentlyReleasedIPAddresses fail %s", err) return nil } + defer rows.Close() ret := make(map[string]bool) for rows.Next() { var ip string diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 631f87f3cb..42da5c8af6 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3330,6 +3330,7 @@ func (manager *SGuestManager) GetIpInProjectWithName(projectId, name string, isE log.Errorf("Get guest ip with name query err: %v", err) return ips } + defer rows.Close() for rows.Next() { var ip string err = rows.Scan(&ip) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 4d4ce2bf1e..a5f8164269 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -3494,6 +3494,7 @@ func (manager *SHostManager) GetEsxiAgentHostId(key string) (string, error) { if err != nil { return "", err } + defer rows.Close() var hostId string hostIds := make([]string, 0) diff --git a/pkg/compute/models/loadbalanceragents.go b/pkg/compute/models/loadbalanceragents.go index d8a539a7b2..756e74abda 100644 --- a/pkg/compute/models/loadbalanceragents.go +++ b/pkg/compute/models/loadbalanceragents.go @@ -330,6 +330,7 @@ func (man *SLoadbalancerAgentManager) CleanPendingDeleteLoadbalancers(ctx contex log.Errorf("%s: query pending_deleted_at < %s: %s", keyPlural, minT, err) continue } + defer rows.Close() m, err := db.NewModelObject(man) if err != nil { log.Errorf("%s: new model object failed: %s", keyPlural, err) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index b540d3abd4..c43b5b5255 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -189,6 +189,7 @@ func (self *SNetwork) GetUsedAddresses() map[string]bool { log.Errorf("GetUsedAddresses query fail: %s", err) return nil } + defer rows.Close() for rows.Next() { var ip string err = rows.Scan(&ip) @@ -298,6 +299,7 @@ func (self *SNetwork) GetUsedIfnames() map[string]bool { log.Errorf("GetUsedIfnames query fail: %s", err) return nil } + defer rows.Close() for rows.Next() { var ifname string err = rows.Scan(&ifname) diff --git a/pkg/compute/models/specs.go b/pkg/compute/models/specs.go index 841d1c87f8..93ed7a49a5 100644 --- a/pkg/compute/models/specs.go +++ b/pkg/compute/models/specs.go @@ -92,6 +92,7 @@ func ListItems(manager db.IModelManager, ctx context.Context, userCred mcclient. if err != nil { return nil, err } + defer rows.Close() items := make([]ISpecModel, 0) for rows.Next() { item, err := db.NewModelObject(manager) diff --git a/pkg/compute/service/service.go b/pkg/compute/service/service.go index bd4623bd21..398033c794 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -48,7 +48,7 @@ func StartService() { cloudcommon.InitDB(&options.Options.DBOptions) defer cloudcommon.CloseDB() - app := cloudcommon.InitApp(&options.Options.Options) + app := cloudcommon.InitApp(&options.Options.Options, true) compute.InitHandlers(app) diff --git a/pkg/scheduler/db/models/metadata.go b/pkg/scheduler/db/models/metadata.go index 1bc3fc4559..52f9fabf4f 100644 --- a/pkg/scheduler/db/models/metadata.go +++ b/pkg/scheduler/db/models/metadata.go @@ -40,5 +40,6 @@ func FetchMetadatas(resourceName string, ids, keys []string) ([]interface{}, err if err != nil { return nil, err } + defer rows.Close() return rowsToArray(Metadatas, rows) } diff --git a/pkg/util/logclient/logclient.go b/pkg/util/logclient/logclient.go index 9f84d5b3fe..fd675fcfd1 100644 --- a/pkg/util/logclient/logclient.go +++ b/pkg/util/logclient/logclient.go @@ -70,7 +70,7 @@ var BLACK_LIST_OBJ_TYPE = []string{"parameter"} var logclientWorkerMan *appsrv.SWorkerManager func init() { - logclientWorkerMan = appsrv.NewWorkerManager("LogClientWorkerManager", 1, 50) + logclientWorkerMan = appsrv.NewWorkerManager("LogClientWorkerManager", 1, 50, false) } type IObject interface { diff --git a/pkg/webconsole/service/service.go b/pkg/webconsole/service/service.go index c96fe85d2a..d3bc7a9775 100644 --- a/pkg/webconsole/service/service.go +++ b/pkg/webconsole/service/service.go @@ -48,7 +48,7 @@ func StartService() { } func start() { - app := cloudcommon.InitApp(&o.Options.Options) + app := cloudcommon.InitApp(&o.Options.Options, false) webconsole.InitHandlers(app) root := mux.NewRouter() diff --git a/pkg/yunionconf/service/service.go b/pkg/yunionconf/service/service.go index 9520a5dfba..8c29c5ef0b 100644 --- a/pkg/yunionconf/service/service.go +++ b/pkg/yunionconf/service/service.go @@ -30,7 +30,7 @@ func StartService() { cloudcommon.InitDB(&options.Options.DBOptions) defer cloudcommon.CloseDB() - app := cloudcommon.InitApp(&options.Options.Options) + app := cloudcommon.InitApp(&options.Options.Options, true) yunionconf.InitHandlers(app) if db.CheckSync(options.Options.AutoSyncTable) { From fdaec75067e0ddd2792546d0c4506fcd7cf372bd Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 21 Dec 2018 22:13:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=9C=A8rowsToArray=E4=B8=AD=E8=BF=9B?= =?UTF-8?q?=E8=A1=8Cdefer=20rows.Close()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/scheduler/db/models/base.go | 2 ++ pkg/scheduler/db/models/metadata.go | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/scheduler/db/models/base.go b/pkg/scheduler/db/models/base.go index 403a924e3a..c944fcd80e 100644 --- a/pkg/scheduler/db/models/base.go +++ b/pkg/scheduler/db/models/base.go @@ -136,6 +136,8 @@ func virtualResourceRowsNotDeletedIn(r Resourcer, key string, set []string) (*sq } func rowsToArray(r Resourcer, rows *sql.Rows) ([]interface{}, error) { + defer rows.Close() + columns, _ := rows.Columns() objs := make([]interface{}, 0, len(columns)) diff --git a/pkg/scheduler/db/models/metadata.go b/pkg/scheduler/db/models/metadata.go index 52f9fabf4f..1bc3fc4559 100644 --- a/pkg/scheduler/db/models/metadata.go +++ b/pkg/scheduler/db/models/metadata.go @@ -40,6 +40,5 @@ func FetchMetadatas(resourceName string, ids, keys []string) ([]interface{}, err if err != nil { return nil, err } - defer rows.Close() return rowsToArray(Metadatas, rows) }