Browse Source

iam: detect postgres unique constraint violation and add groups index

Return ErrGroupAlreadyExists when INSERT hits SQLState 23505 instead of
a generic error. Add index on groups(disabled) for filtered queries.
pull/8560/head
Chris Lu 5 days ago
parent
commit
1487ecbc8e
  1. 7
      weed/credential/postgres/postgres_group.go
  2. 6
      weed/credential/postgres/postgres_store.go

7
weed/credential/postgres/postgres_group.go

@ -4,8 +4,10 @@ import (
"context" "context"
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"github.com/jackc/pgx/v5/pgconn"
"github.com/seaweedfs/seaweedfs/weed/credential" "github.com/seaweedfs/seaweedfs/weed/credential"
"github.com/seaweedfs/seaweedfs/weed/pb/iam_pb" "github.com/seaweedfs/seaweedfs/weed/pb/iam_pb"
) )
@ -24,7 +26,10 @@ func (store *PostgresStore) CreateGroup(ctx context.Context, group *iam_pb.Group
`INSERT INTO groups (name, members, policy_names, disabled) VALUES ($1, $2, $3, $4)`, `INSERT INTO groups (name, members, policy_names, disabled) VALUES ($1, $2, $3, $4)`,
group.Name, membersJSON, policyNamesJSON, group.Disabled) group.Name, membersJSON, policyNamesJSON, group.Disabled)
if err != nil { if err != nil {
// Check for unique constraint violation
var pgErr *pgconn.PgError
if errors.As(err, &pgErr) && pgErr.Code == "23505" {
return credential.ErrGroupAlreadyExists
}
return fmt.Errorf("failed to create group: %w", err) return fmt.Errorf("failed to create group: %w", err)
} }
return nil return nil

6
weed/credential/postgres/postgres_store.go

@ -178,6 +178,12 @@ func (store *PostgresStore) createTables() error {
return fmt.Errorf("failed to create groups table: %w", err) return fmt.Errorf("failed to create groups table: %w", err)
} }
// Create index on groups disabled column for filtering
groupsDisabledIndex := `CREATE INDEX IF NOT EXISTS idx_groups_disabled ON groups (disabled);`
if _, err := store.db.Exec(groupsDisabledIndex); err != nil {
return fmt.Errorf("failed to create groups disabled index: %w", err)
}
return nil return nil
} }

Loading…
Cancel
Save