Skip to content
Draft
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions internal/datastore/postgres/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ func newPostgresDatastore(
quantizationPeriodNanos,
schema.ColSnapshot,
followerReadDelayNanos,
schema.ColTimestamp,
)

var revisionHeartbeatQuery string
Expand Down
24 changes: 20 additions & 4 deletions internal/datastore/postgres/revisions.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@
(SELECT %[1]s FROM %[2]s WHERE %[3]s >= TO_TIMESTAMP(FLOOR((EXTRACT(EPOCH FROM NOW() AT TIME ZONE 'utc') * 1000000000 - %[6]d)/ %[4]d) * %[4]d / 1000000000) AT TIME ZONE 'utc' ORDER BY %[3]s ASC LIMIT 1)
) as xid)
SELECT selected.xid,
COALESCE((SELECT %[5]s FROM %[2]s WHERE %[1]s = selected.xid), (SELECT pg_current_snapshot())),
%[4]d - CAST(EXTRACT(EPOCH FROM NOW() AT TIME ZONE 'utc') * 1000000000 as bigint) %% %[4]d
COALESCE((SELECT %[5]s FROM %[2]s WHERE %[1]s = selected.xid), (SELECT pg_current_snapshot())),
%[4]d - CAST(EXTRACT(EPOCH FROM NOW() AT TIME ZONE 'utc') * 1000000000 as bigint) %% %[4]d,
(SELECT %[3]s FROM %[2]s WHERE %[1]s = selected.xid)
FROM selected;`

// queryValidTransaction will return a single row with three values:
Expand Down Expand Up @@ -109,14 +110,29 @@
var revision xid8
var snapshot pgSnapshot
var validForNanos time.Duration
var timestamp *time.Time
var err error

if err := pgd.readPool.QueryRow(ctx, pgd.optimizedRevisionQuery).
Scan(&revision, &snapshot, &validForNanos); err != nil {
Scan(&revision, &snapshot, &validForNanos, &timestamp); err != nil {
return datastore.NoRevision, 0, fmt.Errorf(errRevision, err)
}

var tsNanos uint64
if timestamp != nil {
tsNanos, err = safecast.Convert[uint64](timestamp.UnixNano())
if err != nil {
return nil, 0, spiceerrors.MustBugf("could not cast timestamp to uint64")
}

Check warning on line 126 in internal/datastore/postgres/revisions.go

View check run for this annotation

Codecov / codecov/patch

internal/datastore/postgres/revisions.go#L125-L126

Added lines #L125 - L126 were not covered by tests
}

snapshot = snapshot.markComplete(revision.Uint64)

return postgresRevision{snapshot: snapshot, optionalTxID: revision}, validForNanos, nil
return postgresRevision{
snapshot: snapshot,
optionalInexactNanosTimestamp: tsNanos,
optionalTxID: revision,
}, validForNanos, nil
}

func (pgd *pgDatastore) HeadRevision(ctx context.Context) (datastore.Revision, error) {
Expand Down
Loading