diff --git a/Dockerfile b/Dockerfile index b52286a..717d62c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the go-tpc binary -FROM golang:1.21 as builder +FROM golang:1.25 as builder WORKDIR /workspace COPY go.mod go.mod diff --git a/tpcc/delivery.go b/tpcc/delivery.go index 968d3cc..43cec4c 100644 --- a/tpcc/delivery.go +++ b/tpcc/delivery.go @@ -90,7 +90,7 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error { return fmt.Errorf("exec %s failed %v", deliveryUpdateOrder, err) } - if rows, err := s.deliveryStmts[deliverySelectOrders].QueryContext(ctx, + orderRows, err := s.deliveryStmts[deliverySelectOrders].QueryContext(ctx, d.wID, 1, orders[0].oID, d.wID, 2, orders[1].oID, d.wID, 3, orders[2].oID, @@ -101,16 +101,20 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error { d.wID, 8, orders[7].oID, d.wID, 9, orders[8].oID, d.wID, 10, orders[9].oID, - ); err != nil { + ) + if err != nil { return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err) - } else { - for rows.Next() { - var dID, cID int - if err = rows.Scan(&dID, &cID); err != nil { - return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err) - } - orders[dID-1].cID = cID + } + defer orderRows.Close() + for orderRows.Next() { + var dID, cID int + if err = orderRows.Scan(&dID, &cID); err != nil { + return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err) } + orders[dID-1].cID = cID + } + if err := orderRows.Err(); err != nil { + return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err) } 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 { return fmt.Errorf("exec %s failed %v", deliveryUpdateOrderLine, err) } - if rows, err := s.deliveryStmts[deliverySelectSumAmount].QueryContext(ctx, + amountRows, err := s.deliveryStmts[deliverySelectSumAmount].QueryContext(ctx, d.wID, 1, orders[0].oID, d.wID, 2, orders[1].oID, d.wID, 3, orders[2].oID, @@ -139,17 +143,21 @@ func (w *Workloader) runDelivery(ctx context.Context, thread int) error { d.wID, 8, orders[7].oID, d.wID, 9, orders[8].oID, d.wID, 10, orders[9].oID, - ); err != nil { + ) + if err != nil { return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err) - } else { - for rows.Next() { - var dID int - var amount float64 - if err = rows.Scan(&dID, &amount); err != nil { - return fmt.Errorf("exec %s failed %v", deliverySelectOrders, err) - } - orders[dID-1].amount = amount + } + defer amountRows.Close() + for amountRows.Next() { + var dID int + var amount float64 + if err = amountRows.Scan(&dID, &amount); err != nil { + return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err) } + orders[dID-1].amount = amount + } + if err := amountRows.Err(); err != nil { + return fmt.Errorf("exec %s failed %v", deliverySelectSumAmount, err) } for i := 0; i < districtPerWarehouse; i++ { diff --git a/tpcc/new_order.go b/tpcc/new_order.go index 51fd8fc..39d7aa0 100644 --- a/tpcc/new_order.go +++ b/tpcc/new_order.go @@ -209,13 +209,14 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error { for i := range items { selectItemArgs[i] = items[i].olIID } - rows, err := s.newOrderStmts[selectItemSQL].QueryContext(ctx, selectItemArgs...) + itemRows, err := s.newOrderStmts[selectItemSQL].QueryContext(ctx, selectItemArgs...) if err != nil { return fmt.Errorf("exec %s failed %v", selectItemSQL, err) } - for rows.Next() { + defer itemRows.Close() + for itemRows.Next() { var tmpItem orderItem - err := rows.Scan(&tmpItem.iPrice, &tmpItem.iName, &tmpItem.iData, &tmpItem.olIID) + err := itemRows.Scan(&tmpItem.iPrice, &tmpItem.iName, &tmpItem.iData, &tmpItem.olIID) if err != nil { return fmt.Errorf("exec %s failed %v", selectItemSQL, err) } @@ -225,6 +226,9 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error { item.iData = tmpItem.iData item.foundInItems = true } + if err := itemRows.Err(); err != nil { + return fmt.Errorf("exec %s failed %v", selectItemSQL, err) + } for i := range items { item := &items[i] if !item.foundInItems { @@ -243,16 +247,17 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error { selectStockArgs[i*2] = d.wID selectStockArgs[i*2+1] = items[i].olIID } - rows, err = s.newOrderStmts[selectStockSQL].QueryContext(ctx, selectStockArgs...) + stockRows, err := s.newOrderStmts[selectStockSQL].QueryContext(ctx, selectStockArgs...) if err != nil { return fmt.Errorf("exec %s failed %v", selectStockSQL, err) } - for rows.Next() { + defer stockRows.Close() + for stockRows.Next() { var iID int var quantity int var data string var dists [10]string - 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]) + 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]) if err != nil { return fmt.Errorf("exec %s failed %v", selectStockSQL, err) } @@ -266,6 +271,9 @@ func (w *Workloader) runNewOrder(ctx context.Context, thread int) error { item.sDist = dists[d.dID-1] item.olAmount = float64(item.olQuantity) * item.iPrice * (1 + d.wTax + d.dTax) * (1 - d.cDiscount) } + if err := stockRows.Err(); err != nil { + return fmt.Errorf("exec %s failed %v", selectStockSQL, err) + } // Process 8 for i := 0; i < d.oOlCnt; i++ { diff --git a/tpcc/order_status.go b/tpcc/order_status.go index 9da5069..d523d40 100644 --- a/tpcc/order_status.go +++ b/tpcc/order_status.go @@ -67,6 +67,7 @@ func (w *Workloader) runOrderStatus(ctx context.Context, thread int) error { } for i := 0; i < nameCnt/2 && rows.Next(); i++ { if err := rows.Scan(&d.cBalance, &d.cFirst, &d.cMiddle, &d.cID); err != nil { + rows.Close() return err } } diff --git a/tpcc/payment.go b/tpcc/payment.go index 1657437..5767ab6 100644 --- a/tpcc/payment.go +++ b/tpcc/payment.go @@ -122,6 +122,7 @@ func (w *Workloader) runPayment(ctx context.Context, thread int) error { if err != nil { return fmt.Errorf("exec %s failed %v", paymentSelectCustomerListByLast, err) } + defer rows.Close() var ids []int for rows.Next() { var id int @@ -130,6 +131,9 @@ func (w *Workloader) runPayment(ctx context.Context, thread int) error { } ids = append(ids, id) } + if err := rows.Err(); err != nil { + return fmt.Errorf("exec %s failed %v", paymentSelectCustomerListByLast, err) + } if len(ids) == 0 { return fmt.Errorf("customer for (%d, %d, %s) not found", d.cWID, d.cDID, d.cLast) }