• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

uber / cadence / 01894bf6-a954-4eb3-a178-a38598dfe3b0

12 Jul 2023 09:16PM UTC coverage: 57.228% (-0.06%) from 57.284%
01894bf6-a954-4eb3-a178-a38598dfe3b0

push

buildkite

web-flow
[CLI] add domain migration command with domain metadata checker (#5335)

Added a domain migration command. Currently, it checks the domain metadata and long running workflows.

To ensure both domains exist before domain migration happens.
To ensure domain doesn't have long running workflows that migration cannot handle.

How did you test it?
tested locally with docker compose

103 of 103 new or added lines in 3 files covered. (100.0%)

87149 of 152284 relevant lines covered (57.23%)

2494.52 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.33
/common/persistence/sql/sqlplugin/mysql/db.go
1
// Copyright (c) 2017 Uber Technologies, Inc.
2
//
3
// Permission is hereby granted, free of charge, to any person obtaining a copy
4
// of this software and associated documentation files (the "Software"), to deal
5
// in the Software without restriction, including without limitation the rights
6
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
// copies of the Software, and to permit persons to whom the Software is
8
// furnished to do so, subject to the following conditions:
9
//
10
// The above copyright notice and this permission notice shall be included in
11
// all copies or substantial portions of the Software.
12
//
13
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
// THE SOFTWARE.
20

21
package mysql
22

23
import (
24
        "context"
25
        "database/sql"
26
        "time"
27

28
        "github.com/VividCortex/mysqlerr"
29
        "github.com/go-sql-driver/mysql"
30
        "github.com/jmoiron/sqlx"
31

32
        "github.com/uber/cadence/common/persistence/sql/sqldriver"
33
        "github.com/uber/cadence/common/persistence/sql/sqlplugin"
34
)
35

36
type (
37
        db struct {
38
                converter   DataConverter
39
                driver      sqldriver.Driver
40
                originalDBs []*sqlx.DB
41
                numDBShards int
42
        }
43
)
44

45
func (mdb *db) GetTotalNumDBShards() int {
31,219✔
46
        return mdb.numDBShards
31,219✔
47
}
31,219✔
48

49
var _ sqlplugin.AdminDB = (*db)(nil)
50
var _ sqlplugin.DB = (*db)(nil)
51
var _ sqlplugin.Tx = (*db)(nil)
52

53
func (mdb *db) IsDupEntryError(err error) bool {
12✔
54
        sqlErr, ok := err.(*mysql.MySQLError)
12✔
55
        // ErrDupEntry MySQL Error 1062 indicates a duplicate primary key i.e. the row already exists,
12✔
56
        // so we don't do the insert and return a ConditionalUpdate error.
12✔
57
        return ok && sqlErr.Number == mysqlerr.ER_DUP_ENTRY
12✔
58
}
12✔
59

60
func (mdb *db) IsNotFoundError(err error) bool {
854✔
61
        return err == sql.ErrNoRows
854✔
62
}
854✔
63

64
func (mdb *db) IsTimeoutError(err error) bool {
810✔
65
        if err == context.DeadlineExceeded {
810✔
66
                return true
×
67
        }
×
68
        sqlErr, ok := err.(*mysql.MySQLError)
810✔
69
        if ok {
855✔
70
                if sqlErr.Number == mysqlerr.ER_NET_READ_INTERRUPTED ||
45✔
71
                        sqlErr.Number == mysqlerr.ER_NET_WRITE_INTERRUPTED ||
45✔
72
                        sqlErr.Number == mysqlerr.ER_LOCK_WAIT_TIMEOUT ||
45✔
73
                        sqlErr.Number == mysqlerr.ER_XA_RBTIMEOUT ||
45✔
74
                        sqlErr.Number == mysqlerr.ER_QUERY_TIMEOUT ||
45✔
75
                        sqlErr.Number == mysqlerr.ER_LOCKING_SERVICE_TIMEOUT ||
45✔
76
                        sqlErr.Number == mysqlerr.ER_REGEXP_TIME_OUT {
45✔
77
                        return true
×
78
                }
×
79
        }
80
        return false
810✔
81
}
82

83
func (mdb *db) IsThrottlingError(err error) bool {
810✔
84
        sqlErr, ok := err.(*mysql.MySQLError)
810✔
85
        if ok {
855✔
86
                if sqlErr.Number == mysqlerr.ER_CON_COUNT_ERROR ||
45✔
87
                        sqlErr.Number == mysqlerr.ER_TOO_MANY_USER_CONNECTIONS ||
45✔
88
                        sqlErr.Number == mysqlerr.ER_TOO_MANY_CONCURRENT_TRXS ||
45✔
89
                        sqlErr.Number == mysqlerr.ER_CLONE_TOO_MANY_CONCURRENT_CLONES {
45✔
90
                        return true
×
91
                }
×
92
        }
93
        return false
810✔
94
}
95

96
// newDB returns an instance of DB, which is a logical
97
// connection to the underlying mysql database
98
// dbShardID is needed when tx is not nil
99
func newDB(xdbs []*sqlx.DB, tx *sqlx.Tx, dbShardID int, numDBShards int) (*db, error) {
6,343✔
100
        driver, err := sqldriver.NewDriver(xdbs, tx, dbShardID)
6,343✔
101
        if err != nil {
6,343✔
102
                return nil, err
×
103
        }
×
104

105
        db := &db{
6,343✔
106
                converter:   &converter{},
6,343✔
107
                originalDBs: xdbs, // this is kept because newDB will be called again when starting a transaction
6,343✔
108
                driver:      driver,
6,343✔
109
                numDBShards: numDBShards,
6,343✔
110
        }
6,343✔
111

6,343✔
112
        return db, nil
6,343✔
113
}
114

115
// BeginTx starts a new transaction and returns a reference to the Tx object
116
func (mdb *db) BeginTx(ctx context.Context, dbShardID int) (sqlplugin.Tx, error) {
6,262✔
117
        xtx, err := mdb.driver.BeginTxx(ctx, dbShardID, nil)
6,262✔
118
        if err != nil {
6,262✔
119
                return nil, err
×
120
        }
×
121
        return newDB(mdb.originalDBs, xtx, dbShardID, mdb.numDBShards)
6,262✔
122
}
123

124
// Commit commits a previously started transaction
125
func (mdb *db) Commit() error {
6,116✔
126
        return mdb.driver.Commit()
6,116✔
127
}
6,116✔
128

129
// Rollback triggers rollback of a previously started transaction
130
func (mdb *db) Rollback() error {
147✔
131
        return mdb.driver.Rollback()
147✔
132
}
147✔
133

134
// Close closes the connection to the mysql db
135
func (mdb *db) Close() error {
82✔
136
        return mdb.driver.Close()
82✔
137
}
82✔
138

139
// PluginName returns the name of the mysql plugin
140
func (mdb *db) PluginName() string {
1,917✔
141
        return PluginName
1,917✔
142
}
1,917✔
143

144
// SupportsTTL returns weather MySQL supports TTL
145
func (mdb *db) SupportsTTL() bool {
3,773✔
146
        return false
3,773✔
147
}
3,773✔
148

149
// MaxAllowedTTL returns the max allowed ttl MySQL supports
150
func (mdb *db) MaxAllowedTTL() (*time.Duration, error) {
×
151
        return nil, sqlplugin.ErrTTLNotSupported
×
152
}
×
153

154
// SupportsTTL returns weather MySQL supports Asynchronous transaction
155
func (mdb *db) SupportsAsyncTransaction() bool {
1,552✔
156
        return false
1,552✔
157
}
1,552✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc