stop periodic logging when DB closed.
diff --git a/data/data.go b/data/data.go
index c5b0925..2566afa 100644
--- a/data/data.go
+++ b/data/data.go
@@ -45,7 +45,12 @@
var log, dbTraceLog apid.LogService
var config apid.ConfigService
-var dbMap = make(map[string]*sql.DB)
+type dbMapInfo struct {
+ db *sql.DB
+ closed chan bool
+}
+
+var dbMap = make(map[string]*dbMapInfo)
var dbMapSync sync.RWMutex
func CreateDataService() apid.DataService {
@@ -101,12 +106,17 @@
dbMapSync.Lock()
defer dbMapSync.Unlock()
- db := dbMap[versionedID]
- if db != nil {
- dbMap[versionedID] = nil
+ dbm := dbMap[versionedID]
+ if dbm.db != nil {
+ if strings.EqualFold(config.GetString(logger.ConfigLevel), logrus.DebugLevel.String()) {
+ dbm.closed <- true
+ }
log.Warn("SETTING FINALIZER")
finalizer := Delete(versionedID)
- runtime.SetFinalizer(db, finalizer)
+ runtime.SetFinalizer(dbm.db, finalizer)
+ dbMap[versionedID] = nil
+ } else {
+ log.Error("Cannot find DB handle for ver {%s} to release", version)
}
return
@@ -114,23 +124,19 @@
func (d *dataService) dbVersionForID(id, version string) (db *sql.DB, err error) {
+ var stoplogchan chan bool
versionedID := VersionedDBID(id, version)
dbMapSync.RLock()
- db = dbMap[versionedID]
+ dbm := dbMap[versionedID]
dbMapSync.RUnlock()
- if db != nil {
- return
+ if dbm != nil && dbm.db != nil {
+ return dbm.db, nil
}
dbMapSync.Lock()
defer dbMapSync.Unlock()
- db = dbMap[versionedID]
- if db != nil {
- return
- }
-
dataPath := DBPath(versionedID)
if err = os.MkdirAll(path.Dir(dataPath), 0700); err != nil {
@@ -175,15 +181,16 @@
log.Errorf("error enabling foreign_keys: %s", err)
return
}
- dbLvl := config.GetString(logger.ConfigLevel)
- if strings.EqualFold(dbLvl, logrus.DebugLevel.String()) {
- go printDBStatsInfo(db, versionedID)
+ if strings.EqualFold(config.GetString(logger.ConfigLevel),
+ logrus.DebugLevel.String()) {
+ stoplogchan = logDBInfo(versionedID, db)
}
db.SetMaxOpenConns(config.GetInt(api.ConfigDBMaxConns))
db.SetMaxIdleConns(config.GetInt(api.ConfigDBIdleConns))
db.SetConnMaxLifetime(time.Duration(config.GetInt(api.ConfigDBConnsTimeout)) * time.Second)
- dbMap[versionedID] = db
+ dbInfo := dbMapInfo {db: db, closed: stoplogchan}
+ dbMap[versionedID] = &dbInfo
return
}
@@ -212,9 +219,20 @@
return path.Join(storagePath, relativeDataPath, id, "sqlite3")
}
-func printDBStatsInfo(db *sql.DB, versionedId string) {
- tick := time.Duration(statCollectionInterval * time.Second)
- for _ = range time.Tick(tick) {
- log.Debugf("Current number of open DB connections for ver {%s} is {%d}", versionedId, db.Stats().OpenConnections)
- }
+func logDBInfo(versionedId string, db *sql.DB) chan bool {
+ stop := make(chan bool)
+ go func() {
+ for {
+ select {
+ case <-time.After(time.Duration(statCollectionInterval * time.Second)):
+ log.Debugf("Current number of open DB connections for ver {%s} is {%d}",
+ versionedId, db.Stats().OpenConnections)
+ case <-stop:
+ log.Debugf("Stop DB conn. logging for ver {%s}", versionedId)
+ return
+ }
+ }
+ }()
+ return stop
}
+