Skip to content

Commit 499afa5

Browse files
deleted legacy copy of Handle function for presetIDStrategy
1 parent 0f161eb commit 499afa5

6 files changed

Lines changed: 7 additions & 429 deletions

File tree

io/insert/record_numeric.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,7 @@ func (n *numericSequencer) transientDMLBuilder(sess *session, record interface{}
9999
values := make([]interface{}, len(sess.columns))
100100
copy(values, batchRecordBuffer[0:len(sess.columns)-1]) // don't copy ID pointer (last position in slice)
101101

102-
maxIdValue, err := sequence.ComputeNextForTransient(recordCount)
103-
if err != nil {
104-
return nil, 0, err
105-
}
106-
107-
values[len(sess.columns)-1] = &maxIdValue
102+
values[len(sess.columns)-1] = nil // set ID to nil for autoincrement
108103
resetAutoincrementSQL := &sqlx.SQL{
109104
Query: resetAutoincrementQuery,
110105
Args: values,

metadata/product/mysql/sequence/transient.go

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -22,93 +22,6 @@ const minSequenceArgs = 3
2222
// using insert inside new transaction finished by rollback
2323
type Transient struct{}
2424

25-
// Handle sets new autoincrement value by inserting row using new transaction finished by rollback, uses locking
26-
func (n *Transient) HandleLegacy(ctx context.Context, db *sql.DB, target interface{}, iopts ...interface{}) (doNext bool, err error) {
27-
meta := metadata.New()
28-
options := option.AsOptions(iopts)
29-
30-
argsOps := options.Args()
31-
if argsOps == nil {
32-
return false, fmt.Errorf("argsOps was empty")
33-
}
34-
35-
targetSequence, ok := target.(*sink.Sequence)
36-
if !ok {
37-
return false, fmt.Errorf("invalid target, expected :%T, but had: %T", targetSequence, target)
38-
}
39-
40-
tx, err := db.BeginTx(ctx, nil)
41-
if err != nil {
42-
return false, err
43-
}
44-
defer io.RunWithError(tx.Rollback, &err)
45-
46-
lockingOptions := option.Options{argsOps, tx}
47-
product := option.Options.Product(options)
48-
if product != nil {
49-
lockingOptions = append(lockingOptions, product)
50-
}
51-
52-
if err = n.lock(ctx, meta, db, lockingOptions); err != nil {
53-
return false, err
54-
}
55-
fn := func() error { return n.unlock(ctx, meta, db, lockingOptions) }
56-
defer io.RunWithError(fn, &err)
57-
58-
sequence := sink.Sequence{}
59-
arguments := argsOps.Unwrap()
60-
if len(arguments) < 3 {
61-
return false, fmt.Errorf("unable to get sequence's metadata due to: len(arguments) < 3")
62-
}
63-
64-
sequence.Catalog = arguments[0].(string)
65-
sequence.Schema = arguments[1].(string)
66-
sequence.Name = arguments[2].(string)
67-
68-
sequenceSQLBuilder := options.SequenceSQLBuilder()
69-
if sequenceSQLBuilder == nil {
70-
return false, fmt.Errorf("SequenceSQLBuilder was empty")
71-
}
72-
73-
retryMaxCnt := 5
74-
75-
for i := 1; i <= retryMaxCnt; i++ {
76-
err = updateSequence(ctx, db, &sequence, tx)
77-
if err != nil {
78-
return false, err
79-
}
80-
81-
transientDML, _, err := sequenceSQLBuilder(&sequence)
82-
if err != nil {
83-
return false, err
84-
}
85-
if transientDML == nil {
86-
return false, fmt.Errorf("transientDML was empty")
87-
}
88-
89-
_ = n.turnFkKeyCheck(tx, 0)
90-
_, err = tx.ExecContext(ctx, transientDML.Query, transientDML.Args...)
91-
_ = n.turnFkKeyCheck(tx, 1)
92-
93-
if err != nil && i < retryMaxCnt {
94-
continue
95-
}
96-
97-
if err != nil { //temp workaround of cascading sequencer
98-
err = fmt.Errorf("unable to get sequence values (attempt %d) using transient dml %v due to: %w", i, transientDML, err)
99-
}
100-
101-
break
102-
}
103-
104-
if err != nil {
105-
return false, err
106-
}
107-
108-
*targetSequence = sequence
109-
return false, nil
110-
}
111-
11225
func (n *Transient) turnFkKeyCheck(tx *sql.Tx, flag int) error {
11326
_, err := tx.Exec("SET foreign_key_checks = " + strconv.Itoa(flag))
11427
return err

metadata/product/mysql/sequence/transient_benchmark_parallel_test.go

Lines changed: 0 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -179,163 +179,3 @@ func BenchmarkTransientHandleMultiParallel(b *testing.B) {
179179
}
180180
})
181181
}
182-
183-
// Parallel comparison: Handle vs HandleLegacy
184-
func BenchmarkTransientHandleVsLegacyParallel(b *testing.B) {
185-
dsn := os.Getenv("MYSQL_BENCH_DSN")
186-
if dsn == "" {
187-
b.Skip("set MYSQL_BENCH_DSN to run this benchmark")
188-
}
189-
schema := os.Getenv("MYSQL_BENCH_SCHEMA")
190-
if schema == "" {
191-
b.Skip("set MYSQL_BENCH_SCHEMA to run this benchmark")
192-
}
193-
194-
catalog := ""
195-
table := "t_seq_bench_par_cmp"
196-
idCol := "id"
197-
198-
records := int64(1)
199-
if v := os.Getenv("MYSQL_BENCH_RECORDS"); v != "" {
200-
if n, err := strconv.ParseInt(v, 10, 64); err == nil && n > 0 {
201-
records = n
202-
}
203-
}
204-
205-
db, err := sql.Open("mysql", dsn)
206-
if err != nil {
207-
b.Fatalf("open dsn: %v", err)
208-
}
209-
defer db.Close()
210-
if err := db.Ping(); err != nil {
211-
b.Fatalf("ping: %v", err)
212-
}
213-
214-
if _, err := db.Exec("DROP TABLE IF EXISTS `" + schema + "`.`" + table + "`"); err != nil {
215-
b.Fatalf("drop table: %v", err)
216-
}
217-
if _, err := db.Exec("CREATE TABLE `" + schema + "`.`" + table + "` ( `" + idCol + "` BIGINT AUTO_INCREMENT PRIMARY KEY, `foo_name` TEXT )"); err != nil {
218-
b.Fatalf("create table: %v", err)
219-
}
220-
b.Cleanup(func() {
221-
_, _ = db.Exec("DROP TABLE IF EXISTS `" + schema + "`.`" + table + "`")
222-
})
223-
224-
builder := func(seq *sink.Sequence) (*sqlx.SQL, int64, error) {
225-
inc := seq.IncrementBy
226-
if inc == 0 {
227-
inc = 1
228-
}
229-
target := seq.Value
230-
if records > 1 {
231-
target = seq.Value + (records-1)*inc
232-
}
233-
var idArg int64 = target
234-
var name = fmt.Sprintf("%d", idArg)
235-
sql := &sqlx.SQL{
236-
Query: "INSERT INTO `" + schema + "`.`" + table + "` (foo_name,`" + idCol + "`) VALUES (?,?)",
237-
Args: []interface{}{&name, &idArg},
238-
}
239-
return sql, records, nil
240-
}
241-
242-
args := option.NewArgs(catalog, schema, table)
243-
opts := []option.Option{
244-
dialect.PresetIDWithTransientTransaction,
245-
option.RecordCount(records),
246-
args,
247-
builder,
248-
mysqlprod.MySQL5(),
249-
}
250-
251-
ctx := context.Background()
252-
h := &seqpkg.Transient{}
253-
254-
b.Run("HandleParallel", func(b *testing.B) {
255-
b.ReportAllocs()
256-
b.ResetTimer()
257-
b.RunParallel(func(pb *testing.PB) {
258-
for pb.Next() {
259-
var seq sink.Sequence
260-
if _, err := h.Handle(ctx, db, &seq, option.Options(opts).Interfaces()...); err != nil {
261-
b.Fatalf("Handle failed: %v", err)
262-
}
263-
}
264-
})
265-
})
266-
267-
b.Run("HandleLegacyParallel", func(b *testing.B) {
268-
b.ReportAllocs()
269-
b.ResetTimer()
270-
b.RunParallel(func(pb *testing.PB) {
271-
for pb.Next() {
272-
var seq sink.Sequence
273-
if _, err := h.HandleLegacy(ctx, db, &seq, option.Options(opts).Interfaces()...); err != nil {
274-
b.Fatalf("HandleLegacy failed: %v", err)
275-
}
276-
}
277-
})
278-
})
279-
280-
/////////
281-
// Default to 10 record; override with env if needed
282-
recordsN := int64(10)
283-
if v := os.Getenv("MYSQL_BENCH_RECORDS_N"); v != "" {
284-
if n, err := strconv.ParseInt(v, 10, 64); err == nil && n > 0 {
285-
recordsN = n
286-
}
287-
}
288-
289-
builderN := func(seq *sink.Sequence) (*sqlx.SQL, int64, error) {
290-
inc := seq.IncrementBy
291-
if inc == 0 {
292-
inc = 1
293-
}
294-
target := seq.Value
295-
if records > 1 {
296-
target = seq.Value + (records-1)*inc
297-
}
298-
var idArg int64 = target
299-
var name = fmt.Sprintf("%d", idArg)
300-
sql := &sqlx.SQL{
301-
Query: "INSERT INTO `" + schema + "`.`" + table + "` (foo_name,`" + idCol + "`) VALUES (?,?)",
302-
Args: []interface{}{&name, &idArg},
303-
}
304-
return sql, records, nil
305-
}
306-
307-
optsN := []option.Option{
308-
dialect.PresetIDWithTransientTransaction,
309-
option.RecordCount(recordsN),
310-
args,
311-
builderN,
312-
mysqlprod.MySQL5(),
313-
}
314-
315-
b.Run("HandleParallel N-rec", func(b *testing.B) {
316-
b.ReportAllocs()
317-
b.ResetTimer()
318-
b.RunParallel(func(pb *testing.PB) {
319-
for pb.Next() {
320-
var seq sink.Sequence
321-
if _, err := h.Handle(ctx, db, &seq, option.Options(optsN).Interfaces()...); err != nil {
322-
b.Fatalf("Handle failed: %v", err)
323-
}
324-
}
325-
})
326-
})
327-
328-
b.Run("HandleLegacyParallel N-rec", func(b *testing.B) {
329-
b.ReportAllocs()
330-
b.ResetTimer()
331-
b.RunParallel(func(pb *testing.PB) {
332-
for pb.Next() {
333-
var seq sink.Sequence
334-
if _, err := h.HandleLegacy(ctx, db, &seq, option.Options(optsN).Interfaces()...); err != nil {
335-
b.Fatalf("HandleLegacy failed: %v", err)
336-
}
337-
}
338-
})
339-
})
340-
341-
}

0 commit comments

Comments
 (0)