Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sink: avoid memory allocations for transforming ColumnData to Column #11595

Merged
merged 17 commits into from
Sep 25, 2024
123 changes: 107 additions & 16 deletions cdc/model/sink.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@
}

// IsBinary shows whether BinaryFlag is set
func (b *ColumnFlagType) IsBinary() bool {
return (*util.Flag)(b).HasAll(util.Flag(BinaryFlag))
func (b ColumnFlagType) IsBinary() bool {
return (util.Flag)(b).HasAll(util.Flag(BinaryFlag))
}

// SetIsHandleKey sets HandleKey
Expand All @@ -110,8 +110,8 @@
}

// IsHandleKey shows whether HandleKey is set
func (b *ColumnFlagType) IsHandleKey() bool {
return (*util.Flag)(b).HasAll(util.Flag(HandleKeyFlag))
func (b ColumnFlagType) IsHandleKey() bool {
return (util.Flag)(b).HasAll(util.Flag(HandleKeyFlag))
}

// SetIsGeneratedColumn sets GeneratedColumn
Expand All @@ -125,8 +125,8 @@
}

// IsGeneratedColumn shows whether GeneratedColumn is set
func (b *ColumnFlagType) IsGeneratedColumn() bool {
return (*util.Flag)(b).HasAll(util.Flag(GeneratedColumnFlag))
func (b ColumnFlagType) IsGeneratedColumn() bool {
return (util.Flag)(b).HasAll(util.Flag(GeneratedColumnFlag))
}

// SetIsPrimaryKey sets PrimaryKeyFlag
Expand All @@ -140,8 +140,8 @@
}

// IsPrimaryKey shows whether PrimaryKeyFlag is set
func (b *ColumnFlagType) IsPrimaryKey() bool {
return (*util.Flag)(b).HasAll(util.Flag(PrimaryKeyFlag))
func (b ColumnFlagType) IsPrimaryKey() bool {
return (util.Flag)(b).HasAll(util.Flag(PrimaryKeyFlag))
}

// SetIsUniqueKey sets UniqueKeyFlag
Expand All @@ -155,13 +155,13 @@
}

// IsUniqueKey shows whether UniqueKeyFlag is set
func (b *ColumnFlagType) IsUniqueKey() bool {
return (*util.Flag)(b).HasAll(util.Flag(UniqueKeyFlag))
func (b ColumnFlagType) IsUniqueKey() bool {
return (util.Flag)(b).HasAll(util.Flag(UniqueKeyFlag))
}

// IsMultipleKey shows whether MultipleKeyFlag is set
func (b *ColumnFlagType) IsMultipleKey() bool {
return (*util.Flag)(b).HasAll(util.Flag(MultipleKeyFlag))
func (b ColumnFlagType) IsMultipleKey() bool {
return (util.Flag)(b).HasAll(util.Flag(MultipleKeyFlag))
}

// SetIsMultipleKey sets MultipleKeyFlag
Expand All @@ -175,8 +175,8 @@
}

// IsNullable shows whether NullableFlag is set
func (b *ColumnFlagType) IsNullable() bool {
return (*util.Flag)(b).HasAll(util.Flag(NullableFlag))
func (b ColumnFlagType) IsNullable() bool {
return (util.Flag)(b).HasAll(util.Flag(NullableFlag))
}

// SetIsNullable sets NullableFlag
Expand All @@ -190,8 +190,8 @@
}

// IsUnsigned shows whether UnsignedFlag is set
func (b *ColumnFlagType) IsUnsigned() bool {
return (*util.Flag)(b).HasAll(util.Flag(UnsignedFlag))
func (b ColumnFlagType) IsUnsigned() bool {
return (util.Flag)(b).HasAll(util.Flag(UnsignedFlag))
}

// SetIsUnsigned sets UnsignedFlag
Expand Down Expand Up @@ -1295,3 +1295,94 @@
PartitionKey string
TotalPartition int32
}

// ColumnDataX is like ColumnData, but contains more informations.
//
//msgp:ignore RowChangedEvent
type ColumnDataX struct {
*ColumnData
flag *ColumnFlagType
info *model.ColumnInfo
}

// GetColumnDataX encapsures ColumnData to ColumnDataX.
func GetColumnDataX(col *ColumnData, tb *TableInfo) ColumnDataX {
x := ColumnDataX{ColumnData: col}
if x.ColumnData != nil {
x.flag = tb.ColumnsFlag[col.ColumnID]
x.info = tb.Columns[tb.columnsOffset[col.ColumnID]]
}
return x

Check warning on line 1315 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1309-L1315

Added lines #L1309 - L1315 were not covered by tests
}

// GetName returns name.
func (x ColumnDataX) GetName() string {
return x.info.Name.O

Check warning on line 1320 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1319-L1320

Added lines #L1319 - L1320 were not covered by tests
}

// GetType returns type.
func (x ColumnDataX) GetType() byte {
return x.info.GetType()

Check warning on line 1325 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1324-L1325

Added lines #L1324 - L1325 were not covered by tests
}

// GetCharset returns charset.
func (x ColumnDataX) GetCharset() string {
return x.info.GetCharset()

Check warning on line 1330 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1329-L1330

Added lines #L1329 - L1330 were not covered by tests
}

// GetCollation returns collation.
func (x ColumnDataX) GetCollation() string {
return x.info.GetCollate()

Check warning on line 1335 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1334-L1335

Added lines #L1334 - L1335 were not covered by tests
}

// GetFlag returns flag.
func (x ColumnDataX) GetFlag() ColumnFlagType {
return *x.flag

Check warning on line 1340 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1339-L1340

Added lines #L1339 - L1340 were not covered by tests
}

// GetDefaultValue return default value.
func (x ColumnDataX) GetDefaultValue() interface{} {
return GetColumnDefaultValue(x.info)

Check warning on line 1345 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1344-L1345

Added lines #L1344 - L1345 were not covered by tests
}

// GetColumnInfo returns column info.
func (x ColumnDataX) GetColumnInfo() *model.ColumnInfo {
return x.info

Check warning on line 1350 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1349-L1350

Added lines #L1349 - L1350 were not covered by tests
}

// Columns2ColumnDataForTest is for tests.
func Columns2ColumnDataForTest(columns []*Column) ([]*ColumnData, *TableInfo) {
info := &TableInfo{
TableInfo: &model.TableInfo{
Columns: make([]*model.ColumnInfo, len(columns)),
},
ColumnsFlag: make(map[int64]*ColumnFlagType, len(columns)),
columnsOffset: make(map[int64]int),
}
colDatas := make([]*ColumnData, 0, len(columns))

for i, column := range columns {
var columnID int64 = int64(i)
info.columnsOffset[columnID] = i

info.Columns[i] = &model.ColumnInfo{}
info.Columns[i].Name.O = column.Name
info.Columns[i].SetType(column.Type)
info.Columns[i].SetCharset(column.Charset)
info.Columns[i].SetCollate(column.Collation)
info.Columns[i].DefaultValue = column.Default

info.ColumnsFlag[columnID] = new(ColumnFlagType)
*info.ColumnsFlag[columnID] = column.Flag

colDatas = append(colDatas, &ColumnData{ColumnID: columnID, Value: column.Value})
}

Check warning on line 1379 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1354-L1379

Added lines #L1354 - L1379 were not covered by tests

return colDatas, info

Check warning on line 1381 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1381

Added line #L1381 was not covered by tests
}

// Column2ColumnDataXForTest is for tests.
func Column2ColumnDataXForTest(column *Column) ColumnDataX {
datas, info := Columns2ColumnDataForTest([]*Column{column})
return GetColumnDataX(datas[0], info)

Check warning on line 1387 in cdc/model/sink.go

View check run for this annotation

Codecov / codecov/patch

cdc/model/sink.go#L1385-L1387

Added lines #L1385 - L1387 were not covered by tests
}
197 changes: 197 additions & 0 deletions cdc/model/sink_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading