Skip to content

Commit 4c4aea5

Browse files
geofffranksameowlia
authored andcommitted
Add indices for mysql8 + postgres to optimize ASG lookups
1 parent c5720cf commit 4c4aea5

File tree

11 files changed

+144
-23
lines changed

11 files changed

+144
-23
lines changed

src/code.cloudfoundry.org/policy-server/integration/migrate_db_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package integration_test
33
import (
44
"fmt"
55
"math"
6+
"strings"
67
"time"
78

89
"code.cloudfoundry.org/cf-networking-helpers/db"
@@ -96,6 +97,22 @@ func assertMigrationsSucceeded(conn *db.ConnWrapper, conf config.Config) {
9697
len(migrations.V3ModifiedMigrationsToPerform) +
9798
len(migrations.MigrationsToPerform)
9899

100+
var skippedMigrations int
101+
for _, migration := range migrations.MigrationsToPerform {
102+
if migration.SkipMySQL57 {
103+
skippedMigrations++
104+
}
105+
}
106+
107+
if conn.DriverName() == "mysql" {
108+
var version string
109+
err := conn.QueryRow("SELECT VERSION()").Scan(&version)
110+
Expect(err).ToNot(HaveOccurred())
111+
if strings.HasPrefix(version, "5.7.") {
112+
numMigrations = numMigrations - skippedMigrations
113+
}
114+
}
115+
99116
var migrationCount int
100117
conn.QueryRow("SELECT COUNT(*) FROM gorp_migrations").Scan(&migrationCount)
101118
Expect(migrationCount).To(Equal(numMigrations))

src/code.cloudfoundry.org/policy-server/store/migrations/fakes/migrations_provider.go

+15-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/code.cloudfoundry.org/policy-server/store/migrations/migrations.go

+18
Original file line numberDiff line numberDiff line change
@@ -432,4 +432,22 @@ var MigrationsToPerform = PolicyServerMigrations{
432432
Id: "81",
433433
Up: migration_v0081,
434434
},
435+
PolicyServerMigration{
436+
Id: "82",
437+
Up: migration_v0082,
438+
SkipMySQL57: true,
439+
},
440+
PolicyServerMigration{
441+
Id: "83",
442+
Up: migration_v0083,
443+
SkipMySQL57: true,
444+
},
445+
PolicyServerMigration{
446+
Id: "84",
447+
Up: migration_v0084,
448+
},
449+
PolicyServerMigration{
450+
Id: "85",
451+
Up: migration_v0085,
452+
},
435453
}

src/code.cloudfoundry.org/policy-server/store/migrations/migrations_provider.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type MigrationsProvider struct {
1313
Store migrationStore
1414
}
1515

16-
func (m *MigrationsProvider) MigrationsToPerform() (PolicyServerMigrations, error) {
16+
func (m *MigrationsProvider) MigrationsToPerform(mysql57 bool) (PolicyServerMigrations, error) {
1717
policyServerMigrations := PolicyServerMigrations{}
1818

1919
hasV1, err := m.Store.HasV1MigrationOccurred()
@@ -67,10 +67,12 @@ func (m *MigrationsProvider) MigrationsToPerform() (PolicyServerMigrations, erro
6767
)
6868
}
6969

70-
policyServerMigrations = append(
71-
policyServerMigrations,
72-
MigrationsToPerform...,
73-
)
70+
for _, migration := range MigrationsToPerform {
71+
if mysql57 && migration.SkipMySQL57 {
72+
continue
73+
}
74+
policyServerMigrations = append(policyServerMigrations, migration)
75+
}
7476

7577
return policyServerMigrations, nil
7678
}

src/code.cloudfoundry.org/policy-server/store/migrations/migrations_provider_test.go

+26-7
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ var _ = Describe("Migrations Provider", func() {
2525
})
2626

2727
It("returns a list of migrations to perform", func() {
28-
migrationsToPerform, err := migrationsProvider.MigrationsToPerform()
28+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
2929
Expect(err).ToNot(HaveOccurred())
3030
expectedMigrations := migrations.PolicyServerMigrations{
3131
migrations.V1ModifiedMigrationsToPerform[0],
@@ -47,32 +47,51 @@ var _ = Describe("Migrations Provider", func() {
4747

4848
It("returns a helpful error message for V1MigrationOccurred errors", func() {
4949
migrationStore.HasV1MigrationOccurredReturns(false, errors.New("I AM ERROR"))
50-
_, err := migrationsProvider.MigrationsToPerform()
50+
_, err := migrationsProvider.MigrationsToPerform(false)
5151

5252
Expect(err).To(MatchError("failed to check V1 Migration status: I AM ERROR"))
5353
})
5454

5555
It("returns a helpful error message for V2MigrationOccurred errors", func() {
5656
migrationStore.HasV2MigrationOccurredReturns(false, errors.New("I AM ERROR"))
57-
_, err := migrationsProvider.MigrationsToPerform()
57+
_, err := migrationsProvider.MigrationsToPerform(false)
5858

5959
Expect(err).To(MatchError("failed to check V2 Migration status: I AM ERROR"))
6060
})
6161

6262
It("returns a helpful error message for V3MigrationOccurred errors", func() {
6363
migrationStore.HasV3MigrationOccurredReturns(false, errors.New("I AM ERROR"))
64-
_, err := migrationsProvider.MigrationsToPerform()
64+
_, err := migrationsProvider.MigrationsToPerform(false)
6565

6666
Expect(err).To(MatchError("failed to check V3 Migration status: I AM ERROR"))
6767
})
6868

69+
Context("when a migration is set to skip on mysql 5.7", func() {
70+
Context("and the database is not mysql 5.7", func() {
71+
It("lists the migration", func() {
72+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
73+
Expect(err).ToNot(HaveOccurred())
74+
Expect(migrationsToPerform).To(ContainElement(migrations.MigrationsToPerform[78]))
75+
Expect(migrationsToPerform).To(ContainElement(migrations.MigrationsToPerform[79]))
76+
})
77+
})
78+
Context("and the database is mysql 5.7", func() {
79+
It("doesn't list the migration", func() {
80+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(true)
81+
Expect(err).ToNot(HaveOccurred())
82+
Expect(migrationsToPerform).ToNot(ContainElement(migrations.MigrationsToPerform[78]))
83+
Expect(migrationsToPerform).ToNot(ContainElement(migrations.MigrationsToPerform[79]))
84+
})
85+
})
86+
})
87+
6988
Context("when legacy v1 migration has already occurred", func() {
7089
BeforeEach(func() {
7190
migrationStore.HasV1MigrationOccurredReturns(true, nil)
7291
})
7392

7493
It("returns a legacy v1 migration in the list of migrations to perform", func() {
75-
migrationsToPerform, err := migrationsProvider.MigrationsToPerform()
94+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
7695
Expect(err).ToNot(HaveOccurred())
7796
expectedMigrations := migrations.PolicyServerMigrations{
7897
migrations.V1LegacyMigrationsToPerform[0],
@@ -99,7 +118,7 @@ var _ = Describe("Migrations Provider", func() {
99118
})
100119

101120
It("returns a legacy v2 migration in the list of migrations to perform", func() {
102-
migrationsToPerform, err := migrationsProvider.MigrationsToPerform()
121+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
103122
Expect(err).ToNot(HaveOccurred())
104123
expectedMigrations := migrations.PolicyServerMigrations{
105124
migrations.V2LegacyMigrationsToPerform[0],
@@ -123,7 +142,7 @@ var _ = Describe("Migrations Provider", func() {
123142
})
124143

125144
It("returns a legacy v3 migration in the list of migrations to perform", func() {
126-
migrationsToPerform, err := migrationsProvider.MigrationsToPerform()
145+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
127146
Expect(err).ToNot(HaveOccurred())
128147
expectedMigrations := migrations.PolicyServerMigrations{
129148
migrations.V3LegacyMigrationsToPerform[0],

src/code.cloudfoundry.org/policy-server/store/migrations/migrator.go

+28-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package migrations
33
import (
44
"database/sql"
55
"fmt"
6+
"strings"
67

78
migrate "github.com/cf-container-networking/sql-migrate"
89
"github.com/jmoiron/sqlx"
910
)
1011

12+
//go:generate counterfeiter -generate
13+
1114
//counterfeiter:generate -o fakes/migrate_adapter.go --fake-name MigrateAdapter . migrateAdapter
1215
type migrateAdapter interface {
1316
ExecMax(db MigrationDb, dialect string, m migrate.MigrationSource, dir migrate.MigrationDirection, maxNumMigrations int) (int, error)
@@ -24,7 +27,7 @@ type MigrationDb interface {
2427

2528
//counterfeiter:generate -o fakes/migrations_provider.go --fake-name MigrationsProvider . migrationsProvider
2629
type migrationsProvider interface {
27-
MigrationsToPerform() (PolicyServerMigrations, error)
30+
MigrationsToPerform(bool) (PolicyServerMigrations, error)
2831
}
2932

3033
type Migrator struct {
@@ -33,7 +36,27 @@ type Migrator struct {
3336
}
3437

3538
func (m *Migrator) PerformMigrations(driverName string, migrationDb MigrationDb, maxNumMigrations int) (int, error) {
36-
migrationsToPerform, err := m.MigrationsProvider.MigrationsToPerform()
39+
var mysql57 bool
40+
if driverName == "mysql" {
41+
row := migrationDb.QueryRow("SELECT VERSION()")
42+
// if no rows are returned, we're definitely not mysql 5.7, so short circuit out
43+
if row != nil {
44+
var version string
45+
err := row.Scan(&version)
46+
if err != nil {
47+
return 0, fmt.Errorf("Unable to detect MySQL Version: %s", err)
48+
}
49+
// mysql returns major.minor.patch version number strings
50+
// e.g. `5.7.43` would be the data returned for the VERSION() query
51+
mysql57 = strings.HasPrefix(version, "5.7.")
52+
}
53+
}
54+
// at this point, the mysql57 bool is false if postgres, false if no rows were returned
55+
// for SELECT VERSION(), false if the prefix doesn't start with `5.7.` (in case there's ever a 5.70)
56+
// and true if 5.7.x. the above should only have thrown an error if there was a problem talking
57+
// to the database to execute the query, or the row couldn't be marshalled into a string variable
58+
59+
migrationsToPerform, err := m.MigrationsProvider.MigrationsToPerform(mysql57)
3760
if err != nil {
3861
return 0, fmt.Errorf("error retrieving migrations to perform: %s", err)
3962
}
@@ -79,8 +102,9 @@ func (s PolicyServerMigrations) supportsDriver(driverName string) bool {
79102
}
80103

81104
type PolicyServerMigration struct {
82-
Id string
83-
Up map[string][]string
105+
Id string
106+
SkipMySQL57 bool
107+
Up map[string][]string
84108
}
85109

86110
func (psm *PolicyServerMigration) forDriver(driverName string) *migrate.Migration {

src/code.cloudfoundry.org/policy-server/store/migrations/migrator_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2237,7 +2237,7 @@ func queryTableColumnNames(tableName string, realDb *db.ConnWrapper) []string {
22372237
}
22382238

22392239
func getMigrationIndex(migrationsProvider *migrations.MigrationsProvider, migrationId string) int {
2240-
migrationsToPerform, err := migrationsProvider.MigrationsToPerform()
2240+
migrationsToPerform, err := migrationsProvider.MigrationsToPerform(false)
22412241
Expect(err).NotTo(HaveOccurred())
22422242
for i, migration := range migrationsToPerform {
22432243
if migration.Id == migrationId {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package migrations
2+
3+
var migration_v0082 = map[string][]string{
4+
"mysql": {
5+
`CREATE INDEX staging_spaces_idx ON security_groups ((CAST(staging_spaces -> '$[*]' AS CHAR(36) ARRAY)))`,
6+
},
7+
"postgres": {},
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package migrations
2+
3+
var migration_v0083 = map[string][]string{
4+
"mysql": {
5+
`CREATE INDEX running_spaces_idx ON security_groups ((CAST(running_spaces -> '$[*]' AS CHAR(36) ARRAY)))`,
6+
},
7+
"postgres": {},
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package migrations
2+
3+
var migration_v0084 = map[string][]string{
4+
"mysql": {
5+
`CREATE INDEX global_staging_idx ON security_groups (staging_default)`,
6+
},
7+
"postgres": {},
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package migrations
2+
3+
var migration_v0085 = map[string][]string{
4+
"mysql": {
5+
`CREATE INDEX global_running_idx ON security_groups (running_default)`,
6+
},
7+
"postgres": {},
8+
}

0 commit comments

Comments
 (0)