github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/workload/ledger/withdrawal.go (about) 1 // Copyright 2018 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package ledger 12 13 import ( 14 "context" 15 gosql "database/sql" 16 "math/rand" 17 18 "github.com/cockroachdb/cockroach-go/crdb" 19 ) 20 21 type withdrawal struct{} 22 23 var _ ledgerTx = withdrawal{} 24 25 func (withdrawal) run(config *ledger, db *gosql.DB, rng *rand.Rand) (interface{}, error) { 26 cID := randInt(rng, 0, config.customers-1) 27 28 err := crdb.ExecuteTx( 29 context.Background(), 30 db, 31 nil, /* txopts */ 32 func(tx *gosql.Tx) error { 33 c, err := getBalance(tx, config, cID, false /* historical */) 34 if err != nil { 35 return err 36 } 37 38 amount := randAmount(rng) 39 c.balance -= amount 40 if c.balance < 0 { 41 c.balance = 0 42 } 43 c.sequence++ 44 45 if err := updateBalance(tx, config, c); err != nil { 46 return err 47 } 48 49 tID, err := insertTransaction(tx, config, rng, c.identifier) 50 if err != nil { 51 return err 52 } 53 54 cIDs := [2]int{ 55 cID, 56 randInt(rng, 0, config.customers-1), 57 } 58 if err := insertEntries(tx, config, rng, cIDs, tID); err != nil { 59 return err 60 } 61 62 return insertSession(tx, config, rng) 63 }) 64 return nil, err 65 }