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

uber / cadence / 018d9fa8-75f8-405b-9b1e-38f93e6b0a11

12 Feb 2024 11:30PM UTC coverage: 62.748% (+0.05%) from 62.701%
018d9fa8-75f8-405b-9b1e-38f93e6b0a11

Pull #5657

buildkite

Shaddoll
Implement SignalWithStartWorkflowExecutionAsync API
Pull Request #5657: Implement SignalWithStartWorkflowExecutionAsync API

96 of 142 new or added lines in 5 files covered. (67.61%)

60 existing lines in 8 files now uncovered.

92596 of 147569 relevant lines covered (62.75%)

2318.9 hits per line

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

85.0
/common/persistence/sql/sqlplugin/postgres/db.go
1
// Copyright (c) 2019 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 postgres
22

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

28
        "github.com/jmoiron/sqlx"
29
        "github.com/lib/pq"
30

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

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

44
func (pdb *db) GetTotalNumDBShards() int {
31,485✔
45
        return pdb.numDBShards
31,485✔
46
}
31,485✔
47

48
var _ sqlplugin.DB = (*db)(nil)
49
var _ sqlplugin.Tx = (*db)(nil)
50

51
// ErrDupEntry indicates a duplicate primary key i.e. the row already exists,
52
// check http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html
53
const ErrDupEntry = "23505"
54

55
const ErrInsufficientResources = "53000"
56
const ErrTooManyConnections = "53300"
57

58
func (pdb *db) IsDupEntryError(err error) bool {
11✔
59
        sqlErr, ok := err.(*pq.Error)
11✔
60
        return ok && sqlErr.Code == ErrDupEntry
11✔
61
}
11✔
62

63
func (pdb *db) IsNotFoundError(err error) bool {
322✔
64
        return err == sql.ErrNoRows
322✔
65
}
322✔
66

67
func (pdb *db) IsTimeoutError(err error) bool {
155✔
68
        return err == context.DeadlineExceeded
155✔
69
}
155✔
70

71
func (pdb *db) IsThrottlingError(err error) bool {
155✔
72
        sqlErr, ok := err.(*pq.Error)
155✔
73
        if ok {
206✔
74
                if sqlErr.Code == ErrTooManyConnections ||
51✔
75
                        sqlErr.Code == ErrInsufficientResources {
51✔
76
                        return true
×
77
                }
×
78
        }
79
        return false
155✔
80
}
81

82
// newDB returns an instance of DB, which is a logical
83
// connection to the underlying postgres database
84
// dbShardID is needed when tx is not nil
85
func newDB(xdbs []*sqlx.DB, tx *sqlx.Tx, dbShardID int, numDBShards int) (*db, error) {
5,564✔
86
        driver, err := sqldriver.NewDriver(xdbs, tx, dbShardID)
5,564✔
87
        if err != nil {
5,564✔
88
                return nil, err
×
89
        }
×
90

91
        db := &db{
5,564✔
92
                converter:   &converter{},
5,564✔
93
                originalDBs: xdbs, // this is kept because newDB will be called again when starting a transaction
5,564✔
94
                driver:      driver,
5,564✔
95
                numDBShards: numDBShards,
5,564✔
96
        }
5,564✔
97
        return db, nil
5,564✔
98
}
99

100
// BeginTx starts a new transaction and returns a reference to the Tx object
101
func (pdb *db) BeginTx(ctx context.Context, dbShardID int) (sqlplugin.Tx, error) {
5,471✔
102
        xtx, err := pdb.driver.BeginTxx(ctx, dbShardID, nil)
5,471✔
103
        if err != nil {
5,471✔
UNCOV
104
                return nil, err
×
UNCOV
105
        }
×
106
        return newDB(pdb.originalDBs, xtx, dbShardID, pdb.numDBShards)
5,471✔
107
}
108

109
// Commit commits a previously started transaction
110
func (pdb *db) Commit() error {
5,367✔
111
        return pdb.driver.Commit()
5,367✔
112
}
5,367✔
113

114
// Rollback triggers rollback of a previously started transaction
115
func (pdb *db) Rollback() error {
105✔
116
        return pdb.driver.Rollback()
105✔
117
}
105✔
118

119
// Close closes the connection to the mysql db
120
func (pdb *db) Close() error {
94✔
121
        return pdb.driver.Close()
94✔
122
}
94✔
123

124
// PluginName returns the name of the mysql plugin
125
func (pdb *db) PluginName() string {
1,908✔
126
        return PluginName
1,908✔
127
}
1,908✔
128

129
// SupportsTTL returns weather Postgres supports TTL
130
func (pdb *db) SupportsTTL() bool {
3,132✔
131
        return false
3,132✔
132
}
3,132✔
133

134
// MaxAllowedTTL returns the max allowed ttl Postgres supports
135
func (pdb *db) MaxAllowedTTL() (*time.Duration, error) {
×
136
        return nil, sqlplugin.ErrTTLNotSupported
×
137
}
×
138

139
// SupportsTTL returns weather Postgre supports Asynchronous transaction
140
func (pdb *db) SupportsAsyncTransaction() bool {
1,537✔
141
        return false
1,537✔
142
}
1,537✔
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

© 2025 Coveralls, Inc