postgres: use CTE and GENERATED version number instead of serialized transaction (#3408)

* postgres: use CTE and GENERATED version number instead of serialized transaction

* update server version

* fix indexing CIDRs
This commit is contained in:
Caleb Doxsey 2022-06-09 12:18:20 -06:00 committed by GitHub
parent a7bd284b52
commit a2d5d8062b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 81 additions and 82 deletions

View file

@ -158,53 +158,32 @@ func (backend *Backend) Put(
return 0, err
}
err = pool.BeginTxFunc(ctx, pgx.TxOptions{
IsoLevel: pgx.Serializable,
AccessMode: pgx.ReadWrite,
}, func(tx pgx.Tx) error {
now := timestamppb.Now()
now := timestamppb.Now()
recordVersion, err := getLatestRecordVersion(ctx, tx)
// add all the records
recordTypes := map[string]struct{}{}
for i, record := range records {
recordTypes[record.GetType()] = struct{}{}
record = dup(record)
record.ModifiedAt = now
err := putRecordAndChange(ctx, pool, record)
if err != nil {
return fmt.Errorf("storage/postgres: error getting latest record version: %w", err)
return serverVersion, fmt.Errorf("storage/postgres: error saving record: %w", err)
}
records[i] = record
}
// add all the records
recordTypes := map[string]struct{}{}
for i, record := range records {
recordTypes[record.GetType()] = struct{}{}
record = dup(record)
record.ModifiedAt = now
record.Version = recordVersion + uint64(i) + 1
err := putRecordChange(ctx, tx, record)
if err != nil {
return fmt.Errorf("storage/postgres: error saving record change: %w", err)
}
err = putRecord(ctx, tx, record)
if err != nil {
return fmt.Errorf("storage/postgres: error saving record: %w", err)
}
records[i] = record
// enforce options for each record type
for recordType := range recordTypes {
options, err := getOptions(ctx, pool, recordType)
if err != nil {
return serverVersion, fmt.Errorf("storage/postgres: error getting options: %w", err)
}
// enforce options for each record type
for recordType := range recordTypes {
options, err := getOptions(ctx, tx, recordType)
if err != nil {
return fmt.Errorf("storage/postgres: error getting options: %w", err)
}
err = enforceOptions(ctx, tx, recordType, options)
if err != nil {
return fmt.Errorf("storage/postgres: error enforcing options: %w", err)
}
err = enforceOptions(ctx, pool, recordType, options)
if err != nil {
return serverVersion, fmt.Errorf("storage/postgres: error enforcing options: %w", err)
}
return nil
})
if err != nil {
return serverVersion, err
}
err = signalRecordChange(ctx, pool)