feat(tfstated): garbage collect older states

This commit is contained in:
Julien Dessaux 2024-10-17 09:18:40 +02:00
parent 0e58781daa
commit 4c2032e1f0
Signed by: adyxax
GPG key ID: F92E51B86E07177E

View file

@ -22,7 +22,14 @@ func (db *DB) DeleteState(name string) (bool, error) {
func (db *DB) GetState(name string) ([]byte, error) {
var encryptedData []byte
err := db.QueryRow(`SELECT versions.data FROM versions JOIN states ON states.id = versions.state_id WHERE states.name = ? ORDER BY versions.id DESC LIMIT 1;`, name).Scan(&encryptedData)
err := db.QueryRow(
`SELECT versions.data
FROM versions
JOIN states ON states.id = versions.state_id
WHERE states.name = ?
ORDER BY versions.id DESC
LIMIT 1;`,
name).Scan(&encryptedData)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return []byte{}, nil
@ -84,7 +91,23 @@ func (db *DB) SetState(name string, data []byte, lockID string) (bool, error) {
if err != nil {
return false, err
}
// TODO delete old states
_, err = tx.ExecContext(db.ctx,
`DELETE FROM versions
WHERE state_id = (SELECT id
FROM states
WHERE name = :name)
AND id < (SELECT MIN(id)
FROM(SELECT versions.id
FROM versions
JOIN states ON states.id = versions.state_id
WHERE states.name = :name
ORDER BY versions.id DESC
LIMIT 64));`,
sql.Named("name", name),
)
if err != nil {
return false, err
}
err = tx.Commit()
return false, err
}