Skip to content

Commit beaf71b

Browse files
Cherry-pick 81356ab with conflicts
1 parent 57241c2 commit beaf71b

2 files changed

Lines changed: 125 additions & 2 deletions

File tree

go/vt/vtctl/workflow/sequences.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,27 @@ func (ts *trafficSwitcher) getCurrentSequenceValue(ctx context.Context, seq *seq
250250
return currentVal, nil
251251
}
252252

253+
<<<<<<< HEAD
253254
func (ts *trafficSwitcher) updateSequenceValue(ctx context.Context, seq *sequenceMetadata, currentMaxValue int64) error {
254255
if err := seq.escapeValues(); err != nil {
255256
return err
257+
=======
258+
func (ts *trafficSwitcher) updateSequenceValues(ctx context.Context, sequences []*sequenceMetadata, maxValues map[string]int64) error {
259+
sequencesByShard := map[string][]*tabletmanagerdatapb.UpdateSequenceTablesRequest_SequenceMetadata{}
260+
for _, seq := range sequences {
261+
maxValue := maxValues[seq.backingTableName]
262+
sequenceShard, ierr := ts.TopoServer().GetOnlyShard(ctx, seq.backingTableKeyspace)
263+
if ierr != nil || sequenceShard == nil || sequenceShard.PrimaryAlias == nil {
264+
return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to get the primary tablet for keyspace %s: %v",
265+
seq.backingTableKeyspace, ierr)
266+
}
267+
tabletAliasStr := topoproto.TabletAliasString(sequenceShard.PrimaryAlias)
268+
sequencesByShard[tabletAliasStr] = append(sequencesByShard[tabletAliasStr], &tabletmanagerdatapb.UpdateSequenceTablesRequest_SequenceMetadata{
269+
BackingTableName: seq.backingTableName,
270+
BackingTableDbName: seq.backingTableDBName,
271+
MaxValue: maxValue,
272+
})
273+
>>>>>>> 81356abde1 (VReplication: Properly Handle Sequence Table Initialization For Empty Tables (#19226))
256274
}
257275
nextVal := currentMaxValue + 1
258276
log.Infof("Updating sequence %s.%s to %d", seq.backingTableDBName, seq.backingTableName, nextVal)

go/vt/vtctl/workflow/sequences_test.go

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,121 @@ func TestInitializeTargetSequences(t *testing.T) {
8989
},
9090
}
9191

92+
<<<<<<< HEAD
9293
env.tmc.expectVRQuery(200, "/select max.*", sqltypes.MakeTestResult(sqltypes.MakeTestFields("maxval", "int64"), "34"))
9394
// Expect the insert query to be executed with 35 as a params, since we provide a maxID of 34 in the last query
9495
env.tmc.expectVRQuery(100, "/insert into.*35.*", &sqltypes.Result{RowsAffected: 1})
96+
=======
97+
type testCase struct {
98+
name string
99+
maxValueRequest *getMaxValueForSequencesRequestResponse
100+
updateSeqTableRequest *tabletmanagerdatapb.UpdateSequenceTablesRequest
101+
}
95102

96-
err = sw.initializeTargetSequences(ctx, sequencesByBackingTable)
97-
assert.NoError(t, err)
103+
testCases := []testCase{
104+
{
105+
name: "initialize sequences",
106+
maxValueRequest: &getMaxValueForSequencesRequestResponse{
107+
req: &tabletmanagerdatapb.GetMaxValueForSequencesRequest{
108+
Sequences: []*tabletmanagerdatapb.GetMaxValueForSequencesRequest_SequenceMetadata{
109+
{
110+
BackingTableName: "my-seq1",
111+
UsingColEscaped: "`my-col`",
112+
UsingTableNameEscaped: fmt.Sprintf("`%s`", tableName),
113+
UsingTableDbNameEscaped: "`vt_targetks`",
114+
},
115+
{
116+
BackingTableName: "my-seq2",
117+
UsingColEscaped: "`my-col-2`",
118+
UsingTableNameEscaped: fmt.Sprintf("`%s`", tableName2),
119+
UsingTableDbNameEscaped: "`vt_targetks`",
120+
},
121+
},
122+
},
123+
res: &tabletmanagerdatapb.GetMaxValueForSequencesResponse{
124+
MaxValuesBySequenceTable: map[string]int64{
125+
"my-seq1": 34,
126+
"my-seq2": 10,
127+
},
128+
},
129+
},
130+
updateSeqTableRequest: &tabletmanagerdatapb.UpdateSequenceTablesRequest{
131+
Sequences: []*tabletmanagerdatapb.UpdateSequenceTablesRequest_SequenceMetadata{
132+
{
133+
BackingTableName: "my-seq1",
134+
BackingTableDbName: "vt_" + sourceKeyspaceName,
135+
MaxValue: 34,
136+
},
137+
{
138+
BackingTableName: "my-seq2",
139+
BackingTableDbName: "vt_" + sourceKeyspaceName,
140+
MaxValue: 10,
141+
},
142+
},
143+
},
144+
},
145+
{
146+
name: "initialize sequences for empty tables",
147+
maxValueRequest: &getMaxValueForSequencesRequestResponse{
148+
req: &tabletmanagerdatapb.GetMaxValueForSequencesRequest{
149+
Sequences: []*tabletmanagerdatapb.GetMaxValueForSequencesRequest_SequenceMetadata{
150+
{
151+
BackingTableName: "my-seq1",
152+
UsingColEscaped: "`my-col`",
153+
UsingTableNameEscaped: fmt.Sprintf("`%s`", tableName),
154+
UsingTableDbNameEscaped: "`vt_targetks`",
155+
},
156+
{
157+
BackingTableName: "my-seq2",
158+
UsingColEscaped: "`my-col-2`",
159+
UsingTableNameEscaped: fmt.Sprintf("`%s`", tableName2),
160+
UsingTableDbNameEscaped: "`vt_targetks`",
161+
},
162+
},
163+
},
164+
res: &tabletmanagerdatapb.GetMaxValueForSequencesResponse{
165+
MaxValuesBySequenceTable: map[string]int64{},
166+
},
167+
},
168+
updateSeqTableRequest: &tabletmanagerdatapb.UpdateSequenceTablesRequest{
169+
Sequences: []*tabletmanagerdatapb.UpdateSequenceTablesRequest_SequenceMetadata{
170+
{
171+
BackingTableName: "my-seq1",
172+
BackingTableDbName: "vt_" + sourceKeyspaceName,
173+
MaxValue: 0,
174+
},
175+
{
176+
BackingTableName: "my-seq2",
177+
BackingTableDbName: "vt_" + sourceKeyspaceName,
178+
MaxValue: 0,
179+
},
180+
},
181+
},
182+
},
183+
}
184+
>>>>>>> 81356abde1 (VReplication: Properly Handle Sequence Table Initialization For Empty Tables (#19226))
185+
186+
for _, tc := range testCases {
187+
t.Run(tc.name, func(t *testing.T) {
188+
require.NotNil(t, tc.maxValueRequest)
189+
require.NotNil(t, tc.updateSeqTableRequest)
190+
env.tmc.expectGetMaxValueForSequencesRequest(200, tc.maxValueRequest)
191+
env.tmc.expectUpdateSequenceTablesRequest(100, tc.updateSeqTableRequest)
98192

193+
<<<<<<< HEAD
99194
// Expect the queries to be cleared
100195
assert.Emptyf(t, env.tmc.vrQueries[100], "expected no queries to be executed, found: %q", env.tmc.vrQueries[100])
101196
assert.Empty(t, env.tmc.vrQueries[200], "expected no queries to be executed, found: %q", env.tmc.vrQueries[200])
197+
=======
198+
err = sw.initializeTargetSequences(ctx, sequencesByBackingTable)
199+
assert.NoError(t, err)
200+
201+
// Expect the requests to be cleared.
202+
assert.Emptyf(t, env.tmc.updateSequenceTablesRequests, "expected no remaining UpdateSequenceTables requests")
203+
assert.Emptyf(t, env.tmc.getMaxValueForSequencesRequests, "expected no remaining GetMaxValueForSequences requests")
204+
})
205+
}
206+
>>>>>>> 81356abde1 (VReplication: Properly Handle Sequence Table Initialization For Empty Tables (#19226))
102207
}
103208

104209
func TestGetTargetSequenceMetadata(t *testing.T) {

0 commit comments

Comments
 (0)