Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 23 additions & 54 deletions pkg/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,31 +33,6 @@ type LSN struct {
lsn string
}

func checkVersion(c *pgx.Conn, exp string) (bool, error) {
rows, err := c.Query(`SELECT extversion FROM pg_catalog.pg_extension WHERE extname OPERATOR(pg_catalog.=) 'yezzey';`)
if err != nil {
return false, fmt.Errorf("unable to get ao/aocs tables %v", err) //fix
}

defer rows.Close()
ylogger.Zero.Debug().Msg("executed select")

if rows.Next() {
var ver string
if err := rows.Scan(&ver); err != nil {
return false, fmt.Errorf("unable to parse query output %v", err)
}
if rows.Next() {
return false, fmt.Errorf("unable to get yezzey extension version: duplicate output")
}

/* we compare versions lexicographically */
return ver >= exp, nil
}

return false, fmt.Errorf("unable to get yezzey extension version")
}

func nextPrefix(prefix string) string {
b := []byte(prefix)
for i := len(b) - 1; i >= 0; i-- {
Expand All @@ -82,39 +57,33 @@ func (database *DatabaseHandler) GetVirtualExpireIndexByPrefix(port uint64, db D
upper := nextPrefix(prefix)
usePrefix := lower != "" && upper != ""

/* Todo: check that yezzey version >= 1.8.4 */
if ch, err := checkVersion(conn, "1.8.4"); err != nil {
ylogger.Zero.Warn().Err(err).Msg("GetVirtualExpireIndexByPrefix: failed")
return err
} else if ch {
var rows *pgx.Rows
if usePrefix {
rows, err = conn.Query(`SELECT x_path, lsn FROM yezzey.yezzey_expire_hint WHERE x_path COLLATE "C" OPERATOR(pg_catalog.>=) $1 COLLATE "C" AND x_path COLLATE "C" OPERATOR(pg_catalog.<) $2 COLLATE "C";`, lower, upper)
} else {
rows, err = conn.Query(`SELECT x_path, lsn FROM yezzey.yezzey_expire_hint;`)
var rows *pgx.Rows
if usePrefix {
rows, err = conn.Query(`SELECT x_path, lsn FROM yezzey.yezzey_expire_hint WHERE x_path COLLATE "C" OPERATOR(pg_catalog.>=) $1 COLLATE "C" AND x_path COLLATE "C" OPERATOR(pg_catalog.<) $2 COLLATE "C";`, lower, upper)
} else {
rows, err = conn.Query(`SELECT x_path, lsn FROM yezzey.yezzey_expire_hint;`)
}
if err != nil {
return fmt.Errorf("unable to get ao/aocs tables %v", err) //fix
}
defer rows.Close()
ylogger.Zero.Debug().Bool("prefix filtered", usePrefix).Msg("executed select")

for rows.Next() {
row := ExpireHint{}
if err := rows.Scan(&row.x_path, &row.expireLsn); err != nil {
return fmt.Errorf("unable to parse query output %v", err)
}

lsn, err := pgx.ParseLSN(row.expireLsn)
if err != nil {
return fmt.Errorf("unable to get ao/aocs tables %v", err) //fix
}
defer rows.Close()
ylogger.Zero.Debug().Bool("prefix filtered", usePrefix).Msg("executed select")

for rows.Next() {
row := ExpireHint{}
if err := rows.Scan(&row.x_path, &row.expireLsn); err != nil {
return fmt.Errorf("unable to parse query output %v", err)
}

lsn, err := pgx.ParseLSN(row.expireLsn)
if err != nil {
return fmt.Errorf("unable to parse query output %v", err)
}

ylogger.Zero.Debug().Str("x_path", row.x_path).Str("lsn", row.expireLsn).Msg("added file to expire hint")
(*expireIndex)[row.x_path] = lsn
return fmt.Errorf("unable to parse query output %v", err)
}
ylogger.Zero.Debug().Msg("fetched expire hint info")

ylogger.Zero.Debug().Str("x_path", row.x_path).Str("lsn", row.expireLsn).Msg("added file to expire hint")
(*expireIndex)[row.x_path] = lsn
}
ylogger.Zero.Debug().Msg("fetched expire hint info")

var viRows *pgx.Rows
if usePrefix {
Expand Down
Loading