in spanner_prober/prober/proberlib.go [720:761]
func (DMLProbe) probe(ctx context.Context, p *Prober) error {
// Random row within the range.
k := rand.Intn(p.numRows)
payload, payloadHash, err := p.generatePayload(p.payloadSize)
if err != nil {
return err
}
_, err = p.spannerClient.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
readStmt := spanner.Statement{
SQL: `select t.Id, t.Payload, t.PayloadHash from ProbeTarget t where t.Id = @Id`,
Params: map[string]interface{}{
"Id": k,
},
}
iter := txn.Query(ctx, readStmt)
defer iter.Stop()
rows, err := validateRows(iter)
if err != nil {
return err
}
// Update the row with a new random value if the row already exisis, otherwise insert a new row.
dmlSQL := `update ProbeTarget t set t.Payload = @payload, t.PayloadHash = @payloadHash where t.Id = @Id`
if rows == 0 {
dmlSQL = `insert ProbeTarget (Id, Payload, PayloadHash) VALUES(@Id, @payload, @payloadHash)`
}
dmlStmt := spanner.Statement{
SQL: dmlSQL,
Params: map[string]interface{}{
"Id": k,
"payload": payload,
"payloadHash": payloadHash,
},
}
_, err = txn.Update(ctx, dmlStmt)
return err
})
return err
}