func()

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
}