Skip to content

Commit a9ca481

Browse files
authored
tpcc: Handle Rows.Err after Rows.Next (#201)
Signed-off-by: Ping Yu <yuping@pingcap.com>
1 parent 82539b1 commit a9ca481

File tree

5 files changed

+47
-26
lines changed

5 files changed

+47
-26
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build the go-tpc binary
2-
FROM golang:1.21 as builder
2+
FROM golang:1.25 as builder
33

44
WORKDIR /workspace
55
COPY go.mod go.mod

tpcc/delivery.go

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error {
9090
return fmt.Errorf("exec %s failed %v", deliveryUpdateOrder, err)
9191
}
9292

93-
if rows, err := s.deliveryStmts[deliverySelectOrders].QueryContext(ctx,
93+
orderRows, err := s.deliveryStmts[deliverySelectOrders].QueryContext(ctx,
9494
d.wID, 1, orders[0].oID,
9595
d.wID, 2, orders[1].oID,
9696
d.wID, 3, orders[2].oID,
@@ -101,16 +101,20 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error {
101101
d.wID, 8, orders[7].oID,
102102
d.wID, 9, orders[8].oID,
103103
d.wID, 10, orders[9].oID,
104-
); err != nil {
104+
)
105+
if err != nil {
105106
return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err)
106-
} else {
107-
for rows.Next() {
108-
var dID, cID int
109-
if err = rows.Scan(&dID, &cID); err != nil {
110-
return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err)
111-
}
112-
orders[dID-1].cID = cID
107+
}
108+
defer orderRows.Close()
109+
for orderRows.Next() {
110+
var dID, cID int
111+
if err = orderRows.Scan(&dID, &cID); err != nil {
112+
return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err)
113113
}
114+
orders[dID-1].cID = cID
115+
}
116+
if err := orderRows.Err(); err != nil {
117+
return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err)
114118
}
115119

116120
if _, err = s.deliveryStmts[deliveryUpdateOrderLine].ExecContext(ctx, time.Now().Format(timeFormat),
@@ -128,7 +132,7 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error {
128132
return fmt.Errorf("exec %s failed %v", deliveryUpdateOrderLine, err)
129133
}
130134

131-
if rows, err := s.deliveryStmts[deliverySelectSumAmount].QueryContext(ctx,
135+
amountRows, err := s.deliveryStmts[deliverySelectSumAmount].QueryContext(ctx,
132136
d.wID, 1, orders[0].oID,
133137
d.wID, 2, orders[1].oID,
134138
d.wID, 3, orders[2].oID,
@@ -139,17 +143,21 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error {
139143
d.wID, 8, orders[7].oID,
140144
d.wID, 9, orders[8].oID,
141145
d.wID, 10, orders[9].oID,
142-
); err != nil {
146+
)
147+
if err != nil {
143148
return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err)
144-
} else {
145-
for rows.Next() {
146-
var dID int
147-
var amount float64
148-
if err = rows.Scan(&dID, &amount); err != nil {
149-
return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err)
150-
}
151-
orders[dID-1].amount = amount
149+
}
150+
defer amountRows.Close()
151+
for amountRows.Next() {
152+
var dID int
153+
var amount float64
154+
if err = amountRows.Scan(&dID, &amount); err != nil {
155+
return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err)
152156
}
157+
orders[dID-1].amount = amount
158+
}
159+
if err := amountRows.Err(); err != nil {
160+
return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err)
153161
}
154162

155163
for i := 0; i < districtPerWarehouse; i++ {

tpcc/new_order.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,14 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error {
209209
for i := range items {
210210
selectItemArgs[i] = items[i].olIID
211211
}
212-
rows, err := s.newOrderStmts[selectItemSQL].QueryContext(ctx, selectItemArgs...)
212+
itemRows, err := s.newOrderStmts[selectItemSQL].QueryContext(ctx, selectItemArgs...)
213213
if err != nil {
214214
return fmt.Errorf("exec %s failed %v", selectItemSQL, err)
215215
}
216-
for rows.Next() {
216+
defer itemRows.Close()
217+
for itemRows.Next() {
217218
var tmpItem orderItem
218-
err := rows.Scan(&tmpItem.iPrice, &tmpItem.iName, &tmpItem.iData, &tmpItem.olIID)
219+
err := itemRows.Scan(&tmpItem.iPrice, &tmpItem.iName, &tmpItem.iData, &tmpItem.olIID)
219220
if err != nil {
220221
return fmt.Errorf("exec %s failed %v", selectItemSQL, err)
221222
}
@@ -225,6 +226,9 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error {
225226
item.iData = tmpItem.iData
226227
item.foundInItems = true
227228
}
229+
if err := itemRows.Err(); err != nil {
230+
return fmt.Errorf("exec %s failed %v", selectItemSQL, err)
231+
}
228232
for i := range items {
229233
item := &items[i]
230234
if !item.foundInItems {
@@ -243,16 +247,17 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error {
243247
selectStockArgs[i*2] = d.wID
244248
selectStockArgs[i*2+1] = items[i].olIID
245249
}
246-
rows, err = s.newOrderStmts[selectStockSQL].QueryContext(ctx, selectStockArgs...)
250+
stockRows, err := s.newOrderStmts[selectStockSQL].QueryContext(ctx, selectStockArgs...)
247251
if err != nil {
248252
return fmt.Errorf("exec %s failed %v", selectStockSQL, err)
249253
}
250-
for rows.Next() {
254+
defer stockRows.Close()
255+
for stockRows.Next() {
251256
var iID int
252257
var quantity int
253258
var data string
254259
var dists [10]string
255-
err = rows.Scan(&iID, &quantity, &data, &dists[0], &dists[1], &dists[2], &dists[3], &dists[4], &dists[5], &dists[6], &dists[7], &dists[8], &dists[9])
260+
err = stockRows.Scan(&iID, &quantity, &data, &dists[0], &dists[1], &dists[2], &dists[3], &dists[4], &dists[5], &dists[6], &dists[7], &dists[8], &dists[9])
256261
if err != nil {
257262
return fmt.Errorf("exec %s failed %v", selectStockSQL, err)
258263
}
@@ -266,6 +271,9 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error {
266271
item.sDist = dists[d.dID-1]
267272
item.olAmount = float64(item.olQuantity) * item.iPrice * (1 + d.wTax + d.dTax) * (1 - d.cDiscount)
268273
}
274+
if err := stockRows.Err(); err != nil {
275+
return fmt.Errorf("exec %s failed %v", selectStockSQL, err)
276+
}
269277

270278
// Process 8
271279
for i := 0; i < d.oOlCnt; i++ {

tpcc/order_status.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func (w *Workloader) runOrderStatus(ctx context.Context, thread int) error {
6767
}
6868
for i := 0; i < nameCnt/2 && rows.Next(); i++ {
6969
if err := rows.Scan(&d.cBalance, &d.cFirst, &d.cMiddle, &d.cID); err != nil {
70+
rows.Close()
7071
return err
7172
}
7273
}

tpcc/payment.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ func (w *Workloader) runPayment(ctx context.Context, thread int) error {
122122
if err != nil {
123123
return fmt.Errorf("exec %s failed %v", paymentSelectCustomerListByLast, err)
124124
}
125+
defer rows.Close()
125126
var ids []int
126127
for rows.Next() {
127128
var id int
@@ -130,6 +131,9 @@ func (w *Workloader) runPayment(ctx context.Context, thread int) error {
130131
}
131132
ids = append(ids, id)
132133
}
134+
if err := rows.Err(); err != nil {
135+
return fmt.Errorf("exec %s failed %v", paymentSelectCustomerListByLast, err)
136+
}
133137
if len(ids) == 0 {
134138
return fmt.Errorf("customer for (%d, %d, %s) not found", d.cWID, d.cDID, d.cLast)
135139
}

0 commit comments

Comments
 (0)