2021-06-07 10:20:06 +01:00
// Copyright (C) 2021 Storj Labs, Inc.
// See LICENSE for copying information.
package metabase
import (
"context"
2023-03-03 10:33:51 +00:00
"database/sql"
"errors"
2021-06-07 10:20:06 +01:00
"time"
2023-03-03 10:33:51 +00:00
"storj.io/private/dbutil"
2021-06-07 10:20:06 +01:00
)
2023-03-03 10:33:51 +00:00
const statsUpToDateThreshold = 8 * time . Hour
2021-06-07 10:20:06 +01:00
// GetTableStats contains arguments necessary for getting table statistics.
type GetTableStats struct {
AsOfSystemInterval time . Duration
}
// TableStats contains information about the metabase status.
type TableStats struct {
SegmentCount int64
}
2022-09-22 14:56:45 +01:00
// GetTableStats gathers information about the metabase tables, currently only "segments" table.
2021-06-07 10:20:06 +01:00
func ( db * DB ) GetTableStats ( ctx context . Context , opts GetTableStats ) ( result TableStats , err error ) {
defer mon . Task ( ) ( & ctx ) ( & err )
2023-03-03 10:33:51 +00:00
// if it's cockroach and statistics are up to date we will use them to get segments count
if db . impl == dbutil . Cockroach {
var created time . Time
2023-03-30 13:29:40 +01:00
err := db . db . QueryRowContext ( ctx , ` WITH stats AS (SHOW STATISTICS FOR TABLE segments) SELECT row_count, created FROM stats ORDER BY created DESC LIMIT 1 ` ) .
2023-03-03 10:33:51 +00:00
Scan ( & result . SegmentCount , & created )
if err != nil && ! errors . Is ( err , sql . ErrNoRows ) {
return TableStats { } , err
}
if ! created . IsZero ( ) && statsUpToDateThreshold > time . Since ( created ) {
return result , nil
}
}
2022-09-22 14:56:45 +01:00
err = db . db . QueryRowContext ( ctx , ` SELECT count(*) FROM segments ` + db . impl . AsOfSystemInterval ( opts . AsOfSystemInterval ) ) . Scan ( & result . SegmentCount )
if err != nil {
return TableStats { } , err
}
return result , nil
2021-06-07 10:20:06 +01:00
}