From 9b191fb598ab9b227180202603b5c3182d562686 Mon Sep 17 00:00:00 2001 From: Quentin Machu Date: Thu, 3 Mar 2016 14:15:06 -0500 Subject: [PATCH] database: Find the FeatureVersion we try to insert before doing any lock This commit is issued in order to limit the bottleneck that the exclusive database lock on Vulnerability_Affects_FeautreVersion introduces, when we inserting FeatureVersions. This slowdowns a bit the FeatureVersion insertion on a mostly empty database but should increase a lot the throughput and parallelism on a populated database. --- database/pgsql/feature.go | 17 +++++++++++++++++ database/pgsql/queries.go | 3 +++ 2 files changed, 20 insertions(+) diff --git a/database/pgsql/feature.go b/database/pgsql/feature.go index 247d5701..a2f2abe8 100644 --- a/database/pgsql/feature.go +++ b/database/pgsql/feature.go @@ -91,6 +91,23 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion) featureVersion.Feature.ID = featureID + // Try to find the FeatureVersion. + // + // In a populated database, the likelihood of the FeatureVersion already being there is high. + // If we can find it here, we then avoid using a transaction and locking the database. + err = pgSQL.QueryRow(searchFeatureVersion, featureID, &featureVersion.Version). + Scan(&featureVersion.ID) + if err != nil && err != sql.ErrNoRows { + return 0, handleError("searchFeatureVersion", err) + } + if err == nil { + if pgSQL.cache != nil { + pgSQL.cache.Add(cacheIndex, featureVersion.ID) + } + + return featureVersion.ID, nil + } + // Begin transaction. tx, err := pgSQL.Begin() if err != nil { diff --git a/database/pgsql/queries.go b/database/pgsql/queries.go index 80c61784..22ca33b8 100644 --- a/database/pgsql/queries.go +++ b/database/pgsql/queries.go @@ -52,6 +52,9 @@ const ( UNION SELECT id FROM new_feature` + searchFeatureVersion = ` + SELECT id FROM FeatureVersion WHERE feature_id = $1 AND version = $2` + soiFeatureVersion = ` WITH new_featureversion AS ( INSERT INTO FeatureVersion(feature_id, version)