2019-02-14 21:55:21 +00:00
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package satellitedb
import (
2020-01-13 13:18:48 +00:00
"context"
2019-12-05 20:42:12 +00:00
"fmt"
2021-04-28 14:22:54 +01:00
"strings"
2019-12-05 20:42:12 +00:00
2019-02-14 21:55:21 +00:00
"github.com/zeebo/errs"
2020-11-04 17:24:11 +00:00
"go.uber.org/zap"
2019-02-14 21:55:21 +00:00
2021-04-23 10:52:40 +01:00
"storj.io/private/dbutil"
"storj.io/private/dbutil/cockroachutil"
"storj.io/private/dbutil/pgutil"
"storj.io/private/tagsql"
2019-11-14 19:46:15 +00:00
"storj.io/storj/private/migrate"
2019-02-14 21:55:21 +00:00
)
2021-02-22 16:55:06 +00:00
//go:generate go run migrate_gen.go
2019-07-23 18:58:43 +01:00
var (
2020-08-11 15:50:01 +01:00
// ErrMigrate is for tracking migration errors.
2019-07-23 18:58:43 +01:00
ErrMigrate = errs . Class ( "migrate" )
2020-08-11 15:50:01 +01:00
// ErrMigrateMinVersion is for migration min version errors.
2019-11-19 20:52:57 +00:00
ErrMigrateMinVersion = errs . Class ( "migrate min version" )
2019-07-23 18:58:43 +01:00
)
2019-02-14 21:55:21 +00:00
2020-04-30 07:36:59 +01:00
// MigrateToLatest migrates the database to the latest version.
func ( db * satelliteDB ) MigrateToLatest ( ctx context . Context ) error {
2019-12-05 20:42:12 +00:00
// First handle the idiosyncrasies of postgres and cockroach migrations. Postgres
// will need to create any schemas specified in the search path, and cockroach
// will need to create the database it was told to connect to. These things should
// not really be here, and instead should be assumed to exist.
2020-04-24 19:01:47 +01:00
// This is tracked in jira ticket SM-200
2021-05-11 09:49:26 +01:00
switch db . impl {
2019-12-05 20:42:12 +00:00
case dbutil . Postgres :
2019-05-14 16:13:18 +01:00
schema , err := pgutil . ParseSchemaFromConnstr ( db . source )
if err != nil {
return errs . New ( "error parsing schema: %+v" , err )
}
2019-11-22 19:59:46 +00:00
2019-05-14 16:13:18 +01:00
if schema != "" {
2020-01-13 13:18:48 +00:00
err = pgutil . CreateSchema ( ctx , db , schema )
2019-05-14 16:13:18 +01:00
if err != nil {
return errs . New ( "error creating schema: %+v" , err )
}
}
2019-12-05 20:42:12 +00:00
case dbutil . Cockroach :
var dbName string
2020-01-17 20:07:00 +00:00
if err := db . QueryRow ( ctx , ` SELECT current_database(); ` ) . Scan ( & dbName ) ; err != nil {
2019-12-05 20:42:12 +00:00
return errs . New ( "error querying current database: %+v" , err )
}
2020-01-17 20:07:00 +00:00
_ , err := db . Exec ( ctx , fmt . Sprintf ( ` CREATE DATABASE IF NOT EXISTS %s; ` ,
2020-06-28 04:56:29 +01:00
pgutil . QuoteIdentifier ( dbName ) ) )
2019-12-05 20:42:12 +00:00
if err != nil {
return errs . Wrap ( err )
}
}
2021-05-11 09:49:26 +01:00
switch db . impl {
2019-12-05 20:42:12 +00:00
case dbutil . Postgres , dbutil . Cockroach :
2023-02-06 12:15:36 +00:00
migration := db . ProductionMigration ( )
2019-11-22 19:59:46 +00:00
// since we merged migration steps 0-69, the current db version should never be
// less than 69 unless the migration hasn't run yet
const minDBVersion = 69
2020-01-17 20:07:00 +00:00
dbVersion , err := migration . CurrentVersion ( ctx , db . log , db . DB )
2019-11-19 20:52:57 +00:00
if err != nil {
return errs . New ( "error current version: %+v" , err )
}
if dbVersion > - 1 && dbVersion < minDBVersion {
return ErrMigrateMinVersion . New ( "current database version is %d, it shouldn't be less than the min version %d" ,
dbVersion , minDBVersion ,
)
}
2020-01-13 13:44:55 +00:00
return migration . Run ( ctx , db . log . Named ( "migrate" ) )
2019-02-14 21:55:21 +00:00
default :
2020-01-17 20:07:00 +00:00
return migrate . Create ( ctx , "database" , db . DB )
2019-02-14 21:55:21 +00:00
}
}
2023-02-06 12:15:36 +00:00
// TestMigrateToLatest is a method for creating all tables for database for testing.
func ( db * satelliteDBTesting ) TestMigrateToLatest ( ctx context . Context ) error {
2021-05-11 09:49:26 +01:00
switch db . impl {
2020-01-17 20:56:56 +00:00
case dbutil . Postgres :
schema , err := pgutil . ParseSchemaFromConnstr ( db . source )
if err != nil {
return ErrMigrateMinVersion . New ( "error parsing schema: %+v" , err )
}
if schema != "" {
err = pgutil . CreateSchema ( ctx , db , schema )
if err != nil {
return ErrMigrateMinVersion . New ( "error creating schema: %+v" , err )
}
}
case dbutil . Cockroach :
var dbName string
if err := db . QueryRow ( ctx , ` SELECT current_database(); ` ) . Scan ( & dbName ) ; err != nil {
return ErrMigrateMinVersion . New ( "error querying current database: %+v" , err )
}
2020-06-28 04:56:29 +01:00
_ , err := db . Exec ( ctx , fmt . Sprintf ( ` CREATE DATABASE IF NOT EXISTS %s; ` , pgutil . QuoteIdentifier ( dbName ) ) )
2020-01-17 20:56:56 +00:00
if err != nil {
return ErrMigrateMinVersion . Wrap ( err )
}
}
2021-05-11 09:49:26 +01:00
switch db . impl {
2020-01-17 20:56:56 +00:00
case dbutil . Postgres , dbutil . Cockroach :
2023-02-06 12:15:36 +00:00
migration := db . ProductionMigration ( )
2020-01-17 20:56:56 +00:00
dbVersion , err := migration . CurrentVersion ( ctx , db . log , db . DB )
if err != nil {
return ErrMigrateMinVersion . Wrap ( err )
}
2023-02-06 12:15:36 +00:00
testMigration := db . TestMigration ( )
2022-10-03 14:32:14 +01:00
if dbVersion != - 1 && dbVersion != testMigration . Steps [ 0 ] . Version {
return ErrMigrateMinVersion . New ( "the database must be empty, or be on the latest version (%d)" , dbVersion )
}
2021-02-22 16:55:06 +00:00
return testMigration . Run ( ctx , db . log . Named ( "migrate" ) )
2020-01-17 20:56:56 +00:00
default :
return migrate . Create ( ctx , "database" , db . DB )
}
}
2020-07-16 15:18:02 +01:00
// CheckVersion confirms the database is at the desired version.
2020-01-13 13:44:55 +00:00
func ( db * satelliteDB ) CheckVersion ( ctx context . Context ) error {
2021-05-11 09:49:26 +01:00
switch db . impl {
2019-12-05 20:42:12 +00:00
case dbutil . Postgres , dbutil . Cockroach :
2023-02-06 12:15:36 +00:00
migration := db . ProductionMigration ( )
2020-01-13 13:44:55 +00:00
return migration . ValidateVersions ( ctx , db . log )
2019-12-05 20:42:12 +00:00
2019-11-02 20:09:07 +00:00
default :
return nil
}
}
2023-02-06 12:15:36 +00:00
// TestMigration returns steps needed for migrating test postgres database.
func ( db * satelliteDB ) TestMigration ( ) * migrate . Migration {
2021-02-22 16:55:06 +00:00
return db . testMigration ( )
2020-01-17 20:56:56 +00:00
}
2023-02-06 12:15:36 +00:00
// ProductionMigration returns steps needed for migrating postgres database.
func ( db * satelliteDB ) ProductionMigration ( ) * migrate . Migration {
2019-02-14 21:55:21 +00:00
return & migrate . Migration {
Table : "versions" ,
Steps : [ ] * migrate . Step {
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2019-02-14 21:55:21 +00:00
Description : "Initial setup" ,
2020-08-26 16:06:44 +01:00
Version : 103 ,
2019-02-14 21:55:21 +00:00
Action : migrate . SQL {
2019-11-19 20:52:57 +00:00
` CREATE TABLE accounting_rollups (
2019-02-14 21:55:21 +00:00
id bigserial NOT NULL ,
node_id bytea NOT NULL ,
start_time timestamp with time zone NOT NULL ,
put_total bigint NOT NULL ,
get_total bigint NOT NULL ,
get_audit_total bigint NOT NULL ,
get_repair_total bigint NOT NULL ,
put_repair_total bigint NOT NULL ,
at_rest_total double precision NOT NULL ,
PRIMARY KEY ( id )
2019-11-19 20:52:57 +00:00
) ; ` ,
2020-08-26 16:06:44 +01:00
` CREATE INDEX accounting_rollups_start_time_index ON accounting_rollups ( start_time ); ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE accounting_timestamps (
2019-02-14 21:55:21 +00:00
name text NOT NULL ,
value timestamp with time zone NOT NULL ,
PRIMARY KEY ( name )
2019-11-19 20:52:57 +00:00
) ; ` ,
` CREATE TABLE bucket_bandwidth_rollups (
bucket_name bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
interval_start timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
interval_seconds integer NOT NULL ,
action integer NOT NULL ,
inline bigint NOT NULL ,
allocated bigint NOT NULL ,
settled bigint NOT NULL ,
project_id bytea NOT NULL ,
CONSTRAINT bucket_bandwidth_rollups_pk PRIMARY KEY ( bucket_name , project_id , interval_start , action )
) ; ` ,
2020-08-26 16:06:44 +01:00
` CREATE INDEX IF NOT EXISTS bucket_bandwidth_rollups_project_id_action_interval_index ON bucket_bandwidth_rollups ( project_id, action, interval_start ); ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE bucket_storage_tallies (
bucket_name bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
interval_start timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
inline bigint NOT NULL ,
remote bigint NOT NULL ,
remote_segments_count integer NOT NULL ,
inline_segments_count integer NOT NULL ,
object_count integer NOT NULL ,
metadata_size bigint NOT NULL ,
project_id bytea NOT NULL ,
CONSTRAINT bucket_storage_tallies_pk PRIMARY KEY ( bucket_name , project_id , interval_start )
) ; ` ,
` CREATE TABLE injuredsegments (
2019-02-14 21:55:21 +00:00
data bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
attempted timestamp with time zone ,
2019-11-19 20:52:57 +00:00
path bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
num_healthy_pieces integer DEFAULT 52 NOT NULL ,
2019-11-19 20:52:57 +00:00
CONSTRAINT injuredsegments_pk PRIMARY KEY ( path )
) ; ` ,
` CREATE INDEX injuredsegments_attempted_index ON injuredsegments ( attempted ); ` ,
2020-08-26 16:06:44 +01:00
` CREATE INDEX injuredsegments_num_healthy_pieces_index ON injuredsegments ( num_healthy_pieces ); ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE irreparabledbs (
2019-02-14 21:55:21 +00:00
segmentpath bytea NOT NULL ,
segmentdetail bytea NOT NULL ,
pieces_lost_count bigint NOT NULL ,
seg_damaged_unix_sec bigint NOT NULL ,
repair_attempt_count bigint NOT NULL ,
PRIMARY KEY ( segmentpath )
2019-11-19 20:52:57 +00:00
) ; ` ,
` CREATE TABLE nodes (
2019-02-14 21:55:21 +00:00
id bytea NOT NULL ,
2019-11-19 20:52:57 +00:00
audit_success_count bigint NOT NULL DEFAULT 0 ,
total_audit_count bigint NOT NULL DEFAULT 0 ,
2019-02-14 21:55:21 +00:00
uptime_success_count bigint NOT NULL ,
total_uptime_count bigint NOT NULL ,
2019-11-19 20:52:57 +00:00
created_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
updated_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
wallet text NOT NULL ,
email text NOT NULL ,
address text NOT NULL DEFAULT ' ' ,
protocol INTEGER NOT NULL DEFAULT 0 ,
type INTEGER NOT NULL DEFAULT 0 ,
free_disk BIGINT NOT NULL DEFAULT - 1 ,
latency_90 BIGINT NOT NULL DEFAULT 0 ,
last_contact_success TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT ' epoch ' ,
last_contact_failure TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT ' epoch ' ,
major bigint NOT NULL DEFAULT 0 ,
minor bigint NOT NULL DEFAULT 0 ,
patch bigint NOT NULL DEFAULT 0 ,
hash TEXT NOT NULL DEFAULT ' ' ,
timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT ' 0001 - 01 - 01 00 : 00 : 00 + 00 ' ,
release bool NOT NULL DEFAULT FALSE ,
contained bool NOT NULL DEFAULT FALSE ,
last_net text NOT NULL ,
disqualified timestamp with time zone ,
audit_reputation_alpha double precision NOT NULL DEFAULT 1 ,
audit_reputation_beta double precision NOT NULL DEFAULT 0 ,
uptime_reputation_alpha double precision NOT NULL DEFAULT 1 ,
uptime_reputation_beta double precision NOT NULL DEFAULT 0 ,
piece_count bigint NOT NULL DEFAULT 0 ,
2020-08-26 16:06:44 +01:00
exit_loop_completed_at timestamp with time zone ,
exit_initiated_at timestamp with time zone ,
exit_finished_at timestamp with time zone ,
2019-11-19 20:52:57 +00:00
exit_success boolean NOT NULL DEFAULT FALSE ,
2020-08-26 16:06:44 +01:00
unknown_audit_reputation_alpha double precision NOT NULL DEFAULT 1 ,
unknown_audit_reputation_beta double precision NOT NULL DEFAULT 0 ,
2021-03-01 20:04:00 +00:00
suspended timestamp with time zone ,
last_ip_port text ,
2020-08-26 16:06:44 +01:00
vetted_at timestamp with time zone ,
2019-02-14 21:55:21 +00:00
PRIMARY KEY ( id )
2019-11-19 20:52:57 +00:00
) ; ` ,
` CREATE INDEX node_last_ip ON nodes ( last_net ); ` ,
` CREATE TABLE offers (
id serial NOT NULL ,
2019-02-14 21:55:21 +00:00
name text NOT NULL ,
description text NOT NULL ,
2019-11-19 20:52:57 +00:00
type integer NOT NULL ,
award_credit_duration_days integer ,
invitee_credit_duration_days integer ,
redeemable_cap integer ,
expires_at timestamp with time zone NOT NULL ,
2019-02-14 21:55:21 +00:00
created_at timestamp with time zone NOT NULL ,
status integer NOT NULL ,
2019-11-19 20:52:57 +00:00
award_credit_in_cents integer NOT NULL DEFAULT 0 ,
invitee_credit_in_cents integer NOT NULL DEFAULT 0 ,
2019-02-14 21:55:21 +00:00
PRIMARY KEY ( id )
2019-11-19 20:52:57 +00:00
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-11-19 20:52:57 +00:00
` CREATE TABLE peer_identities (
node_id bytea NOT NULL ,
leaf_serial_number bytea NOT NULL ,
chain bytea NOT NULL ,
updated_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( node_id )
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-11-19 20:52:57 +00:00
` CREATE TABLE pending_audits (
node_id bytea NOT NULL ,
piece_id bytea NOT NULL ,
stripe_index bigint NOT NULL ,
share_size bigint NOT NULL ,
expected_share_hash bytea NOT NULL ,
reverify_count bigint NOT NULL ,
path bytea NOT NULL ,
PRIMARY KEY ( node_id )
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-11-19 20:52:57 +00:00
` CREATE TABLE projects (
2019-02-14 21:55:21 +00:00
id bytea NOT NULL ,
2019-11-19 20:52:57 +00:00
name text NOT NULL ,
description text NOT NULL ,
created_at timestamp with time zone NOT NULL ,
usage_limit bigint NOT NULL DEFAULT 0 ,
partner_id bytea ,
owner_id bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
rate_limit integer ,
2019-02-14 21:55:21 +00:00
PRIMARY KEY ( id )
2019-11-19 20:52:57 +00:00
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-11-19 20:52:57 +00:00
` CREATE TABLE registration_tokens (
secret bytea NOT NULL ,
owner_id bytea UNIQUE ,
project_limit integer NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( secret )
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-11-19 20:52:57 +00:00
` CREATE TABLE reset_password_tokens (
secret bytea NOT NULL ,
owner_id bytea NOT NULL UNIQUE ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( secret )
) ; ` ,
2019-02-14 21:55:21 +00:00
2019-03-22 18:54:22 +00:00
` CREATE TABLE serial_numbers (
id serial NOT NULL ,
serial_number bytea NOT NULL ,
bucket_id bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
expires_at timestamp with time zone NOT NULL ,
2019-03-26 10:34:30 +00:00
PRIMARY KEY ( id )
2019-11-19 20:52:57 +00:00
) ; ` ,
` CREATE INDEX serial_numbers_expires_at_index ON serial_numbers ( expires_at ); ` ,
2019-03-26 10:34:30 +00:00
` CREATE UNIQUE INDEX serial_number_index ON serial_numbers ( serial_number ) ` ,
2019-11-19 20:52:57 +00:00
2019-03-22 18:54:22 +00:00
` CREATE TABLE storagenode_bandwidth_rollups (
storagenode_id bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
interval_start timestamp with time zone NOT NULL ,
2019-03-22 18:54:22 +00:00
interval_seconds integer NOT NULL ,
action integer NOT NULL ,
2020-08-26 16:06:44 +01:00
allocated bigint DEFAULT 0 ,
2019-03-22 18:54:22 +00:00
settled bigint NOT NULL ,
2019-03-26 10:34:30 +00:00
PRIMARY KEY ( storagenode_id , interval_start , action )
2019-05-13 16:53:52 +01:00
) ; ` ,
2019-05-16 15:11:15 +01:00
2020-08-26 16:06:44 +01:00
` CREATE TABLE storagenode_storage_tallies (
2019-05-16 15:11:15 +01:00
node_id bytea NOT NULL ,
2019-11-19 20:52:57 +00:00
interval_end_time timestamp with time zone NOT NULL ,
data_total double precision NOT NULL ,
2020-08-26 16:06:44 +01:00
CONSTRAINT storagenode_storage_tallies_pkey PRIMARY KEY ( interval_end_time , node_id )
) ; ` ,
` CREATE INDEX storagenode_storage_tallies_node_id_index ON storagenode_storage_tallies ( node_id ); ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE users (
id bytea NOT NULL ,
full_name text NOT NULL ,
short_name text ,
email text NOT NULL ,
password_hash bytea NOT NULL ,
status integer NOT NULL ,
2019-06-13 14:52:33 +01:00
created_at timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
partner_id bytea ,
normalized_email text NOT NULL ,
2019-06-13 14:52:33 +01:00
PRIMARY KEY ( id )
) ; ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE value_attributions (
bucket_name bytea NOT NULL ,
partner_id bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
last_updated timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
project_id bytea NOT NULL ,
PRIMARY KEY ( project_id , bucket_name )
) ; ` ,
` CREATE TABLE api_keys (
id bytea NOT NULL ,
project_id bytea NOT NULL REFERENCES projects ( id ) ON DELETE CASCADE ,
head bytea NOT NULL UNIQUE ,
name text NOT NULL ,
secret bytea NOT NULL ,
created_at timestamp with time zone NOT NULL ,
partner_id bytea ,
PRIMARY KEY ( id ) ,
UNIQUE ( name , project_id )
) ; ` ,
2019-07-03 23:03:56 +01:00
` CREATE TABLE bucket_metainfos (
2019-07-01 21:45:21 +01:00
id bytea NOT NULL ,
project_id bytea NOT NULL REFERENCES projects ( id ) ,
name bytea NOT NULL ,
path_cipher integer NOT NULL ,
2019-07-03 23:03:56 +01:00
created_at timestamp with time zone NOT NULL ,
2019-07-01 21:45:21 +01:00
default_segment_size integer NOT NULL ,
default_encryption_cipher_suite integer NOT NULL ,
default_encryption_block_size integer NOT NULL ,
default_redundancy_algorithm integer NOT NULL ,
default_redundancy_share_size integer NOT NULL ,
default_redundancy_required_shares integer NOT NULL ,
default_redundancy_repair_shares integer NOT NULL ,
default_redundancy_optimal_shares integer NOT NULL ,
default_redundancy_total_shares integer NOT NULL ,
2019-11-19 20:52:57 +00:00
partner_id bytea ,
2019-07-01 21:45:21 +01:00
PRIMARY KEY ( id ) ,
UNIQUE ( name , project_id )
) ; ` ,
2019-11-19 20:52:57 +00:00
` CREATE TABLE project_invoice_stamps (
project_id bytea NOT NULL REFERENCES projects ( id ) ON DELETE CASCADE ,
invoice_id bytea NOT NULL UNIQUE ,
start_date timestamp with time zone NOT NULL ,
end_date timestamp with time zone NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( project_id , start_date , end_date )
) ; ` ,
` CREATE TABLE project_members (
member_id bytea NOT NULL REFERENCES users ( id ) ON DELETE CASCADE ,
2019-07-10 21:29:26 +01:00
project_id bytea NOT NULL REFERENCES projects ( id ) ON DELETE CASCADE ,
created_at timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
PRIMARY KEY ( member_id , project_id )
) ; ` ,
` CREATE TABLE used_serials (
serial_number_id integer NOT NULL REFERENCES serial_numbers ( id ) ON DELETE CASCADE ,
storage_node_id bytea NOT NULL ,
PRIMARY KEY ( serial_number_id , storage_node_id )
) ; ` ,
` CREATE TABLE user_credits (
id serial NOT NULL ,
user_id bytea NOT NULL REFERENCES users ( id ) ON DELETE CASCADE ,
offer_id integer NOT NULL REFERENCES offers ( id ) ,
referred_by bytea REFERENCES users ( id ) ON DELETE SET NULL ,
credits_earned_in_cents integer NOT NULL ,
credits_used_in_cents integer NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
created_at timestamp with time zone NOT NULL ,
type text NOT NULL ,
2020-08-26 16:06:44 +01:00
PRIMARY KEY ( id ) ,
UNIQUE ( id , offer_id )
2019-07-10 21:29:26 +01:00
) ; ` ,
2019-11-19 20:52:57 +00:00
` CREATE UNIQUE INDEX credits_earned_user_id_offer_id ON user_credits (id, offer_id); ` ,
2019-07-12 15:19:38 +01:00
` INSERT INTO offers (
2019-12-11 23:49:57 +00:00
id ,
2019-07-12 15:19:38 +01:00
name ,
description ,
award_credit_in_cents ,
invitee_credit_in_cents ,
expires_at ,
created_at ,
status ,
2019-11-19 20:52:57 +00:00
type ,
award_credit_duration_days ,
invitee_credit_duration_days
)
2019-07-12 15:19:38 +01:00
VALUES (
2019-12-11 23:49:57 +00:00
1 ,
2019-07-12 15:19:38 +01:00
' Default referral offer ' ,
' Is active when no other active referral offer ' ,
300 ,
600 ,
' 2119 - 03 - 14 0 8 : 28 : 24.636949 + 00 ' ,
' 2019 - 07 - 14 0 8 : 28 : 24.636949 + 00 ' ,
1 ,
2019-11-19 20:52:57 +00:00
2 ,
365 ,
14
2019-07-12 15:19:38 +01:00
) ,
(
2019-12-11 23:49:57 +00:00
2 ,
2019-07-12 15:19:38 +01:00
' Default free credit offer ' ,
' Is active when no active free credit offer ' ,
0 ,
2019-11-19 20:52:57 +00:00
300 ,
2019-07-12 15:19:38 +01:00
' 2119 - 03 - 14 0 8 : 28 : 24.636949 + 00 ' ,
' 2019 - 07 - 14 0 8 : 28 : 24.636949 + 00 ' ,
1 ,
2019-11-19 20:52:57 +00:00
1 ,
NULL ,
14
2019-07-12 15:19:38 +01:00
) ON CONFLICT DO NOTHING ; ` ,
2019-08-07 13:28:13 +01:00
2019-09-13 17:57:32 +01:00
` CREATE TABLE graceful_exit_progress (
node_id bytea NOT NULL ,
bytes_transferred bigint NOT NULL ,
2020-08-26 16:06:44 +01:00
updated_at timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
pieces_transferred bigint NOT NULL DEFAULT 0 ,
pieces_failed bigint NOT NULL DEFAULT 0 ,
2019-09-13 17:57:32 +01:00
PRIMARY KEY ( node_id )
) ; ` ,
2019-11-19 20:52:57 +00:00
2019-09-13 17:57:32 +01:00
` CREATE TABLE graceful_exit_transfer_queue (
node_id bytea NOT NULL ,
path bytea NOT NULL ,
piece_num integer NOT NULL ,
durability_ratio double precision NOT NULL ,
2020-08-26 16:06:44 +01:00
queued_at timestamp with time zone NOT NULL ,
requested_at timestamp with time zone ,
last_failed_at timestamp with time zone ,
2019-09-13 17:57:32 +01:00
last_failed_code integer ,
failed_count integer ,
2020-08-26 16:06:44 +01:00
finished_at timestamp with time zone ,
2019-11-22 19:59:46 +00:00
root_piece_id bytea ,
order_limit_send_count integer NOT NULL DEFAULT 0 ,
2019-11-19 20:52:57 +00:00
PRIMARY KEY ( node_id , path , piece_num )
2019-09-13 17:57:32 +01:00
) ; ` ,
2019-11-19 20:52:57 +00:00
2019-10-10 18:12:23 +01:00
` CREATE TABLE stripe_customers (
user_id bytea NOT NULL ,
2019-11-19 20:52:57 +00:00
customer_id text NOT NULL UNIQUE ,
2019-10-10 18:12:23 +01:00
created_at timestamp with time zone NOT NULL ,
2019-11-19 20:52:57 +00:00
PRIMARY KEY ( user_id )
2019-10-10 18:12:23 +01:00
) ; ` ,
2019-11-19 20:52:57 +00:00
2019-11-05 13:16:02 +00:00
` CREATE TABLE stripecoinpayments_invoice_project_records (
id bytea NOT NULL ,
project_id bytea NOT NULL ,
storage double precision NOT NULL ,
egress bigint NOT NULL ,
objects bigint NOT NULL ,
period_start timestamp with time zone NOT NULL ,
period_end timestamp with time zone NOT NULL ,
state integer NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id ) ,
UNIQUE ( project_id , period_start , period_end )
) ; ` ,
2019-11-15 14:59:39 +00:00
` CREATE TABLE stripecoinpayments_tx_conversion_rates (
tx_id text NOT NULL ,
rate bytea NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( tx_id )
) ; ` ,
2019-11-22 19:59:46 +00:00
2019-11-15 14:59:39 +00:00
` CREATE TABLE coinpayments_transactions (
id text NOT NULL ,
user_id bytea NOT NULL ,
address text NOT NULL ,
amount bytea NOT NULL ,
received bytea NOT NULL ,
status integer NOT NULL ,
key text NOT NULL ,
timeout integer NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
2019-11-22 19:59:46 +00:00
` CREATE TABLE stripecoinpayments_apply_balance_intents (
tx_id text NOT NULL REFERENCES coinpayments_transactions ( id ) ON DELETE CASCADE ,
state integer NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( tx_id )
) ; ` ,
2020-08-26 16:06:44 +01:00
2019-12-27 22:03:03 +00:00
` CREATE TABLE nodes_offline_times (
node_id bytea NOT NULL ,
tracked_at timestamp with time zone NOT NULL ,
seconds integer NOT NULL ,
PRIMARY KEY ( node_id , tracked_at )
) ; ` ,
` CREATE INDEX nodes_offline_times_node_id_index ON nodes_offline_times ( node_id ); ` ,
2020-08-26 16:06:44 +01:00
2020-01-07 10:41:19 +00:00
` CREATE TABLE coupons (
id bytea NOT NULL ,
project_id bytea NOT NULL ,
user_id bytea NOT NULL ,
amount bigint NOT NULL ,
description text NOT NULL ,
type integer NOT NULL ,
status integer NOT NULL ,
duration bigint NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
` CREATE TABLE coupon_usages (
coupon_id bytea NOT NULL ,
amount bigint NOT NULL ,
status integer NOT NULL ,
period timestamp with time zone NOT NULL ,
PRIMARY KEY ( coupon_id , period )
) ; ` ,
2020-08-26 16:06:44 +01:00
2020-01-15 21:45:17 +00:00
` CREATE TABLE reported_serials (
2020-01-16 18:02:15 +00:00
expires_at timestamp with time zone NOT NULL ,
2020-01-15 21:45:17 +00:00
storage_node_id bytea NOT NULL ,
bucket_id bytea NOT NULL ,
action integer NOT NULL ,
serial_number bytea NOT NULL ,
settled bigint NOT NULL ,
2020-01-16 18:02:15 +00:00
observed_at timestamp with time zone NOT NULL ,
2020-01-15 21:45:17 +00:00
PRIMARY KEY ( expires_at , storage_node_id , bucket_id , action , serial_number )
) ; ` ,
2020-08-26 16:06:44 +01:00
2020-01-24 13:38:53 +00:00
` CREATE TABLE credits (
user_id bytea NOT NULL ,
transaction_id text NOT NULL ,
amount bigint NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( transaction_id )
) ; ` ,
2020-08-26 16:06:44 +01:00
2020-01-24 13:38:53 +00:00
` CREATE TABLE credits_spendings (
id bytea NOT NULL ,
user_id bytea NOT NULL ,
project_id bytea NOT NULL ,
amount bigint NOT NULL ,
status int NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
2020-08-26 16:06:44 +01:00
2020-02-14 00:03:41 +00:00
` CREATE TABLE consumed_serials (
storage_node_id bytea NOT NULL ,
serial_number bytea NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( storage_node_id , serial_number )
) ; ` ,
2020-08-26 16:06:44 +01:00
` CREATE INDEX consumed_serials_expires_at_index ON consumed_serials ( expires_at ); ` ,
2020-02-14 00:03:41 +00:00
` CREATE TABLE pending_serial_queue (
storage_node_id bytea NOT NULL ,
bucket_id bytea NOT NULL ,
serial_number bytea NOT NULL ,
action integer NOT NULL ,
settled bigint NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( storage_node_id , bucket_id , serial_number )
) ; ` ,
2020-08-26 16:06:44 +01:00
2020-02-18 19:52:18 +00:00
` CREATE TABLE storagenode_payments (
id bigserial NOT NULL ,
created_at timestamp with time zone NOT NULL ,
node_id bytea NOT NULL ,
2020-08-26 16:06:44 +01:00
period text NOT NULL ,
2020-02-18 19:52:18 +00:00
amount bigint NOT NULL ,
receipt text ,
notes text ,
PRIMARY KEY ( id )
) ; ` ,
` CREATE INDEX storagenode_payments_node_id_period_index ON storagenode_payments ( node_id, period ); ` ,
2020-08-26 16:06:44 +01:00
2020-02-18 19:52:18 +00:00
` CREATE TABLE storagenode_paystubs (
period text NOT NULL ,
node_id bytea NOT NULL ,
created_at timestamp with time zone NOT NULL ,
codes text NOT NULL ,
usage_at_rest double precision NOT NULL ,
usage_get bigint NOT NULL ,
usage_put bigint NOT NULL ,
usage_get_repair bigint NOT NULL ,
usage_put_repair bigint NOT NULL ,
usage_get_audit bigint NOT NULL ,
comp_at_rest bigint NOT NULL ,
comp_get bigint NOT NULL ,
comp_put bigint NOT NULL ,
comp_get_repair bigint NOT NULL ,
comp_put_repair bigint NOT NULL ,
comp_get_audit bigint NOT NULL ,
surge_percent bigint NOT NULL ,
held bigint NOT NULL ,
owed bigint NOT NULL ,
disposed bigint NOT NULL ,
paid bigint NOT NULL ,
PRIMARY KEY ( period , node_id )
) ; ` ,
` CREATE INDEX storagenode_paystubs_node_id_index ON storagenode_paystubs ( node_id ); ` ,
2020-04-01 22:58:46 +01:00
} ,
} ,
2020-04-17 14:04:29 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-04-17 14:04:29 +01:00
Description : "Add missing bucket_bandwidth_rollups_action_interval_project_id_index index" ,
Version : 104 ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS bucket_bandwidth_rollups_action_interval_project_id_index ON bucket_bandwidth_rollups(action, interval_start, project_id ); ` ,
} ,
} ,
2020-04-14 17:49:45 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-04-14 17:49:45 +01:00
Description : "Remove all nodes from suspension mode." ,
Version : 105 ,
Action : migrate . SQL {
` UPDATE nodes SET suspended=NULL; ` ,
} ,
} ,
2020-05-01 14:24:12 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-01 14:24:12 +01:00
Description : "Add project_bandwidth_rollup table and populate with current months data" ,
Version : 106 ,
Action : migrate . SQL {
` CREATE TABLE IF NOT EXISTS project_bandwidth_rollups (
project_id bytea NOT NULL ,
interval_month date NOT NULL ,
egress_allocated bigint NOT NULL ,
PRIMARY KEY ( project_id , interval_month )
) ;
INSERT INTO project_bandwidth_rollups ( project_id , interval_month , egress_allocated ) (
2020-05-11 20:31:49 +01:00
SELECT project_id , date_trunc ( ' MONTH ' , now ( ) ) : : DATE , sum ( allocated ) : : bigint FROM bucket_bandwidth_rollups
2020-05-01 14:24:12 +01:00
WHERE action = 2 AND interval_start >= date_trunc ( ' MONTH ' , now ( ) ) : : timestamp group by project_id )
ON CONFLICT ( project_id , interval_month ) DO UPDATE SET egress_allocated = EXCLUDED . egress_allocated : : bigint ; ` ,
} ,
} ,
2020-05-12 14:01:15 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-12 14:01:15 +01:00
Description : "add separate bandwidth column" ,
Version : 107 ,
2020-05-12 16:27:07 +01:00
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN bandwidth_limit bigint NOT NULL DEFAULT 0; ` ,
} ,
2020-05-12 14:01:15 +01:00
} ,
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-12 14:01:15 +01:00
Description : "backfill bandwidth column with previous limits" ,
Version : 108 ,
2020-06-25 12:23:39 +01:00
SeparateTx : true ,
Action : migrate . SQL {
` UPDATE projects SET bandwidth_limit = usage_limit; ` ,
} ,
2020-05-12 14:01:15 +01:00
} ,
2020-05-12 09:46:48 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-12 09:46:48 +01:00
Description : "add period column to the credits_spendings table (step 1)" ,
Version : 109 ,
2020-06-26 09:41:55 +01:00
SeparateTx : true ,
2020-06-25 12:23:39 +01:00
Action : migrate . SQL {
` ALTER TABLE credits_spendings ADD COLUMN period timestamp with time zone; ` ,
} ,
2020-05-12 09:46:48 +01:00
} ,
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-12 09:46:48 +01:00
Description : "add period column to the credits_spendings table (step 2)" ,
Version : 110 ,
2020-06-25 12:23:39 +01:00
SeparateTx : true ,
Action : migrate . SQL {
` UPDATE credits_spendings SET period = 'epoch'; ` ,
} ,
2020-05-12 09:46:48 +01:00
} ,
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-12 09:46:48 +01:00
Description : "add period column to the credits_spendings table (step 3)" ,
Version : 111 ,
2020-06-26 09:41:55 +01:00
SeparateTx : true ,
2020-06-25 12:23:39 +01:00
Action : migrate . SQL {
` ALTER TABLE credits_spendings ALTER COLUMN period SET NOT NULL; ` ,
} ,
2020-05-12 09:46:48 +01:00
} ,
2020-05-11 20:35:48 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-05-11 20:35:48 +01:00
Description : "fix incorrect calculations on backported paystub data" ,
Version : 112 ,
Action : migrate . SQL { `
UPDATE storagenode_paystubs SET
comp_at_rest = (
( ( owed + held - disposed ) : : float / GREATEST ( surge_percent : : float / 100 , 1 ) ) : : int
- comp_get - comp_get_repair - comp_get_audit
)
WHERE
(
abs (
( ( owed + held - disposed ) : : float / GREATEST ( surge_percent : : float / 100 , 1 ) ) : : int
- comp_get - comp_get_repair - comp_get_audit
) >= 10
OR comp_at_rest < 0
)
2022-02-22 14:41:20 +00:00
AND codes NOT LIKE ' % O % '
AND codes NOT LIKE ' % D % '
2020-05-11 20:35:48 +01:00
AND period < ' 2020 - 03 '
` } ,
} ,
2020-06-02 09:33:07 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-06-02 09:33:07 +01:00
Description : "drop project_id column from coupon table" ,
Version : 113 ,
Action : migrate . SQL {
` ALTER TABLE coupons DROP COLUMN project_id; ` ,
} ,
} ,
2020-06-09 22:49:12 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-06-09 22:49:12 +01:00
Description : "add new columns for suspension to node tables" ,
Version : 114 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN unknown_audit_suspended TIMESTAMP WITH TIME ZONE; ` ,
` ALTER TABLE nodes ADD COLUMN offline_suspended TIMESTAMP WITH TIME ZONE; ` ,
` ALTER TABLE nodes ADD COLUMN under_review TIMESTAMP WITH TIME ZONE; ` ,
} ,
} ,
2020-06-03 14:51:02 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-06-03 14:51:02 +01:00
Description : "add revocations database" ,
Version : 115 ,
Action : migrate . SQL { `
CREATE TABLE revocations (
revoked bytea NOT NULL ,
api_key_id bytea NOT NULL ,
PRIMARY KEY ( revoked )
) ;
` } ,
} ,
2020-06-30 16:45:27 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-06-30 16:45:27 +01:00
Description : "add audit histories database" ,
Version : 116 ,
Action : migrate . SQL {
` CREATE TABLE audit_histories (
2020-07-01 16:25:20 +01:00
node_id bytea NOT NULL ,
history bytea NOT NULL ,
PRIMARY KEY ( node_id )
2020-06-30 16:45:27 +01:00
) ; ` ,
} ,
} ,
2020-07-01 16:25:20 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-07-01 16:25:20 +01:00
Description : "add node_api_versions table" ,
Version : 117 ,
Action : migrate . SQL { `
CREATE TABLE node_api_versions (
id bytea NOT NULL ,
api_version integer NOT NULL ,
created_at timestamp with time zone NOT NULL ,
updated_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ;
` } ,
} ,
2020-06-30 22:49:29 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-06-30 22:49:29 +01:00
Description : "add max_buckets field to projects and an implicit index on bucket_metainfos project_id,name" ,
SeparateTx : true ,
Version : 118 ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN max_buckets INTEGER NOT NULL DEFAULT 0; ` ,
` ALTER TABLE bucket_metainfos ADD UNIQUE (project_id, name); ` ,
} ,
} ,
2020-07-15 16:14:09 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-07-15 16:14:09 +01:00
Description : "add project_limit field to users table" ,
Version : 119 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN project_limit INTEGER NOT NULL DEFAULT 0; ` ,
} ,
} ,
2020-07-15 17:49:37 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-07-15 17:49:37 +01:00
Description : "back fill user project limits from existing registration tokens" ,
Version : 120 ,
SeparateTx : true ,
Action : migrate . SQL {
` UPDATE users SET project_limit = registration_tokens.project_limit FROM registration_tokens WHERE users.id = registration_tokens.owner_id; ` ,
} ,
} ,
2020-07-23 13:36:56 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-07-23 13:36:56 +01:00
Description : "drop tables related to credits (old deposit bonuses)" ,
Version : 121 ,
Action : migrate . SQL {
` DROP TABLE credits; ` ,
` DROP TABLE credits_spendings; ` ,
} ,
} ,
2020-08-10 13:02:44 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-08-10 13:02:44 +01:00
Description : "drop project_invoice_stamps table" ,
Version : 122 ,
Action : migrate . SQL {
` DROP TABLE project_invoice_stamps; ` ,
} ,
} ,
2020-08-28 20:43:53 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-08-28 20:43:53 +01:00
Description : "drop project_invoice_stamps table" ,
Version : 123 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN online_score double precision NOT NULL DEFAULT 1; ` ,
} ,
} ,
2020-09-08 21:55:32 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-09-08 21:55:32 +01:00
Description : "add column and index updated_at to injuredsegments" ,
Version : 124 ,
Action : migrate . SQL {
` ALTER TABLE injuredsegments ADD COLUMN updated_at timestamp with time zone NOT NULL DEFAULT current_timestamp; ` ,
` CREATE INDEX injuredsegments_updated_at_index ON injuredsegments ( updated_at ); ` ,
} ,
} ,
2020-09-06 00:02:12 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-09-06 00:02:12 +01:00
Description : "make limit columns nullable" ,
Version : 125 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE projects ALTER COLUMN max_buckets DROP NOT NULL; ` ,
2020-09-23 15:59:04 +01:00
` ALTER TABLE projects ALTER COLUMN max_buckets SET DEFAULT 100; ` ,
2020-09-06 00:02:12 +01:00
` ALTER TABLE projects ALTER COLUMN usage_limit DROP NOT NULL; ` ,
2020-09-23 15:59:04 +01:00
` ALTER TABLE projects ALTER COLUMN usage_limit SET DEFAULT 50000000000; ` ,
2020-09-06 00:02:12 +01:00
` ALTER TABLE projects ALTER COLUMN bandwidth_limit DROP NOT NULL; ` ,
2020-09-23 15:59:04 +01:00
` ALTER TABLE projects ALTER COLUMN bandwidth_limit SET DEFAULT 50000000000; ` ,
2020-09-06 00:02:12 +01:00
} ,
} ,
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-09-06 00:02:12 +01:00
Description : "set 0 limits back to default" ,
Version : 126 ,
Action : migrate . SQL {
2020-09-23 15:59:04 +01:00
` UPDATE projects SET max_buckets = 100 WHERE max_buckets = 0; ` ,
` UPDATE projects SET usage_limit = 50000000000 WHERE usage_limit = 0; ` ,
` UPDATE projects SET bandwidth_limit = 50000000000 WHERE bandwidth_limit = 0; ` ,
2020-09-06 00:02:12 +01:00
} ,
} ,
2020-09-23 16:02:50 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-09-23 16:02:50 +01:00
Description : "enable multiple projects for existing users" ,
Version : 127 ,
Action : migrate . SQL {
2022-02-22 14:41:20 +00:00
` UPDATE users SET project_limit=0 WHERE project_limit <= 10 AND project_limit > 0; ` ,
2020-09-23 16:02:50 +01:00
} ,
} ,
2020-10-06 13:50:29 +01:00
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-10-06 13:50:29 +01:00
Description : "drop default values for project limits" ,
Version : 128 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE projects ALTER COLUMN max_buckets DROP DEFAULT; ` ,
` ALTER TABLE projects ALTER COLUMN usage_limit DROP DEFAULT; ` ,
` ALTER TABLE projects ALTER COLUMN bandwidth_limit DROP DEFAULT; ` ,
} ,
} ,
{
2020-10-09 13:35:34 +01:00
DB : & db . migrationDB ,
2020-10-06 13:50:29 +01:00
Description : "reset everyone with default rate limits to NULL" ,
Version : 129 ,
SeparateTx : true ,
Action : migrate . SQL {
` UPDATE projects SET max_buckets = NULL WHERE max_buckets <= 100; ` ,
` UPDATE projects SET usage_limit = NULL WHERE usage_limit <= 50000000000; ` ,
` UPDATE projects SET bandwidth_limit = NULL WHERE bandwidth_limit <= 50000000000; ` ,
} ,
} ,
Add index to graceful_exit_transfer_queue table
This fixes a slow query that was taking up to 4 seconds in production
SELECT node_id, path, piece_num, root_piece_id, durability_ratio, queued_at, requested_at, last_failed_at, last_failed_code, failed_count, finished_at, order_limit_send_count
FROM graceful_exit_transfer_queue
WHERE node_id = '[redacted]'
AND finished_at is NULL
AND last_failed_at is NULL
ORDER BY durability_ratio asc, queued_at asc LIMIT 300 OFFSET 0;
Change-Id: Ib89743ca35f1d8d0a1456b20fa08c683ebdc1549
2020-10-23 18:54:45 +01:00
{
DB : & db . migrationDB ,
Description : "add index for the gracefule exit transfer queue" ,
Version : 130 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS graceful_exit_transfer_queue_nid_dr_qa_fa_lfa_index ON graceful_exit_transfer_queue ( node_id, durability_ratio, queued_at, finished_at, last_failed_at ); ` ,
} ,
} ,
2020-11-12 19:01:55 +00:00
{
DB : & db . migrationDB ,
Description : "create table storagenode_bandwidth_rollups_phase2" ,
Version : 131 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE TABLE storagenode_bandwidth_rollups_phase2 (
storagenode_id bytea NOT NULL ,
interval_start timestamp with time zone NOT NULL ,
interval_seconds integer NOT NULL ,
action integer NOT NULL ,
allocated bigint DEFAULT 0 ,
settled bigint NOT NULL ,
PRIMARY KEY ( storagenode_id , interval_start , action )
) ; ` ,
} ,
} ,
2020-10-21 23:02:54 +01:00
{
DB : & db . migrationDB ,
Description : "add injuredsegments.segment_health" ,
Version : 132 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE injuredsegments ADD COLUMN segment_health double precision NOT NULL DEFAULT 1; ` ,
` CREATE INDEX injuredsegments_segment_health_index ON injuredsegments ( segment_health ); ` ,
} ,
} ,
2020-11-04 17:24:11 +00:00
{
DB : & db . migrationDB ,
Description : "Use node_id and start_time for accounting_rollups pkey instead of autogenerated id" ,
Version : 133 ,
SeparateTx : true ,
Action : migrate . Func ( func ( ctx context . Context , log * zap . Logger , db tagsql . DB , tx tagsql . Tx ) error {
if _ , ok := db . Driver ( ) . ( * cockroachutil . Driver ) ; ok {
_ , err := db . Exec ( ctx ,
` ALTER TABLE accounting_rollups RENAME TO accounting_rollups_original; ` ,
)
if err != nil {
return ErrMigrate . Wrap ( err )
}
_ , err = db . Exec ( ctx ,
` CREATE TABLE accounting_rollups (
node_id bytea NOT NULL ,
start_time timestamp with time zone NOT NULL ,
put_total bigint NOT NULL ,
get_total bigint NOT NULL ,
get_audit_total bigint NOT NULL ,
get_repair_total bigint NOT NULL ,
put_repair_total bigint NOT NULL ,
at_rest_total double precision NOT NULL ,
PRIMARY KEY ( node_id , start_time )
) ;
CREATE INDEX accounting_rollups_start_time_index ON accounting_rollups ( start_time ) ;
INSERT INTO accounting_rollups (
node_id , start_time , put_total , get_total , get_audit_total , get_repair_total , put_repair_total , at_rest_total
)
SELECT node_id ,
start_time ,
SUM ( put_total ) : : bigint ,
SUM ( get_total ) : : bigint ,
SUM ( get_audit_total ) : : bigint ,
SUM ( get_repair_total ) : : bigint ,
SUM ( put_repair_total ) : : bigint ,
SUM ( at_rest_total )
FROM accounting_rollups_original
GROUP BY node_id , start_time ;
DROP TABLE accounting_rollups_original ; ` ,
)
if err != nil {
return ErrMigrate . Wrap ( err )
}
return nil
}
_ , err := db . Exec ( ctx ,
` CREATE TABLE accounting_rollups_new (
node_id bytea NOT NULL ,
start_time timestamp with time zone NOT NULL ,
put_total bigint NOT NULL ,
get_total bigint NOT NULL ,
get_audit_total bigint NOT NULL ,
get_repair_total bigint NOT NULL ,
put_repair_total bigint NOT NULL ,
at_rest_total double precision NOT NULL ,
PRIMARY KEY ( node_id , start_time )
) ;
DROP INDEX accounting_rollups_start_time_index ;
CREATE INDEX accounting_rollups_start_time_index ON accounting_rollups_new ( start_time ) ;
INSERT INTO accounting_rollups_new (
node_id , start_time , put_total , get_total , get_audit_total , get_repair_total , put_repair_total , at_rest_total
)
SELECT node_id ,
start_time ,
SUM ( put_total ) ,
SUM ( get_total ) ,
SUM ( get_audit_total ) ,
SUM ( get_repair_total ) ,
SUM ( put_repair_total ) ,
SUM ( at_rest_total )
FROM accounting_rollups
GROUP BY node_id , start_time ;
DROP TABLE accounting_rollups ;
ALTER INDEX accounting_rollups_new_pkey RENAME TO accounting_rollups_pkey ;
ALTER TABLE accounting_rollups_new RENAME TO accounting_rollups ; ` ,
)
if err != nil {
return ErrMigrate . Wrap ( err )
}
return nil
} ) ,
} ,
2020-12-14 21:28:04 +00:00
{
DB : & db . migrationDB ,
Description : "drop num_healthy_pieces column from injuredsegments" ,
Version : 134 ,
Action : migrate . SQL {
` ALTER TABLE injuredsegments DROP COLUMN num_healthy_pieces; ` ,
} ,
} ,
2020-12-21 15:37:01 +00:00
{
DB : & db . migrationDB ,
Description : "create new index on storagenode_bandwidth_rollups to improve get nodes since query." ,
Version : 135 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS storagenode_bandwidth_rollups_interval_start_index ON storagenode_bandwidth_rollups ( interval_start ); ` ,
} ,
} ,
2020-12-21 16:42:00 +00:00
{
DB : & db . migrationDB ,
Description : "create new index on bucket_storage_tallies to improve get tallies by project ID." ,
Version : 136 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS bucket_storage_tallies_project_id_index ON bucket_storage_tallies (project_id); ` ,
} ,
} ,
2020-12-21 17:48:48 +00:00
{
DB : & db . migrationDB ,
Description : "create new index on nodes to improve queries using disqualified, unknown_audit_suspended, exit_finished_at, and last_contact_success." ,
Version : 137 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS nodes_dis_unk_exit_fin_last_success_index ON nodes(disqualified, unknown_audit_suspended, exit_finished_at, last_contact_success); ` ,
} ,
} ,
2020-12-02 19:29:36 +00:00
{
DB : & db . migrationDB ,
Description : "drop node_offline_times table" ,
Version : 138 ,
SeparateTx : true ,
Action : migrate . SQL {
` DROP TABLE nodes_offline_times; ` ,
} ,
} ,
2020-12-17 19:54:37 +00:00
{
DB : & db . migrationDB ,
Description : "set default on uptime count columns" ,
Version : 139 ,
Action : migrate . SQL {
` ALTER TABLE nodes ALTER COLUMN uptime_success_count SET DEFAULT 0; ` ,
` ALTER TABLE nodes ALTER COLUMN total_uptime_count SET DEFAULT 0; ` ,
} ,
} ,
2021-01-26 16:38:53 +00:00
{
DB : & db . migrationDB ,
2021-02-03 03:44:40 +00:00
Description : "add distributed column to storagenode_paystubs table" ,
2021-01-26 16:38:53 +00:00
Version : 140 ,
2021-02-03 03:44:40 +00:00
Action : migrate . Func ( func ( ctx context . Context , log * zap . Logger , db tagsql . DB , tx tagsql . Tx ) error {
_ , err := db . Exec ( ctx , `
ALTER TABLE storagenode_paystubs ADD COLUMN distributed BIGINT ;
` )
if err != nil {
return ErrMigrate . Wrap ( err )
}
_ , err = db . Exec ( ctx , `
UPDATE storagenode_paystubs ps
SET distributed = coalesce ( (
SELECT sum ( amount ) : : bigint
FROM storagenode_payments pm
WHERE pm . period = ps . period
AND pm . node_id = ps . node_id
) , 0 ) ;
` )
if err != nil {
return ErrMigrate . Wrap ( err )
}
_ , err = db . Exec ( ctx , `
ALTER TABLE storagenode_paystubs ALTER COLUMN distributed SET NOT NULL ;
` )
if err != nil {
return ErrMigrate . Wrap ( err )
}
return nil
} ) ,
} ,
{
DB : & db . migrationDB ,
Description : "add columns for professional users" ,
Version : 141 ,
2021-01-26 16:38:53 +00:00
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN position text; ` ,
` ALTER TABLE users ADD COLUMN company_name text; ` ,
` ALTER TABLE users ADD COLUMN working_on text; ` ,
` ALTER TABLE users ADD COLUMN company_size int; ` ,
` ALTER TABLE users ADD COLUMN is_professional boolean NOT NULL DEFAULT false; ` ,
} ,
} ,
2021-01-27 20:40:47 +00:00
{
DB : & db . migrationDB ,
Description : "drop the obsolete (name, project_id) index from bucket_metainfos table." ,
2021-02-03 03:44:40 +00:00
Version : 142 ,
2021-01-27 20:40:47 +00:00
Action : migrate . Func ( func ( ctx context . Context , log * zap . Logger , db tagsql . DB , tx tagsql . Tx ) error {
if _ , ok := db . Driver ( ) . ( * cockroachutil . Driver ) ; ok {
_ , err := db . Exec ( ctx ,
` DROP INDEX bucket_metainfos_name_project_id_key CASCADE; ` ,
)
if err != nil {
return ErrMigrate . Wrap ( err )
}
return nil
}
_ , err := db . Exec ( ctx ,
` ALTER TABLE bucket_metainfos DROP CONSTRAINT bucket_metainfos_name_project_id_key; ` ,
)
if err != nil {
return ErrMigrate . Wrap ( err )
}
return nil
} ) ,
} ,
2020-11-30 19:34:42 +00:00
{
DB : & db . migrationDB ,
Description : "add storagenode_bandwidth_rollups_archives and bucket_bandwidth_rollup_archives" ,
2021-02-03 03:44:40 +00:00
Version : 143 ,
2020-11-30 19:34:42 +00:00
SeparateTx : true ,
2021-04-28 14:22:54 +01:00
Action : migrate . SQL {
`
2021-02-03 03:44:40 +00:00
CREATE TABLE storagenode_bandwidth_rollup_archives (
storagenode_id bytea NOT NULL ,
interval_start timestamp with time zone NOT NULL ,
interval_seconds integer NOT NULL ,
action integer NOT NULL ,
allocated bigint DEFAULT 0 ,
settled bigint NOT NULL ,
PRIMARY KEY ( storagenode_id , interval_start , action )
) ; ` ,
2020-11-30 19:34:42 +00:00
` CREATE TABLE bucket_bandwidth_rollup_archives (
2021-02-03 03:44:40 +00:00
bucket_name bytea NOT NULL ,
project_id bytea NOT NULL ,
interval_start timestamp with time zone NOT NULL ,
interval_seconds integer NOT NULL ,
action integer NOT NULL ,
inline bigint NOT NULL ,
allocated bigint NOT NULL ,
settled bigint NOT NULL ,
PRIMARY KEY ( bucket_name , project_id , interval_start , action )
) ; ` ,
2020-11-30 19:34:42 +00:00
` CREATE INDEX bucket_bandwidth_rollups_archive_project_id_action_interval_index ON bucket_bandwidth_rollup_archives ( project_id, action, interval_start ); ` ,
` CREATE INDEX bucket_bandwidth_rollups_archive_action_interval_project_id_index ON bucket_bandwidth_rollup_archives ( action, interval_start, project_id ); ` ,
` CREATE INDEX storagenode_bandwidth_rollup_archives_interval_start_index ON storagenode_bandwidth_rollup_archives (interval_start); ` ,
} ,
} ,
2021-01-22 13:51:29 +00:00
{
DB : & db . migrationDB ,
Description : "delete deprecated and unused serial tables" ,
Version : 144 ,
Action : migrate . SQL {
` DROP TABLE used_serials; ` ,
` DROP TABLE reported_serials; ` ,
` DROP TABLE pending_serial_queue; ` ,
` DROP TABLE serial_numbers; ` ,
` DROP TABLE consumed_serials; ` ,
} ,
} ,
2021-01-05 19:39:08 +00:00
{
DB : & db . migrationDB ,
Description : "create new index on bucket_storage_tallies to improve get tallies by project ID and bucket name lookups by time interval. This replaces bucket_storage_tallies_project_id_index." ,
Version : 145 ,
SeparateTx : true ,
Action : migrate . SQL {
`
CREATE INDEX IF NOT EXISTS bucket_storage_tallies_project_id_interval_start_index ON bucket_storage_tallies ( project_id , interval_start ) ;
DROP INDEX IF EXISTS bucket_storage_tallies_project_id_index ;
` ,
} ,
} ,
2021-01-18 14:33:13 +00:00
{
DB : & db . migrationDB ,
Description : "nodes add wallet_features column" ,
Version : 146 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN wallet_features text NOT NULL DEFAULT ''; ` ,
} ,
} ,
2021-02-10 15:55:38 +00:00
{
DB : & db . migrationDB ,
Description : "add employee_count column on users" ,
Version : 147 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN employee_count text; ` ,
} ,
} ,
2020-12-17 22:34:07 +00:00
{
DB : & db . migrationDB ,
2021-03-10 15:23:19 +00:00
Description : "empty migration to fix backwards compat test discrepancy with release tag" ,
2020-12-17 22:34:07 +00:00
Version : 148 ,
2021-03-10 15:23:19 +00:00
Action : migrate . SQL { } ,
2020-12-17 22:34:07 +00:00
} ,
2021-03-03 23:16:28 +00:00
{
DB : & db . migrationDB ,
Description : "add coupon_codes table and add nullable coupon_code_name to coupons table" ,
Version : 149 ,
Action : migrate . SQL {
` CREATE TABLE coupon_codes (
id bytea NOT NULL ,
name text NOT NULL ,
amount bigint NOT NULL ,
description text NOT NULL ,
type integer NOT NULL ,
duration bigint NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id ) ,
UNIQUE ( name )
) ; ` ,
` ALTER TABLE coupons ADD COLUMN coupon_code_name text; ` ,
} ,
} ,
2021-03-19 20:52:34 +00:00
{
DB : & db . migrationDB ,
Description : "drop columns uptime_reputation_alpha and uptime_reputation_beta" ,
Version : 150 ,
Action : migrate . SQL {
` ALTER TABLE nodes DROP COLUMN uptime_reputation_alpha; ` ,
` ALTER TABLE nodes DROP COLUMN uptime_reputation_beta; ` ,
} ,
} ,
2021-03-22 20:26:59 +00:00
{
DB : & db . migrationDB ,
Description : "set default project and usage limits on existing users" ,
Version : 151 ,
Action : migrate . SQL {
` UPDATE users SET project_limit = 10 WHERE project_limit = 0; ` ,
// 500 GB = 5e11 bytes
` UPDATE projects SET usage_limit = 500000000000 WHERE usage_limit IS NULL; ` ,
` UPDATE projects SET bandwidth_limit = 500000000000 WHERE bandwidth_limit IS NULL; ` ,
} ,
} ,
2021-03-18 19:55:06 +00:00
{
DB : & db . migrationDB ,
Description : "add offline_suspended to index on nodes" ,
Version : 152 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS nodes_dis_unk_off_exit_fin_last_success_index ON nodes (disqualified, unknown_audit_suspended, offline_suspended, exit_finished_at, last_contact_success); ` ,
` DROP INDEX IF EXISTS nodes_dis_unk_exit_fin_last_success_index; ` ,
} ,
} ,
2021-03-30 00:37:46 +01:00
{
DB : & db . migrationDB ,
Description : "add nullable coupons.duration_new, migrate coupon_codes.duration to be nullable" ,
Version : 153 ,
Action : migrate . SQL {
` ALTER TABLE coupons ADD COLUMN billing_periods bigint; ` ,
` ALTER TABLE coupon_codes ADD COLUMN billing_periods bigint; ` ,
` ALTER TABLE coupon_codes DROP COLUMN duration; ` ,
} ,
} ,
2021-04-01 17:51:27 +01:00
{
DB : & db . migrationDB ,
Description : "move duration over to billing_periods" ,
Version : 154 ,
Action : migrate . SQL {
` UPDATE coupons SET billing_periods = duration; ` ,
} ,
} ,
2021-04-22 19:28:23 +01:00
{
DB : & db . migrationDB ,
Description : "add have_sales_contact column on users" ,
Version : 155 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN have_sales_contact boolean NOT NULL DEFAULT false; ` ,
} ,
} ,
2021-04-28 14:22:54 +01:00
{
DB : & db . migrationDB ,
Description : "create indexes used in production" ,
Version : 156 ,
Action : migrate . Func ( func ( ctx context . Context , log * zap . Logger , _ tagsql . DB , tx tagsql . Tx ) error {
storingClause := func ( fields ... string ) string {
2021-05-11 09:49:26 +01:00
if db . impl == dbutil . Cockroach {
2021-04-28 14:22:54 +01:00
return fmt . Sprintf ( "STORING (%s)" , strings . Join ( fields , ", " ) )
}
return ""
}
indexes := [ 3 ] string {
` CREATE INDEX IF NOT EXISTS injuredsegments_num_healthy_pieces_attempted_index
ON injuredsegments ( segment_health , attempted NULLS FIRST ) ` ,
` CREATE INDEX IF NOT EXISTS nodes_type_last_cont_success_free_disk_ma_mi_patch_vetted_partial_index
ON nodes ( type , last_contact_success , free_disk , major , minor , patch , vetted_at )
` + storingClause("last_net", "address", "last_ip_port") + `
WHERE disqualified IS NULL AND
unknown_audit_suspended IS NULL AND
exit_initiated_at IS NULL AND
release = true AND
last_net != ' ' ` ,
` CREATE INDEX IF NOT EXISTS nodes_dis_unk_aud_exit_init_rel_type_last_cont_success_stored_index
ON nodes ( disqualified ASC , unknown_audit_suspended ASC , exit_initiated_at ASC , release ASC , type ASC , last_contact_success DESC )
` + storingClause("free_disk", "minor", "major", "patch", "vetted_at", "last_net", "address", "last_ip_port") + `
WHERE disqualified IS NULL AND
unknown_audit_suspended IS NULL AND
exit_initiated_at IS NULL AND
release = true ` ,
}
for _ , s := range indexes {
_ , err := tx . ExecContext ( ctx , s )
if err != nil {
return err
}
}
return nil
} ) ,
} ,
2021-04-20 18:32:05 +01:00
{
DB : & db . migrationDB ,
Description : "drop unused columns total_uptime_count and uptime_success_count on nodes table" ,
Version : 157 ,
Action : migrate . SQL {
` ALTER TABLE nodes DROP COLUMN total_uptime_count; ` ,
` ALTER TABLE nodes DROP COLUMN uptime_success_count; ` ,
} ,
} ,
2021-05-14 13:11:25 +01:00
{
DB : & db . migrationDB ,
Description : "create new table for computing project bandwidth daily usage." ,
Version : 158 ,
Action : migrate . SQL {
` CREATE TABLE project_bandwidth_daily_rollups (
project_id bytea NOT NULL ,
interval_day date NOT NULL ,
egress_allocated bigint NOT NULL ,
egress_settled bigint NOT NULL ,
PRIMARY KEY ( project_id , interval_day )
) ; ` ,
} ,
} ,
satellite/satellitedb: Migrate non-expiring coupons to expire
Because of recent changes to how coupons for the free tier are handled
(see commit 4c0817bcfb1bbd8), we no longer want all these $10
non-expiring coupons. After coupons are applied during invoice
generation, if a customer does not have any valid (non expired, non
consumed) coupons, a new promotional coupon is applied.
We could just wait for users to consume all $10 of the non-expiring
coupons, and the new promotional coupon would be applied for the
following billing cycle, but this gets tricky, because if in the final
month, the user is billed for $1 of usage, but only $0.5 of the $10
non-expiring coupon is remaining, the user will be charged for the
remaining $0.5. With the new promotional coupon of $1.65, expiring every
month, this would not be an issue.
So long story short, this commit migrates all non-expiring coupons to
expire within 2 billing periods (all existing non-expiring coupons in
prod were created in early April or later). That way, there is still
enough value in the $10 coupon that we don't have to worry about
customers exceeding it, and the coupons will expire. Then we'll
immediately apply the $1.65 coupon for the next month! And then
hopefully this unfortunate situation will come to a pleasant end.
Change-Id: I8a593948d8876c41a71d886b9a95d4e2c802b4f3
2021-04-28 22:15:26 +01:00
{
DB : & db . migrationDB ,
Description : "migrate non-expiring coupons to expire in 2 billing periods" ,
Version : 159 ,
Action : migrate . SQL {
` UPDATE coupons SET billing_periods = 2 WHERE billing_periods is NULL; ` ,
} ,
} ,
2021-05-26 22:52:31 +01:00
{
DB : & db . migrationDB ,
Description : "add column to track dead allocated bandwidth" ,
Version : 160 ,
Action : migrate . SQL {
` ALTER TABLE project_bandwidth_daily_rollups ADD COLUMN egress_dead bigint NOT NULL DEFAULT 0; ` ,
} ,
} ,
2021-06-22 16:01:15 +01:00
{
DB : & db . migrationDB ,
Description : "add table for node reputation" ,
Version : 161 ,
Action : migrate . SQL {
` CREATE TABLE reputations (
id bytea NOT NULL ,
audit_success_count bigint NOT NULL DEFAULT 0 ,
total_audit_count bigint NOT NULL DEFAULT 0 ,
vetted_at timestamp with time zone ,
created_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
updated_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
contained boolean NOT NULL DEFAULT false ,
disqualified timestamp with time zone ,
suspended timestamp with time zone ,
unknown_audit_suspended timestamp with time zone ,
offline_suspended timestamp with time zone ,
under_review timestamp with time zone ,
online_score double precision NOT NULL DEFAULT 1 ,
audit_history bytea NOT NULL ,
audit_reputation_alpha double precision NOT NULL DEFAULT 1 ,
audit_reputation_beta double precision NOT NULL DEFAULT 0 ,
unknown_audit_reputation_alpha double precision NOT NULL DEFAULT 1 ,
unknown_audit_reputation_beta double precision NOT NULL DEFAULT 0 ,
PRIMARY KEY ( id )
) ; ` ,
} ,
} ,
2021-06-11 14:32:07 +01:00
{
DB : & db . migrationDB ,
Description : "add stream_id and position columns to graceful_exit_transfer_queue" ,
Version : 162 ,
Action : migrate . SQL {
` CREATE TABLE graceful_exit_segment_transfer_queue (
node_id bytea NOT NULL ,
stream_id bytea NOT NULL ,
position bigint NOT NULL ,
piece_num integer NOT NULL ,
root_piece_id bytea ,
durability_ratio double precision NOT NULL ,
queued_at timestamp with time zone NOT NULL ,
requested_at timestamp with time zone ,
last_failed_at timestamp with time zone ,
last_failed_code integer ,
failed_count integer ,
finished_at timestamp with time zone ,
order_limit_send_count integer NOT NULL DEFAULT 0 ,
PRIMARY KEY ( node_id , stream_id , position , piece_num )
) ; ` ,
` CREATE INDEX graceful_exit_segment_transfer_nid_dr_qa_fa_lfa_index ON graceful_exit_segment_transfer_queue ( node_id, durability_ratio, queued_at, finished_at, last_failed_at ) ; ` ,
` ALTER TABLE graceful_exit_progress
ADD COLUMN uses_segment_transfer_queue boolean NOT NULL DEFAULT false ; ` ,
} ,
} ,
2021-06-11 15:34:46 +01:00
{
DB : & db . migrationDB ,
Description : "create segment_pending_audits table, replacement for pending_audits" ,
Version : 163 ,
Action : migrate . SQL {
` CREATE TABLE segment_pending_audits (
node_id bytea NOT NULL ,
stream_id bytea NOT NULL ,
position bigint NOT NULL ,
piece_id bytea NOT NULL ,
stripe_index bigint NOT NULL ,
share_size bigint NOT NULL ,
expected_share_hash bytea NOT NULL ,
reverify_count bigint NOT NULL ,
PRIMARY KEY ( node_id )
) ; ` ,
} ,
} ,
2021-06-29 22:41:44 +01:00
{
DB : & db . migrationDB ,
Description : "add paid_tier column to users table" ,
Version : 164 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN paid_tier bool NOT NULL DEFAULT false; ` ,
} ,
} ,
2021-06-17 16:05:04 +01:00
{
DB : & db . migrationDB ,
Description : "add repair_queue table, replacement for injuredsegments table" ,
Version : 165 ,
Action : migrate . SQL {
` CREATE TABLE repair_queue (
stream_id bytea NOT NULL ,
position bigint NOT NULL ,
attempted_at timestamp with time zone ,
updated_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
inserted_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
segment_health double precision NOT NULL DEFAULT 1 ,
PRIMARY KEY ( stream_id , position )
) ` ,
` CREATE INDEX repair_queue_updated_at_index ON repair_queue ( updated_at ) ` ,
` CREATE INDEX repair_queue_num_healthy_pieces_attempted_at_index ON repair_queue ( segment_health, attempted_at NULLS FIRST) ` ,
} ,
} ,
2021-06-30 10:58:26 +01:00
{
DB : & db . migrationDB ,
Description : "add total_bytes table and total_segments_count for bucket_storage_tallies table" ,
Version : 166 ,
Action : migrate . SQL {
` ALTER TABLE bucket_storage_tallies ADD COLUMN total_bytes bigint NOT NULL DEFAULT 0; ` ,
` ALTER TABLE bucket_storage_tallies ADD COLUMN total_segments_count integer NOT NULL DEFAULT 0; ` ,
} ,
} ,
2021-07-08 17:26:35 +01:00
{
DB : & db . migrationDB ,
Description : "add multi-factor authentication columns mfa_enabled, mfa_secret_key, and mfa_recovery_codes into users table" ,
Version : 167 ,
Action : migrate . SQL {
` ALTER TABLE users
ADD COLUMN mfa_enabled boolean NOT NULL DEFAULT false ,
ADD COLUMN mfa_secret_key text ,
ADD COLUMN mfa_recovery_codes text ; ` ,
} ,
} ,
2021-07-15 18:34:23 +01:00
{
DB : & db . migrationDB ,
Description : "migrate audit score related data from overlaycache into reputations table" ,
Version : 168 ,
Action : migrate . SQL {
` TRUNCATE TABLE reputations; ` ,
` INSERT INTO reputations (
id ,
audit_success_count ,
total_audit_count ,
vetted_at ,
created_at ,
updated_at ,
contained ,
disqualified ,
suspended ,
unknown_audit_suspended ,
offline_suspended ,
under_review ,
online_score ,
audit_history ,
audit_reputation_alpha ,
audit_reputation_beta ,
unknown_audit_reputation_alpha ,
unknown_audit_reputation_beta
)
SELECT
n . id ,
n . audit_success_count ,
n . total_audit_count ,
n . vetted_at ,
n . created_at ,
n . updated_at ,
n . contained ,
n . disqualified ,
n . suspended ,
n . unknown_audit_suspended ,
n . offline_suspended ,
n . under_review ,
n . online_score ,
audit_histories . history ,
n . audit_reputation_alpha ,
n . audit_reputation_beta ,
n . unknown_audit_reputation_alpha ,
n . unknown_audit_reputation_beta
FROM nodes as n INNER JOIN audit_histories ON n . id = audit_histories . node_id ; ` ,
} ,
} ,
2021-07-21 11:18:34 +01:00
{
DB : & db . migrationDB ,
Description : "drop tables after metaloop refactoring" ,
Version : 169 ,
Action : migrate . SQL {
` DROP TABLE pending_audits ` ,
` DROP TABLE irreparabledbs ` ,
` DROP TABLE injuredsegments ` ,
} ,
} ,
2021-08-10 19:32:24 +01:00
{
DB : & db . migrationDB ,
Description : "drop audit_history table" ,
Version : 170 ,
Action : migrate . SQL {
` DROP TABLE audit_histories ` ,
} ,
} ,
2021-08-31 17:01:32 +01:00
{
DB : & db . migrationDB ,
Description : "drop audit and unknown audit reputation alpha and beta from nodes table" ,
Version : 171 ,
Action : migrate . SQL {
` ALTER TABLE nodes DROP COLUMN audit_reputation_alpha; ` ,
` ALTER TABLE nodes DROP COLUMN audit_reputation_beta; ` ,
` ALTER TABLE nodes DROP COLUMN unknown_audit_reputation_alpha; ` ,
` ALTER TABLE nodes DROP COLUMN unknown_audit_reputation_beta; ` ,
` ALTER TABLE nodes DROP COLUMN audit_success_count ` ,
` ALTER TABLE nodes DROP COLUMN online_score ` ,
` ALTER TABLE nodes DROP COLUMN total_audit_count ` ,
} ,
} ,
2021-08-23 22:42:46 +01:00
{
DB : & db . migrationDB ,
Description : "add burst_limit to projects table" ,
Version : 172 ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN burst_limit int; ` ,
} ,
} ,
2021-09-07 20:28:45 +01:00
{
DB : & db . migrationDB ,
Description : "drop graceful_exit_transfer_queue table" ,
Version : 173 ,
Action : migrate . SQL {
` DROP TABLE graceful_exit_transfer_queue ` ,
} ,
} ,
2021-09-23 00:38:18 +01:00
{
DB : & db . migrationDB ,
Description : "add user_agent bytes to the value_attributions, users, projects, api_keys and bucket_metainfos tables" ,
Version : 174 ,
Action : migrate . SQL {
` ALTER TABLE value_attributions ADD COLUMN user_agent bytea; ` ,
` ALTER TABLE users ADD COLUMN user_agent bytea; ` ,
` ALTER TABLE projects ADD COLUMN user_agent bytea; ` ,
` ALTER TABLE api_keys ADD COLUMN user_agent bytea; ` ,
2021-10-13 12:33:35 +01:00
` ALTER TABLE bucket_metainfos ADD COLUMN user_agent bytea; ` ,
} ,
2021-09-23 00:38:18 +01:00
} ,
2021-10-20 12:14:12 +01:00
{
DB : & db . migrationDB ,
Description : "drop column uses_segment_transfer_queue from graceful_exit_progress" ,
Version : 175 ,
Action : migrate . SQL {
` ALTER TABLE graceful_exit_progress DROP COLUMN uses_segment_transfer_queue; ` ,
} ,
} ,
2021-10-12 14:54:05 +01:00
{
DB : & db . migrationDB ,
Description : "add signup_promo_code column on users" ,
Version : 176 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN signup_promo_code text; ` ,
} ,
} ,
2021-10-20 23:43:32 +01:00
{
DB : & db . migrationDB ,
Description : "add column segments to invoice_project_records table and drop NOT NULL constraint for objects column" ,
Version : 177 ,
Action : migrate . SQL {
` ALTER TABLE stripecoinpayments_invoice_project_records ADD COLUMN segments bigint; ` ,
` ALTER TABLE stripecoinpayments_invoice_project_records ALTER COLUMN objects DROP NOT NULL; ` ,
} ,
} ,
2021-10-12 22:05:54 +01:00
{
DB : & db . migrationDB ,
Description : "add placement to bucket_metainfos and country_code to nodes (geofencing) " ,
Version : 178 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN country_code text; ` ,
` ALTER TABLE bucket_metainfos ADD COLUMN placement integer; ` ,
} ,
} ,
2021-10-13 12:33:35 +01:00
{
DB : & db . migrationDB ,
Description : "add disqualification_reason to nodes" ,
Version : 179 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN disqualification_reason integer ` ,
} ,
} ,
2021-11-01 15:27:32 +00:00
{
DB : & db . migrationDB ,
Description : "add project_bandwidth_limit and project_storage_limit to the user table" ,
Version : 180 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN project_bandwidth_limit bigint NOT NULL DEFAULT 0; ` ,
` ALTER TABLE users ADD COLUMN project_storage_limit bigint NOT NULL DEFAULT 0; ` ,
} ,
} ,
{
DB : & db . migrationDB ,
Description : "add project_bandwidth_limit and project_storage_limit to the user table" ,
Version : 181 ,
SeparateTx : true ,
Action : migrate . SQL {
2021-12-20 17:55:09 +00:00
` UPDATE users SET project_bandwidth_limit = 50000000000 , project_storage_limit = 50000000000
2021-11-01 15:27:32 +00:00
WHERE ( project_bandwidth_limit = 0 AND project_storage_limit = 0 AND paid_tier = false ) ; ` ,
2021-12-20 17:55:09 +00:00
` UPDATE users SET project_bandwidth_limit = 100000000000000 , project_storage_limit = 25000000000000
2021-11-01 15:27:32 +00:00
WHERE ( project_bandwidth_limit = 0 AND project_storage_limit = 0 AND paid_tier = true ) ; ` ,
` UPDATE users SET project_limit = 3 WHERE project_limit = 0; ` ,
} ,
} ,
2021-12-01 17:12:55 +00:00
{
DB : & db . migrationDB ,
Description : "add segment_limit to the projects table" ,
Version : 182 ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN segment_limit bigint DEFAULT 1000000 ` ,
} ,
} ,
2021-12-06 19:06:50 +00:00
{
DB : & db . migrationDB ,
Description : "add project_segment_limit to the users table" ,
Version : 183 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN project_segment_limit bigint NOT NULL DEFAULT 0 ` ,
} ,
} ,
2021-12-20 17:55:09 +00:00
{
DB : & db . migrationDB ,
Description : "add last_verification_reminder to the users table" ,
Version : 184 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN last_verification_reminder timestamp with time zone ` ,
} ,
} ,
2021-11-22 16:00:33 +00:00
{
DB : & db . migrationDB ,
Description : "add oauth_clients table and user index" ,
Version : 185 ,
Action : migrate . SQL {
` CREATE TABLE oauth_clients (
id bytea NOT NULL ,
encrypted_secret bytea NOT NULL ,
redirect_url text NOT NULL ,
user_id bytea NOT NULL ,
app_name text NOT NULL ,
app_logo_url text NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
` CREATE INDEX oauth_clients_user_id_index ON oauth_clients ( user_id ) ; ` ,
} ,
} ,
2021-12-17 16:09:27 +00:00
{
DB : & db . migrationDB ,
Description : "add oauth_codes and oauth_tokens table" ,
Version : 186 ,
Action : migrate . SQL {
` CREATE TABLE oauth_codes (
client_id bytea NOT NULL ,
user_id bytea NOT NULL ,
scope text NOT NULL ,
redirect_url text NOT NULL ,
challenge text NOT NULL ,
challenge_method text NOT NULL ,
code text NOT NULL ,
created_at timestamp with time zone NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
claimed_at timestamp with time zone ,
PRIMARY KEY ( code )
) ; ` ,
` CREATE INDEX oauth_codes_user_id_index ON oauth_codes ( user_id ) ; ` ,
` CREATE INDEX oauth_codes_client_id_index ON oauth_codes ( client_id ) ; ` ,
` CREATE TABLE oauth_tokens (
client_id bytea NOT NULL ,
user_id bytea NOT NULL ,
scope text NOT NULL ,
kind integer NOT NULL ,
token bytea NOT NULL ,
created_at timestamp with time zone NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( token )
) ` ,
` CREATE INDEX oauth_tokens_user_id_index ON oauth_tokens ( user_id ) ; ` ,
` CREATE INDEX oauth_tokens_client_id_index ON oauth_tokens ( client_id ) ; ` ,
} ,
} ,
2022-01-19 20:57:14 +00:00
{
DB : & db . migrationDB ,
Description : "drop contained from nodes and reputations" ,
Version : 187 ,
Action : migrate . SQL {
` ALTER TABLE nodes DROP COLUMN contained; ` ,
` ALTER TABLE reputations DROP COLUMN contained; ` ,
} ,
} ,
2022-01-28 10:33:39 +00:00
{
DB : & db . migrationDB ,
Description : "migrate users/projects to correct segment limit" ,
Version : 188 ,
Action : migrate . SQL {
` UPDATE users SET
project_segment_limit = CASE WHEN paid_tier = true THEN 1000000 ELSE 150000 END ; ` ,
` UPDATE projects SET segment_limit = 150000
WHERE owner_id NOT IN ( SELECT id FROM users WHERE paid_tier = true ) ; ` ,
} ,
} ,
2021-07-29 02:33:05 +01:00
{
DB : & db . migrationDB ,
Description : "add columns to coinpayments tables to replace gob-encoded big.Floats" ,
Version : 189 ,
Action : migrate . SQL {
` ALTER TABLE coinpayments_transactions ALTER COLUMN amount DROP NOT NULL; ` ,
` ALTER TABLE coinpayments_transactions ALTER COLUMN received DROP NOT NULL; ` ,
` ALTER TABLE coinpayments_transactions RENAME COLUMN amount TO amount_gob; ` ,
` ALTER TABLE coinpayments_transactions RENAME COLUMN received TO received_gob; ` ,
` ALTER TABLE coinpayments_transactions ADD COLUMN amount_numeric int8; ` ,
` ALTER TABLE coinpayments_transactions ADD COLUMN received_numeric int8; ` ,
` ALTER TABLE stripecoinpayments_tx_conversion_rates ALTER COLUMN rate DROP NOT NULL; ` ,
` ALTER TABLE stripecoinpayments_tx_conversion_rates RENAME COLUMN rate TO rate_gob; ` ,
` ALTER TABLE stripecoinpayments_tx_conversion_rates ADD COLUMN rate_numeric double precision; ` ,
} ,
} ,
2022-03-02 17:39:37 +00:00
{
DB : & db . migrationDB ,
Description : "change segment limit default value to 100M for users from paid tier" ,
Version : 190 ,
Action : migrate . SQL {
` UPDATE users SET project_segment_limit = 100000000 WHERE paid_tier = true ` ,
` UPDATE projects SET segment_limit = 100000000
WHERE owner_id IN ( SELECT id FROM users WHERE paid_tier = true ) ; ` ,
} ,
} ,
2022-03-24 16:19:47 +00:00
{
DB : & db . migrationDB ,
Description : "make _numeric fields not null (all are now populated)" ,
Version : 191 ,
Action : migrate . SQL {
` ALTER TABLE coinpayments_transactions ALTER COLUMN amount_numeric SET NOT NULL; ` ,
` ALTER TABLE coinpayments_transactions ALTER COLUMN received_numeric SET NOT NULL; ` ,
` ALTER TABLE stripecoinpayments_tx_conversion_rates ALTER COLUMN rate_numeric SET NOT NULL; ` ,
} ,
} ,
2022-02-18 14:53:53 +00:00
{
DB : & db . migrationDB ,
Description : "add columns to users table to control failed login attempts (disallow brute forcing)" ,
Version : 192 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN failed_login_count integer; ` ,
` ALTER TABLE users ADD COLUMN login_lockout_expiration timestamp with time zone; ` ,
} ,
} ,
2022-04-06 11:53:57 +01:00
{
DB : & db . migrationDB ,
Description : "make zero project related columns to have default values" ,
Version : 193 ,
Action : migrate . SQL {
` UPDATE users SET
project_bandwidth_limit = 150000000000 ,
project_storage_limit = 150000000000 ,
project_segment_limit = 150000 ,
project_limit = 1
WHERE (
project_bandwidth_limit = 0 AND
project_storage_limit = 0 AND
project_limit = 0 AND
paid_tier = false
) ; ` ,
} ,
} ,
2022-04-20 14:48:16 +01:00
{
DB : & db . migrationDB ,
Description : "drop suspended column on reputations and nodes" ,
Version : 194 ,
Action : migrate . SQL {
` ALTER TABLE reputations DROP COLUMN suspended; ` ,
` ALTER TABLE nodes DROP COLUMN suspended; ` ,
} ,
} ,
2022-04-15 14:27:49 +01:00
{
DB : & db . migrationDB ,
Description : "create webapp_sessions table" ,
Version : 195 ,
Action : migrate . SQL {
` CREATE TABLE webapp_sessions (
id bytea NOT NULL ,
user_id bytea NOT NULL ,
ip_address text NOT NULL ,
user_agent text NOT NULL ,
status integer NOT NULL ,
expires_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
` CREATE INDEX webapp_sessions_user_id_index ON webapp_sessions ( user_id ) ; ` ,
} ,
} ,
2022-02-08 14:32:16 +00:00
{
DB : & db . migrationDB ,
Description : "add verification_reminders column to users" ,
Version : 196 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN verification_reminders INTEGER NOT NULL DEFAULT 0; ` ,
} ,
} ,
2022-04-20 17:59:47 +01:00
{
DB : & db . migrationDB ,
Description : "add disqualification_reason to reputations" ,
Version : 197 ,
Action : migrate . SQL {
` ALTER TABLE reputations ADD COLUMN disqualification_reason integer ` ,
} ,
} ,
2022-05-20 10:18:59 +01:00
{
DB : & db . migrationDB ,
Description : "add storjscan_wallets" ,
Version : 198 ,
Action : migrate . SQL {
` CREATE TABLE storjscan_wallets (
user_id bytea NOT NULL ,
wallet_address bytea NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( user_id , wallet_address )
) ; ` ,
} ,
} ,
2022-04-26 21:23:27 +01:00
{
DB : & db . migrationDB ,
Description : "add billing_transactions" ,
Version : 199 ,
Action : migrate . SQL {
` CREATE TABLE billing_transactions (
tx_id bytea NOT NULL ,
user_id bytea NOT NULL ,
amount bigint NOT NULL ,
currency text NOT NULL ,
description text NOT NULL ,
type integer NOT NULL ,
timestamp timestamp with time zone NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( tx_id )
) ; ` ,
} ,
} ,
2022-05-10 13:18:23 +01:00
{
DB : & db . migrationDB ,
Description : "add storjscan_payments table and index on block number and log index" ,
Version : 200 ,
Action : migrate . SQL {
` CREATE TABLE storjscan_payments (
block_hash bytea NOT NULL ,
block_number bigint NOT NULL ,
transaction bytea NOT NULL ,
log_index integer NOT NULL ,
from_address bytea NOT NULL ,
to_address bytea NOT NULL ,
token_value bigint NOT NULL ,
usd_value bigint NOT NULL ,
status text NOT NULL ,
timestamp timestamp with time zone NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( block_hash , log_index )
) ; ` ,
` CREATE INDEX storjscan_payments_block_number_log_index_index ON storjscan_payments ( block_number, log_index ); ` ,
} ,
} ,
2022-06-22 15:26:55 +01:00
{
DB : & db . migrationDB ,
Description : "add projects.public_id" ,
Version : 201 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN public_id bytea; ` ,
` CREATE INDEX IF NOT EXISTS projects_public_id_index ON projects ( public_id ); ` ,
} ,
} ,
2022-07-11 21:18:10 +01:00
{
DB : & db . migrationDB ,
Description : "Add accounting_rollups.interval_end_time column" ,
Version : 202 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE accounting_rollups ADD COLUMN interval_end_time TIMESTAMP WITH TIME ZONE; ` ,
} ,
} ,
{
DB : & db . migrationDB ,
Description : "Backfill accounting_rollups.interval_end_time with start_time" ,
Version : 203 ,
SeparateTx : true ,
Action : migrate . SQL {
` UPDATE accounting_rollups SET interval_end_time = start_time WHERE interval_end_time = NULL; ` ,
} ,
} ,
2022-06-16 17:48:07 +01:00
{
DB : & db . migrationDB ,
Description : "drop billing table to change primary key." ,
Version : 204 ,
Action : migrate . SQL {
` DROP TABLE billing_transactions; ` ,
} ,
} ,
{
DB : & db . migrationDB ,
Description : "add billing tables for user balances and transactions" ,
Version : 205 ,
Action : migrate . SQL {
` CREATE TABLE billing_balances (
user_id bytea NOT NULL ,
balance bigint NOT NULL ,
last_updated timestamp with time zone NOT NULL ,
PRIMARY KEY ( user_id )
) ; ` ,
` CREATE TABLE billing_transactions (
id bigserial NOT NULL ,
user_id bytea NOT NULL ,
amount bigint NOT NULL ,
currency text NOT NULL ,
description text NOT NULL ,
source text NOT NULL ,
status text NOT NULL ,
type text NOT NULL ,
metadata jsonb NOT NULL ,
timestamp timestamp with time zone NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( id )
) ; ` ,
} ,
} ,
2022-07-27 18:24:21 +01:00
{
DB : & db . migrationDB ,
Description : "add projects.salt" ,
Version : 206 ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN salt bytea; ` ,
} ,
} ,
2022-08-12 21:44:35 +01:00
{
DB : & db . migrationDB ,
Description : "create new index on wallet address to improve queries." ,
Version : 207 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS storjscan_wallets_wallet_address_index ON storjscan_wallets ( wallet_address ); ` ,
} ,
} ,
2022-08-16 17:44:19 +01:00
{
DB : & db . migrationDB ,
Description : "create new index on billing transaction timestamp to improve queries." ,
Version : 208 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS billing_transactions_timestamp_index ON billing_transactions ( timestamp ); ` ,
} ,
} ,
2022-08-11 15:17:12 +01:00
{
DB : & db . migrationDB ,
Description : "reset all non-DQ'd node audit reputations for new system" ,
Version : 209 ,
Action : migrate . SQL {
` UPDATE reputations SET audit_reputation_alpha = 1000 , audit_reputation_beta = 0
WHERE disqualified IS NULL ; ` ,
} ,
} ,
2022-08-17 11:27:48 +01:00
{
DB : & db . migrationDB ,
Description : "Add signup_captcha column to users table" ,
Version : 210 ,
Action : migrate . SQL {
` ALTER TABLE users ADD COLUMN signup_captcha double precision; ` ,
} ,
} ,
2022-08-26 14:56:32 +01:00
{
DB : & db . migrationDB ,
Description : "Drop now-unused gob-encoded columns" ,
Version : 211 ,
Action : migrate . SQL {
` ALTER TABLE coinpayments_transactions DROP COLUMN amount_gob, DROP COLUMN received_gob; ` ,
` ALTER TABLE stripecoinpayments_tx_conversion_rates DROP COLUMN rate_gob; ` ,
} ,
} ,
2022-10-04 16:39:48 +01:00
{
DB : & db . migrationDB ,
Description : "Add user_specified_usage_limit and user_specified_bandwidth_limit columns" ,
Version : 212 ,
Action : migrate . SQL {
` ALTER TABLE projects ADD COLUMN user_specified_usage_limit bigint; ` ,
` ALTER TABLE projects ADD COLUMN user_specified_bandwidth_limit bigint; ` ,
} ,
} ,
2022-10-05 14:24:04 +01:00
{
DB : & db . migrationDB ,
Description : "Create table for pending reverification audits" ,
Version : 213 ,
Action : migrate . SQL {
` CREATE TABLE reverification_audits (
node_id bytea NOT NULL ,
stream_id bytea NOT NULL ,
position bigint NOT NULL ,
piece_num integer NOT NULL ,
inserted_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
last_attempt timestamp with time zone ,
reverify_count bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ( node_id , stream_id , position )
) ; ` ,
` CREATE INDEX IF NOT EXISTS reverification_audits_inserted_at_index ON reverification_audits ( inserted_at ); ` ,
} ,
} ,
2022-10-28 14:33:50 +01:00
{
DB : & db . migrationDB ,
Description : "Create table for node events" ,
Version : 214 ,
Action : migrate . SQL {
` CREATE TABLE node_events (
2022-10-28 22:23:52 +01:00
id bytea NOT NULL ,
2022-10-28 14:33:50 +01:00
node_id bytea NOT NULL ,
email text NOT NULL ,
event integer NOT NULL ,
created_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
email_sent timestamp with time zone ,
2022-10-28 22:23:52 +01:00
PRIMARY KEY ( id )
2022-10-28 14:33:50 +01:00
) ; ` ,
` CREATE INDEX IF NOT EXISTS node_events_email_event_created_at_index ON node_events ( email , event , created_at )
WHERE email_sent IS NULL ; ` ,
} ,
} ,
2022-11-01 17:45:41 +00:00
{
DB : & db . migrationDB ,
Description : "Create table for verification queue" ,
Version : 215 ,
Action : migrate . SQL {
` CREATE TABLE verification_audits (
inserted_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
stream_id bytea NOT NULL ,
position bigint NOT NULL ,
expires_at timestamp with time zone ,
encrypted_size integer NOT NULL ,
PRIMARY KEY ( inserted_at , stream_id , position )
) ; ` ,
} ,
} ,
2022-11-03 23:26:13 +00:00
{
DB : & db . migrationDB ,
Description : "Add column contained to nodes table" ,
Version : 216 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN contained timestamp with time zone; ` ,
} ,
} ,
2022-09-29 20:16:46 +01:00
{
DB : & db . migrationDB ,
Description : "Add columns last_offline_email and last_software_update_email" ,
Version : 217 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN last_offline_email timestamp with time zone; ` ,
` ALTER TABLE nodes ADD COLUMN last_software_update_email timestamp with time zone; ` ,
} ,
} ,
2022-11-18 21:21:18 +00:00
{
DB : & db . migrationDB ,
Description : "Add column last_attempted to node_events" ,
Version : 218 ,
Action : migrate . SQL {
` ALTER TABLE node_events ADD COLUMN last_attempted timestamp with time zone; ` ,
} ,
} ,
2022-12-12 21:06:46 +00:00
{
DB : & db . migrationDB ,
Description : "Create account_freeze_events table" ,
Version : 219 ,
Action : migrate . SQL {
` CREATE TABLE account_freeze_events (
user_id bytea NOT NULL ,
event integer NOT NULL ,
limits jsonb ,
created_at timestamp with time zone NOT NULL DEFAULT current_timestamp ,
PRIMARY KEY ( user_id , event )
) ; ` ,
} ,
} ,
2023-01-09 21:29:35 +00:00
{
DB : & db . migrationDB ,
Description : "drop tables related to coupons, offers, and credits" ,
Version : 220 ,
Action : migrate . SQL {
` DROP TABLE user_credits; ` ,
` DROP TABLE coupon_usages; ` ,
` DROP TABLE coupon_codes; ` ,
` DROP TABLE coupons; ` ,
` DROP TABLE offers; ` ,
} ,
} ,
2023-01-10 10:58:37 +00:00
{
DB : & db . migrationDB ,
Description : "drop project_bandwidth_rollups table" ,
Version : 221 ,
Action : migrate . SQL {
` DROP TABLE project_bandwidth_rollups ` ,
} ,
} ,
2022-12-22 20:28:53 +00:00
{
DB : & db . migrationDB ,
Description : "add noise columns to nodes table" ,
Version : 222 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN noise_proto integer; ` ,
` ALTER TABLE nodes ADD COLUMN noise_public_key bytea; ` ,
} ,
} ,
2023-02-02 21:05:41 +00:00
{
DB : & db . migrationDB ,
Description : "create index for interval_day column for project_bandwidth_daily_rollup" ,
Version : 223 ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS project_bandwidth_daily_rollup_interval_day_index ON project_bandwidth_daily_rollups ( interval_day ) ; ` ,
} ,
} ,
2023-02-03 10:30:22 +00:00
{
DB : & db . migrationDB ,
Description : "Create user_settings table" ,
Version : 224 ,
Action : migrate . SQL {
` CREATE TABLE user_settings (
user_id bytea NOT NULL ,
session_minutes integer ,
PRIMARY KEY ( user_id )
) ; ` ,
} ,
} ,
2023-02-08 15:12:14 +00:00
{
DB : & db . migrationDB ,
Description : "drop unused column last_verification_reminder on users table" ,
Version : 225 ,
Action : migrate . SQL {
` ALTER TABLE users DROP COLUMN last_verification_reminder; ` ,
} ,
} ,
2023-03-01 21:53:07 +00:00
{
DB : & db . migrationDB ,
Description : "add passphrase_prompt column to user_settings table" ,
Version : 226 ,
Action : migrate . SQL {
` ALTER TABLE user_settings ADD COLUMN passphrase_prompt boolean; ` ,
} ,
} ,
2023-03-02 10:06:15 +00:00
{
DB : & db . migrationDB ,
Description : "fix bucket_bandwidth_rollups primary key" ,
Version : 227 ,
Action : migrate . Func ( func ( ctx context . Context , log * zap . Logger , _ tagsql . DB , tx tagsql . Tx ) error {
alterPrimaryKey := true
// for crdb lets check if key was already altered, for pg we will do migration always
if _ , ok := db . Driver ( ) . ( * cockroachutil . Driver ) ; ok {
var primaryKey string
err := db . QueryRow ( ctx ,
` WITH constraints AS (SHOW CONSTRAINTS FROM bucket_bandwidth_rollups) SELECT details FROM constraints WHERE constraint_type = 'PRIMARY KEY'; ` ,
) . Scan ( & primaryKey )
if err != nil {
return ErrMigrate . Wrap ( err )
}
// alter primary key only if it was not adjusted manually
alterPrimaryKey = primaryKey != "PRIMARY KEY (project_id ASC, bucket_name ASC, interval_start ASC, action ASC)"
}
if alterPrimaryKey {
_ , err := tx . ExecContext ( ctx , `
ALTER TABLE bucket_bandwidth_rollups DROP CONSTRAINT bucket_bandwidth_rollups_pk ;
ALTER TABLE bucket_bandwidth_rollups ADD CONSTRAINT bucket_bandwidth_rollups_pk PRIMARY KEY ( project_id , bucket_name , interval_start , action ) ;
` )
if err != nil {
return ErrMigrate . Wrap ( err )
}
}
return nil
} ) ,
} ,
2023-03-16 13:08:49 +00:00
{
DB : & db . migrationDB ,
Description : "create new index on users table to improve get users queries." ,
Version : 228 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX IF NOT EXISTS users_email_status_index ON users ( normalized_email, status ); ` ,
} ,
} ,
2023-02-28 20:38:13 +00:00
{
DB : & db . migrationDB ,
Description : "add debounce_limit column to nodes table" ,
Version : 229 ,
Action : migrate . SQL {
` ALTER TABLE nodes ADD COLUMN debounce_limit integer NOT NULL DEFAULT 0; ` ,
} ,
} ,
2023-03-15 15:46:59 +00:00
{
DB : & db . migrationDB ,
Description : "add onboarding columns to user_settings table" ,
SeparateTx : true ,
Version : 230 ,
Action : migrate . SQL {
` ALTER TABLE user_settings ADD COLUMN onboarding_start boolean NOT NULL DEFAULT true; ` ,
` ALTER TABLE user_settings ADD COLUMN onboarding_end boolean NOT NULL DEFAULT true; ` ,
` ALTER TABLE user_settings ADD COLUMN onboarding_step text; ` ,
} ,
} ,
2023-03-22 20:23:44 +00:00
{
DB : & db . migrationDB ,
Description : "add columns package_plan and purchased_package_at to stripe_customers" ,
Version : 231 ,
Action : migrate . SQL {
` ALTER TABLE stripe_customers ADD COLUMN package_plan TEXT; ` ,
` ALTER TABLE stripe_customers ADD COLUMN purchased_package_at timestamp with time zone; ` ,
} ,
} ,
2023-04-24 16:28:51 +01:00
{
DB : & db . migrationDB ,
Description : "create project_invitations table" ,
Version : 232 ,
Action : migrate . SQL {
` CREATE TABLE project_invitations (
project_id bytea NOT NULL REFERENCES projects ( id ) ON DELETE CASCADE ,
email text NOT NULL ,
created_at timestamp with time zone NOT NULL ,
PRIMARY KEY ( project_id , email )
) ; ` ,
` CREATE INDEX project_invitations_project_id_index ON project_invitations ( project_id ); ` ,
` CREATE INDEX project_invitations_email_index ON project_invitations ( email ); ` ,
} ,
} ,
2023-05-05 21:43:45 +01:00
{
DB : & db . migrationDB ,
Description : "make value_attributions.partner_id nullable" ,
Version : 233 ,
SeparateTx : true ,
Action : migrate . SQL {
` ALTER TABLE value_attributions ALTER COLUMN partner_id DROP NOT NULL; ` ,
} ,
} ,
2023-05-08 13:56:39 +01:00
{
DB : & db . migrationDB ,
Description : "create index for owner_id column for projects" ,
Version : 234 ,
SeparateTx : true ,
Action : migrate . SQL {
` CREATE INDEX projects_owner_id_index ON projects ( owner_id ) ` ,
} ,
} ,
2021-02-22 16:55:06 +00:00
// NB: after updating testdata in `testdata`, run
// `go generate` to update `migratez.go`.
2019-02-14 21:55:21 +00:00
} ,
}
}