2016-02-20 22:53:20 +01:00
|
|
|
# This file is auto-generated from the current state of the database. Instead
|
|
|
|
# of editing this file, please use the migrations feature of Active Record to
|
|
|
|
# incrementally modify your database, and then regenerate this schema definition.
|
|
|
|
#
|
|
|
|
# Note that this schema.rb definition is the authoritative source for your
|
|
|
|
# database schema. If you need to create the application database on another
|
|
|
|
# system, you should be using db:schema:load, not running all the migrations
|
|
|
|
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
|
|
|
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
|
|
|
#
|
|
|
|
# It's strongly recommended that you check this file into your version control system.
|
|
|
|
|
2020-05-10 18:18:12 +02:00
|
|
|
ActiveRecord::Schema.define(version: 2020_05_10_110808) do
|
2018-10-07 23:44:58 +02:00
|
|
|
|
2016-02-20 22:53:20 +01:00
|
|
|
# These are extensions that must be enabled in order to support this database
|
|
|
|
enable_extension "plpgsql"
|
|
|
|
|
2019-09-19 20:58:19 +02:00
|
|
|
create_table "account_aliases", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.string "acct", default: "", null: false
|
|
|
|
t.string "uri", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_account_aliases_on_account_id"
|
|
|
|
end
|
|
|
|
|
2018-10-07 23:44:58 +02:00
|
|
|
create_table "account_conversations", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "conversation_id"
|
|
|
|
t.bigint "participant_account_ids", default: [], null: false, array: true
|
|
|
|
t.bigint "status_ids", default: [], null: false, array: true
|
|
|
|
t.bigint "last_status_id"
|
|
|
|
t.integer "lock_version", default: 0, null: false
|
2018-10-19 01:47:29 +02:00
|
|
|
t.boolean "unread", default: false, null: false
|
2018-10-07 23:44:58 +02:00
|
|
|
t.index ["account_id", "conversation_id", "participant_account_ids"], name: "index_unique_conversations", unique: true
|
|
|
|
t.index ["account_id"], name: "index_account_conversations_on_account_id"
|
|
|
|
t.index ["conversation_id"], name: "index_account_conversations_on_conversation_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "account_domain_blocks", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "domain"
|
Account domain blocks (#2381)
* Add <ostatus:conversation /> tag to Atom input/output
Only uses ref attribute (not href) because href would be
the alternate link that's always included also.
Creates new conversation for every non-reply status. Carries
over conversation for every reply. Keeps remote URIs verbatim,
generates local URIs on the fly like the rest of them.
* Conversation muting - prevents notifications that reference a conversation
(including replies, favourites, reblogs) from being created. API endpoints
/api/v1/statuses/:id/mute and /api/v1/statuses/:id/unmute
Currently no way to tell when a status/conversation is muted, so the web UI
only has a "disable notifications" button, doesn't work as a toggle
* Display "Dismiss notifications" on all statuses in notifications column, not just own
* Add "muted" as a boolean attribute on statuses JSON
For now always false on contained reblogs, since it's only relevant for
statuses returned from the notifications endpoint, which are not nested
Remove "Disable notifications" from detailed status view, since it's
only relevant in the notifications column
* Up max class length
* Remove pending test for conversation mute
* Add tests, clean up
* Rename to "mute conversation" and "unmute conversation"
* Raise validation error when trying to mute/unmute status without conversation
* Adding account domain blocks that filter notifications and public timelines
* Add tests for domain blocks in notifications, public timelines
Filter reblogs of blocked domains from home
* Add API for listing and creating account domain blocks
* API for creating/deleting domain blocks, tests for Status#ancestors
and Status#descendants, filter domain blocks from them
* Filter domains in streaming API
* Update account_domain_block_spec.rb
2017-05-19 01:14:30 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "domain"], name: "index_account_domain_blocks_on_account_id_and_domain", unique: true
|
Account domain blocks (#2381)
* Add <ostatus:conversation /> tag to Atom input/output
Only uses ref attribute (not href) because href would be
the alternate link that's always included also.
Creates new conversation for every non-reply status. Carries
over conversation for every reply. Keeps remote URIs verbatim,
generates local URIs on the fly like the rest of them.
* Conversation muting - prevents notifications that reference a conversation
(including replies, favourites, reblogs) from being created. API endpoints
/api/v1/statuses/:id/mute and /api/v1/statuses/:id/unmute
Currently no way to tell when a status/conversation is muted, so the web UI
only has a "disable notifications" button, doesn't work as a toggle
* Display "Dismiss notifications" on all statuses in notifications column, not just own
* Add "muted" as a boolean attribute on statuses JSON
For now always false on contained reblogs, since it's only relevant for
statuses returned from the notifications endpoint, which are not nested
Remove "Disable notifications" from detailed status view, since it's
only relevant in the notifications column
* Up max class length
* Remove pending test for conversation mute
* Add tests, clean up
* Rename to "mute conversation" and "unmute conversation"
* Raise validation error when trying to mute/unmute status without conversation
* Adding account domain blocks that filter notifications and public timelines
* Add tests for domain blocks in notifications, public timelines
Filter reblogs of blocked domains from home
* Add API for listing and creating account domain blocks
* API for creating/deleting domain blocks, tests for Status#ancestors
and Status#descendants, filter domain blocks from them
* Filter domains in streaming API
* Update account_domain_block_spec.rb
2017-05-19 01:14:30 +02:00
|
|
|
end
|
|
|
|
|
2019-03-18 21:00:55 +01:00
|
|
|
create_table "account_identity_proofs", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.string "provider", default: "", null: false
|
|
|
|
t.string "provider_username", default: "", null: false
|
|
|
|
t.text "token", default: "", null: false
|
|
|
|
t.boolean "verified", default: false, null: false
|
|
|
|
t.boolean "live", default: false, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id", "provider", "provider_username"], name: "index_account_proofs_on_account_and_provider_and_username", unique: true
|
|
|
|
t.index ["account_id"], name: "index_account_identity_proofs_on_account_id"
|
|
|
|
end
|
|
|
|
|
2019-09-19 20:58:19 +02:00
|
|
|
create_table "account_migrations", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.string "acct", default: "", null: false
|
|
|
|
t.bigint "followers_count", default: 0, null: false
|
|
|
|
t.bigint "target_account_id"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_account_migrations_on_account_id"
|
|
|
|
t.index ["target_account_id"], name: "index_account_migrations_on_target_account_id"
|
|
|
|
end
|
|
|
|
|
2017-10-07 20:26:43 +02:00
|
|
|
create_table "account_moderation_notes", force: :cascade do |t|
|
|
|
|
t.text "content", null: false
|
2017-10-10 13:12:17 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "target_account_id", null: false
|
2017-10-07 20:26:43 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_account_moderation_notes_on_account_id"
|
|
|
|
t.index ["target_account_id"], name: "index_account_moderation_notes_on_target_account_id"
|
|
|
|
end
|
|
|
|
|
2018-08-09 09:56:53 +02:00
|
|
|
create_table "account_pins", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "target_account_id"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id", "target_account_id"], name: "index_account_pins_on_account_id_and_target_account_id", unique: true
|
|
|
|
t.index ["account_id"], name: "index_account_pins_on_account_id"
|
|
|
|
t.index ["target_account_id"], name: "index_account_pins_on_target_account_id"
|
|
|
|
end
|
|
|
|
|
2018-11-19 00:43:52 +01:00
|
|
|
create_table "account_stats", force: :cascade do |t|
|
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "statuses_count", default: 0, null: false
|
|
|
|
t.bigint "following_count", default: 0, null: false
|
|
|
|
t.bigint "followers_count", default: 0, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2018-12-06 17:36:11 +01:00
|
|
|
t.datetime "last_status_at"
|
2019-10-02 04:59:37 +02:00
|
|
|
t.integer "lock_version", default: 0, null: false
|
2018-11-19 00:43:52 +01:00
|
|
|
t.index ["account_id"], name: "index_account_stats_on_account_id", unique: true
|
|
|
|
end
|
|
|
|
|
2018-12-06 17:36:11 +01:00
|
|
|
create_table "account_tag_stats", force: :cascade do |t|
|
|
|
|
t.bigint "tag_id", null: false
|
|
|
|
t.bigint "accounts_count", default: 0, null: false
|
|
|
|
t.boolean "hidden", default: false, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["tag_id"], name: "index_account_tag_stats_on_tag_id", unique: true
|
|
|
|
end
|
|
|
|
|
Add moderation warnings (#9519)
* Add moderation warnings
Replace individual routes for disabling, silencing, and suspending
a user, as well as the report update route, with a unified account
action controller that allows you to select an action (none,
disable, silence, suspend) as well as whether it should generate an
e-mail notification with optional custom text. That notification,
with the optional custom text, is saved as a warning.
Additionally, there are warning presets you can configure to save
time when performing the above.
* Use Account#local_username_and_domain
2018-12-22 20:02:09 +01:00
|
|
|
create_table "account_warning_presets", force: :cascade do |t|
|
|
|
|
t.text "text", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2020-03-12 17:57:59 +01:00
|
|
|
t.string "title", default: "", null: false
|
Add moderation warnings (#9519)
* Add moderation warnings
Replace individual routes for disabling, silencing, and suspending
a user, as well as the report update route, with a unified account
action controller that allows you to select an action (none,
disable, silence, suspend) as well as whether it should generate an
e-mail notification with optional custom text. That notification,
with the optional custom text, is saved as a warning.
Additionally, there are warning presets you can configure to save
time when performing the above.
* Use Account#local_username_and_domain
2018-12-22 20:02:09 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
create_table "account_warnings", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "target_account_id"
|
|
|
|
t.integer "action", default: 0, null: false
|
|
|
|
t.text "text", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_account_warnings_on_account_id"
|
|
|
|
t.index ["target_account_id"], name: "index_account_warnings_on_target_account_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "accounts", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "username", default: "", null: false
|
|
|
|
t.string "domain"
|
|
|
|
t.string "secret", default: "", null: false
|
|
|
|
t.text "private_key"
|
|
|
|
t.text "public_key", default: "", null: false
|
|
|
|
t.string "remote_url", default: "", null: false
|
|
|
|
t.string "salmon_url", default: "", null: false
|
|
|
|
t.string "hub_url", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.text "note", default: "", null: false
|
|
|
|
t.string "display_name", default: "", null: false
|
|
|
|
t.string "uri", default: "", null: false
|
|
|
|
t.string "url"
|
|
|
|
t.string "avatar_file_name"
|
|
|
|
t.string "avatar_content_type"
|
|
|
|
t.integer "avatar_file_size"
|
2016-02-28 00:02:59 +01:00
|
|
|
t.datetime "avatar_updated_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "header_file_name"
|
|
|
|
t.string "header_content_type"
|
|
|
|
t.integer "header_file_size"
|
2016-03-12 20:47:22 +01:00
|
|
|
t.datetime "header_updated_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "avatar_remote_url"
|
2016-09-20 00:39:03 +02:00
|
|
|
t.datetime "subscription_expires_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.boolean "locked", default: false, null: false
|
|
|
|
t.string "header_remote_url", default: "", null: false
|
2017-04-16 20:32:17 +02:00
|
|
|
t.datetime "last_webfingered_at"
|
2017-07-19 17:06:46 +02:00
|
|
|
t.string "inbox_url", default: "", null: false
|
|
|
|
t.string "outbox_url", default: "", null: false
|
|
|
|
t.string "shared_inbox_url", default: "", null: false
|
|
|
|
t.string "followers_url", default: "", null: false
|
|
|
|
t.integer "protocol", default: 0, null: false
|
2017-11-07 19:06:44 +01:00
|
|
|
t.boolean "memorial", default: false, null: false
|
2017-11-18 19:39:02 +01:00
|
|
|
t.bigint "moved_to_account_id"
|
2018-03-04 09:19:11 +01:00
|
|
|
t.string "featured_collection_url"
|
2018-04-14 12:41:08 +02:00
|
|
|
t.jsonb "fields"
|
2018-05-07 09:31:07 +02:00
|
|
|
t.string "actor_type"
|
2018-12-06 17:36:11 +01:00
|
|
|
t.boolean "discoverable"
|
2018-12-29 02:24:36 +01:00
|
|
|
t.string "also_known_as", array: true
|
2019-05-14 19:05:02 +02:00
|
|
|
t.datetime "silenced_at"
|
|
|
|
t.datetime "suspended_at"
|
2019-07-13 16:45:50 +02:00
|
|
|
t.integer "trust_level"
|
2020-03-09 00:10:29 +01:00
|
|
|
t.boolean "hide_collections"
|
2020-04-26 23:29:08 +02:00
|
|
|
t.integer "avatar_storage_schema_version"
|
|
|
|
t.integer "header_storage_schema_version"
|
2017-03-17 20:47:38 +01:00
|
|
|
t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
|
2018-05-30 02:51:26 +02:00
|
|
|
t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["uri"], name: "index_accounts_on_uri"
|
|
|
|
t.index ["url"], name: "index_accounts_on_url"
|
2016-02-20 22:53:20 +01:00
|
|
|
end
|
|
|
|
|
2018-12-06 17:36:11 +01:00
|
|
|
create_table "accounts_tags", id: false, force: :cascade do |t|
|
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "tag_id", null: false
|
|
|
|
t.index ["account_id", "tag_id"], name: "index_accounts_tags_on_account_id_and_tag_id"
|
|
|
|
t.index ["tag_id", "account_id"], name: "index_accounts_tags_on_tag_id_and_account_id", unique: true
|
|
|
|
end
|
|
|
|
|
2017-11-24 02:05:53 +01:00
|
|
|
create_table "admin_action_logs", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.string "action", default: "", null: false
|
|
|
|
t.string "target_type"
|
|
|
|
t.bigint "target_id"
|
|
|
|
t.text "recorded_changes", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_admin_action_logs_on_account_id"
|
|
|
|
t.index ["target_type", "target_id"], name: "index_admin_action_logs_on_target_type_and_target_id"
|
|
|
|
end
|
|
|
|
|
2020-01-23 22:00:13 +01:00
|
|
|
create_table "announcement_mutes", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "announcement_id"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id", "announcement_id"], name: "index_announcement_mutes_on_account_id_and_announcement_id", unique: true
|
|
|
|
t.index ["account_id"], name: "index_announcement_mutes_on_account_id"
|
|
|
|
t.index ["announcement_id"], name: "index_announcement_mutes_on_announcement_id"
|
|
|
|
end
|
|
|
|
|
|
|
|
create_table "announcement_reactions", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "announcement_id"
|
|
|
|
t.string "name", default: "", null: false
|
|
|
|
t.bigint "custom_emoji_id"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id", "announcement_id", "name"], name: "index_announcement_reactions_on_account_id_and_announcement_id", unique: true
|
|
|
|
t.index ["account_id"], name: "index_announcement_reactions_on_account_id"
|
|
|
|
t.index ["announcement_id"], name: "index_announcement_reactions_on_announcement_id"
|
|
|
|
t.index ["custom_emoji_id"], name: "index_announcement_reactions_on_custom_emoji_id"
|
|
|
|
end
|
|
|
|
|
|
|
|
create_table "announcements", force: :cascade do |t|
|
|
|
|
t.text "text", default: "", null: false
|
|
|
|
t.boolean "published", default: false, null: false
|
|
|
|
t.boolean "all_day", default: false, null: false
|
|
|
|
t.datetime "scheduled_at"
|
|
|
|
t.datetime "starts_at"
|
|
|
|
t.datetime "ends_at"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2020-01-26 22:43:18 +01:00
|
|
|
t.datetime "published_at"
|
2020-04-05 12:51:22 +02:00
|
|
|
t.bigint "status_ids", array: true
|
2020-01-23 22:00:13 +01:00
|
|
|
end
|
|
|
|
|
2018-02-21 23:21:32 +01:00
|
|
|
create_table "backups", force: :cascade do |t|
|
|
|
|
t.bigint "user_id"
|
|
|
|
t.string "dump_file_name"
|
|
|
|
t.string "dump_content_type"
|
|
|
|
t.datetime "dump_updated_at"
|
|
|
|
t.boolean "processed", default: false, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2020-01-23 22:00:13 +01:00
|
|
|
t.bigint "dump_file_size"
|
2018-02-21 23:21:32 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "blocks", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "target_account_id", null: false
|
2018-05-04 21:14:34 +02:00
|
|
|
t.string "uri"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "target_account_id"], name: "index_blocks_on_account_id_and_target_account_id", unique: true
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["target_account_id"], name: "index_blocks_on_target_account_id"
|
2016-10-03 17:11:54 +02:00
|
|
|
end
|
|
|
|
|
2019-11-13 23:02:10 +01:00
|
|
|
create_table "bookmarks", force: :cascade do |t|
|
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "status_id", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id", "status_id"], name: "index_bookmarks_on_account_id_and_status_id", unique: true
|
|
|
|
t.index ["account_id"], name: "index_bookmarks_on_account_id"
|
|
|
|
t.index ["status_id"], name: "index_bookmarks_on_status_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "conversation_mutes", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.bigint "conversation_id", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "conversation_id"], name: "index_conversation_mutes_on_account_id_and_conversation_id", unique: true
|
Feature conversations muting (#3017)
* Add <ostatus:conversation /> tag to Atom input/output
Only uses ref attribute (not href) because href would be
the alternate link that's always included also.
Creates new conversation for every non-reply status. Carries
over conversation for every reply. Keeps remote URIs verbatim,
generates local URIs on the fly like the rest of them.
* Conversation muting - prevents notifications that reference a conversation
(including replies, favourites, reblogs) from being created. API endpoints
/api/v1/statuses/:id/mute and /api/v1/statuses/:id/unmute
Currently no way to tell when a status/conversation is muted, so the web UI
only has a "disable notifications" button, doesn't work as a toggle
* Display "Dismiss notifications" on all statuses in notifications column, not just own
* Add "muted" as a boolean attribute on statuses JSON
For now always false on contained reblogs, since it's only relevant for
statuses returned from the notifications endpoint, which are not nested
Remove "Disable notifications" from detailed status view, since it's
only relevant in the notifications column
* Up max class length
* Remove pending test for conversation mute
* Add tests, clean up
* Rename to "mute conversation" and "unmute conversation"
* Raise validation error when trying to mute/unmute status without conversation
2017-05-15 03:04:13 +02:00
|
|
|
end
|
|
|
|
|
2017-06-02 16:18:54 +02:00
|
|
|
create_table "conversations", force: :cascade do |t|
|
2019-07-28 17:47:37 +02:00
|
|
|
t.string "uri"
|
2017-05-12 19:09:21 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2019-07-28 17:47:37 +02:00
|
|
|
t.index ["uri"], name: "index_conversations_on_uri", unique: true
|
2017-05-12 19:09:21 +02:00
|
|
|
end
|
|
|
|
|
2019-06-28 15:54:10 +02:00
|
|
|
create_table "custom_emoji_categories", force: :cascade do |t|
|
|
|
|
t.string "name"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["name"], name: "index_custom_emoji_categories_on_name", unique: true
|
|
|
|
end
|
|
|
|
|
2017-09-19 02:42:40 +02:00
|
|
|
create_table "custom_emojis", force: :cascade do |t|
|
|
|
|
t.string "shortcode", default: "", null: false
|
|
|
|
t.string "domain"
|
|
|
|
t.string "image_file_name"
|
|
|
|
t.string "image_content_type"
|
|
|
|
t.integer "image_file_size"
|
|
|
|
t.datetime "image_updated_at"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2017-10-05 23:42:05 +02:00
|
|
|
t.boolean "disabled", default: false, null: false
|
2017-10-07 17:43:42 +02:00
|
|
|
t.string "uri"
|
|
|
|
t.string "image_remote_url"
|
2017-10-27 16:11:30 +02:00
|
|
|
t.boolean "visible_in_picker", default: true, null: false
|
2019-06-28 15:54:10 +02:00
|
|
|
t.bigint "category_id"
|
2020-04-26 23:29:08 +02:00
|
|
|
t.integer "image_storage_schema_version"
|
2017-09-19 02:42:40 +02:00
|
|
|
t.index ["shortcode", "domain"], name: "index_custom_emojis_on_shortcode_and_domain", unique: true
|
|
|
|
end
|
|
|
|
|
2018-06-29 15:34:36 +02:00
|
|
|
create_table "custom_filters", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.datetime "expires_at"
|
|
|
|
t.text "phrase", default: "", null: false
|
|
|
|
t.string "context", default: [], null: false, array: true
|
|
|
|
t.boolean "irreversible", default: false, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2018-08-09 09:56:53 +02:00
|
|
|
t.boolean "whole_word", default: true, null: false
|
2018-06-29 15:34:36 +02:00
|
|
|
t.index ["account_id"], name: "index_custom_filters_on_account_id"
|
|
|
|
end
|
|
|
|
|
2019-07-30 11:10:46 +02:00
|
|
|
create_table "domain_allows", force: :cascade do |t|
|
|
|
|
t.string "domain", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["domain"], name: "index_domain_allows_on_domain", unique: true
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "domain_blocks", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "domain", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.integer "severity", default: 0
|
2017-07-13 03:12:25 +02:00
|
|
|
t.boolean "reject_media", default: false, null: false
|
2018-10-20 08:02:44 +02:00
|
|
|
t.boolean "reject_reports", default: false, null: false
|
2019-08-07 20:20:23 +02:00
|
|
|
t.text "private_comment"
|
|
|
|
t.text "public_comment"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true
|
2016-10-09 14:48:43 +02:00
|
|
|
end
|
|
|
|
|
2017-10-04 15:16:10 +02:00
|
|
|
create_table "email_domain_blocks", force: :cascade do |t|
|
2017-11-14 20:37:17 +01:00
|
|
|
t.string "domain", default: "", null: false
|
2017-10-04 15:16:10 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2020-03-12 22:35:20 +01:00
|
|
|
t.bigint "parent_id"
|
2017-11-14 20:37:17 +01:00
|
|
|
t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true
|
2017-10-04 15:16:10 +02:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "favourites", force: :cascade do |t|
|
2016-02-23 19:17:37 +01:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "status_id", null: false
|
2017-07-26 03:35:25 +02:00
|
|
|
t.index ["account_id", "id"], name: "index_favourites_on_account_id_and_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "status_id"], name: "index_favourites_on_account_id_and_status_id", unique: true
|
|
|
|
t.index ["status_id"], name: "index_favourites_on_status_id"
|
2016-02-23 19:17:37 +01:00
|
|
|
end
|
|
|
|
|
2019-02-04 04:25:59 +01:00
|
|
|
create_table "featured_tags", force: :cascade do |t|
|
|
|
|
t.bigint "account_id"
|
|
|
|
t.bigint "tag_id"
|
|
|
|
t.bigint "statuses_count", default: 0, null: false
|
|
|
|
t.datetime "last_status_at"
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_featured_tags_on_account_id"
|
|
|
|
t.index ["tag_id"], name: "index_featured_tags_on_tag_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "follow_requests", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "target_account_id", null: false
|
Allow hiding of reblogs from followed users (#5762)
* Allow hiding of reblogs from followed users
This adds a new entry to the account menu to allow users to hide
future reblogs from a user (and then if they've done that, to show
future reblogs instead).
This does not remove or add historical reblogs from/to the user's
timeline; it only affects new statuses.
The API for this operates by sending a "reblogs" key to the follow
endpoint. If this is sent when starting a new follow, it will be
respected from the beginning of the follow relationship (even if
the follow request must be approved by the followee). If this is
sent when a follow relationship already exists, it will simply
update the existing follow relationship. As with the notification
muting, this will now return an object ({reblogs: [true|false]}) or
false for each follow relationship when requesting relationship
information for an account. This should cause few issues due to an
object being truthy in many languages, but some modifications may
need to be made in pickier languages.
Database changes: adds a show_reblogs column (default true,
non-nullable) to the follows and follow_requests tables. Because
these are non-nullable, we use the existing MigrationHelpers to
perform this change without locking those tables, although the
tables are likely to be small anyway.
Tests included.
See also <https://github.com/glitch-soc/mastodon/pull/212>.
* Rubocop fixes
* Code review changes
* Test fixes
This patchset closes #648 and resolves #3271.
* Rubocop fix
* Revert reblogs defaulting in argument, fix tests
It turns out we needed this for the same reason we needed it in muting:
if nil gets passed in somehow (most usually by an API client not passing
any value), we need to detect and handle it.
We could specify a default in the parameter and then also catch nil, but
there's no great reason to duplicate the default value.
2017-11-28 15:00:35 +01:00
|
|
|
t.boolean "show_reblogs", default: true, null: false
|
2018-05-04 21:14:34 +02:00
|
|
|
t.string "uri"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "target_account_id"], name: "index_follow_requests_on_account_id_and_target_account_id", unique: true
|
2016-12-22 23:03:57 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "follows", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "target_account_id", null: false
|
Allow hiding of reblogs from followed users (#5762)
* Allow hiding of reblogs from followed users
This adds a new entry to the account menu to allow users to hide
future reblogs from a user (and then if they've done that, to show
future reblogs instead).
This does not remove or add historical reblogs from/to the user's
timeline; it only affects new statuses.
The API for this operates by sending a "reblogs" key to the follow
endpoint. If this is sent when starting a new follow, it will be
respected from the beginning of the follow relationship (even if
the follow request must be approved by the followee). If this is
sent when a follow relationship already exists, it will simply
update the existing follow relationship. As with the notification
muting, this will now return an object ({reblogs: [true|false]}) or
false for each follow relationship when requesting relationship
information for an account. This should cause few issues due to an
object being truthy in many languages, but some modifications may
need to be made in pickier languages.
Database changes: adds a show_reblogs column (default true,
non-nullable) to the follows and follow_requests tables. Because
these are non-nullable, we use the existing MigrationHelpers to
perform this change without locking those tables, although the
tables are likely to be small anyway.
Tests included.
See also <https://github.com/glitch-soc/mastodon/pull/212>.
* Rubocop fixes
* Code review changes
* Test fixes
This patchset closes #648 and resolves #3271.
* Rubocop fix
* Revert reblogs defaulting in argument, fix tests
It turns out we needed this for the same reason we needed it in muting:
if nil gets passed in somehow (most usually by an API client not passing
any value), we need to detect and handle it.
We could specify a default in the parameter and then also catch nil, but
there's no great reason to duplicate the default value.
2017-11-28 15:00:35 +01:00
|
|
|
t.boolean "show_reblogs", default: true, null: false
|
2018-05-04 21:14:34 +02:00
|
|
|
t.string "uri"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["target_account_id"], name: "index_follows_on_target_account_id"
|
2016-02-22 16:00:20 +01:00
|
|
|
end
|
|
|
|
|
2018-11-27 13:56:25 +01:00
|
|
|
create_table "identities", force: :cascade do |t|
|
2018-02-04 05:42:13 +01:00
|
|
|
t.string "provider", default: "", null: false
|
|
|
|
t.string "uid", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2018-11-27 13:56:25 +01:00
|
|
|
t.bigint "user_id"
|
2018-02-04 05:42:13 +01:00
|
|
|
t.index ["user_id"], name: "index_identities_on_user_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "imports", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.integer "type", null: false
|
2017-07-13 03:12:25 +02:00
|
|
|
t.boolean "approved", default: false, null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.string "data_file_name"
|
|
|
|
t.string "data_content_type"
|
|
|
|
t.integer "data_file_size"
|
2017-03-30 19:42:33 +02:00
|
|
|
t.datetime "data_updated_at"
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
2019-02-03 03:59:51 +01:00
|
|
|
t.boolean "overwrite", default: false, null: false
|
2017-03-30 19:42:33 +02:00
|
|
|
end
|
|
|
|
|
2017-11-27 16:07:59 +01:00
|
|
|
create_table "invites", force: :cascade do |t|
|
2018-02-07 16:35:44 +01:00
|
|
|
t.bigint "user_id", null: false
|
2017-11-27 16:07:59 +01:00
|
|
|
t.string "code", default: "", null: false
|
|
|
|
t.datetime "expires_at"
|
|
|
|
t.integer "max_uses"
|
|
|
|
t.integer "uses", default: 0, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2018-06-15 18:00:23 +02:00
|
|
|
t.boolean "autofollow", default: false, null: false
|
2019-08-19 11:40:42 +02:00
|
|
|
t.text "comment"
|
2017-11-27 16:07:59 +01:00
|
|
|
t.index ["code"], name: "index_invites_on_code", unique: true
|
|
|
|
t.index ["user_id"], name: "index_invites_on_user_id"
|
|
|
|
end
|
|
|
|
|
2017-11-18 00:16:48 +01:00
|
|
|
create_table "list_accounts", force: :cascade do |t|
|
|
|
|
t.bigint "list_id", null: false
|
|
|
|
t.bigint "account_id", null: false
|
2019-11-04 13:02:01 +01:00
|
|
|
t.bigint "follow_id"
|
2017-11-18 00:16:48 +01:00
|
|
|
t.index ["account_id", "list_id"], name: "index_list_accounts_on_account_id_and_list_id", unique: true
|
|
|
|
t.index ["follow_id"], name: "index_list_accounts_on_follow_id"
|
|
|
|
t.index ["list_id", "account_id"], name: "index_list_accounts_on_list_id_and_account_id"
|
|
|
|
end
|
|
|
|
|
|
|
|
create_table "lists", force: :cascade do |t|
|
2017-12-12 04:11:17 +01:00
|
|
|
t.bigint "account_id", null: false
|
2017-11-18 00:16:48 +01:00
|
|
|
t.string "title", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["account_id"], name: "index_lists_on_account_id"
|
|
|
|
end
|
|
|
|
|
2019-09-06 13:55:51 +02:00
|
|
|
create_table "markers", force: :cascade do |t|
|
|
|
|
t.bigint "user_id"
|
|
|
|
t.string "timeline", default: "", null: false
|
|
|
|
t.bigint "last_read_id", default: 0, null: false
|
|
|
|
t.integer "lock_version", default: 0, null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.index ["user_id", "timeline"], name: "index_markers_on_user_id_and_timeline", unique: true
|
|
|
|
t.index ["user_id"], name: "index_markers_on_user_id"
|
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "media_attachments", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.bigint "status_id"
|
|
|
|
t.string "file_file_name"
|
|
|
|
t.string "file_content_type"
|
|
|
|
t.integer "file_file_size"
|
2016-09-05 17:46:36 +02:00
|
|
|
t.datetime "file_updated_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "remote_url", default: "", null: false
|
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
|
|
|
t.string "shortcode"
|
|
|
|
t.integer "type", default: 0, null: false
|
|
|
|
t.json "file_meta"
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id"
|
2017-09-28 15:31:31 +02:00
|
|
|
t.text "description"
|
2019-01-05 12:43:28 +01:00
|
|
|
t.bigint "scheduled_status_id"
|
2019-04-27 03:24:09 +02:00
|
|
|
t.string "blurhash"
|
2020-03-08 23:56:18 +01:00
|
|
|
t.integer "processing"
|
2020-04-26 23:29:08 +02:00
|
|
|
t.integer "file_storage_schema_version"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id"], name: "index_media_attachments_on_account_id"
|
2019-01-05 12:43:28 +01:00
|
|
|
t.index ["scheduled_status_id"], name: "index_media_attachments_on_scheduled_status_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["shortcode"], name: "index_media_attachments_on_shortcode", unique: true
|
|
|
|
t.index ["status_id"], name: "index_media_attachments_on_status_id"
|
2016-09-05 17:46:36 +02:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "mentions", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.bigint "status_id"
|
2016-02-25 00:17:01 +01:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id"
|
2018-10-17 17:13:04 +02:00
|
|
|
t.boolean "silent", default: false, null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "status_id"], name: "index_mentions_on_account_id_and_status_id", unique: true
|
|
|
|
t.index ["status_id"], name: "index_mentions_on_status_id"
|
2016-02-25 00:17:01 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "mutes", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2019-05-09 22:03:03 +02:00
|
|
|
t.boolean "hide_notifications", default: true, null: false
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "target_account_id", null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["target_account_id"], name: "index_mutes_on_target_account_id"
|
2017-02-06 02:51:56 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "notifications", force: :cascade do |t|
|
2018-03-24 12:51:28 +01:00
|
|
|
t.bigint "activity_id", null: false
|
|
|
|
t.string "activity_type", null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.datetime "updated_at", null: false
|
2018-03-24 12:51:28 +01:00
|
|
|
t.bigint "account_id", null: false
|
|
|
|
t.bigint "from_account_id", null: false
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["account_id", "activity_id", "activity_type"], name: "account_activity", unique: true
|
2017-12-26 17:56:31 +01:00
|
|
|
t.index ["account_id", "id"], name: "index_notifications_on_account_id_and_id", order: { id: :desc }
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["activity_id", "activity_type"], name: "index_notifications_on_activity_id_and_activity_type"
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["from_account_id"], name: "index_notifications_on_from_account_id"
|
2016-11-20 00:33:02 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "oauth_access_grants", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "token", null: false
|
|
|
|
t.integer "expires_in", null: false
|
|
|
|
t.text "redirect_uri", null: false
|
|
|
|
t.datetime "created_at", null: false
|
2016-03-07 12:42:33 +01:00
|
|
|
t.datetime "revoked_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "scopes"
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "application_id", null: false
|
|
|
|
t.bigint "resource_owner_id", null: false
|
2018-08-21 20:11:34 +02:00
|
|
|
t.index ["resource_owner_id"], name: "index_oauth_access_grants_on_resource_owner_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true
|
2016-03-07 12:42:33 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "oauth_access_tokens", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "token", null: false
|
|
|
|
t.string "refresh_token"
|
|
|
|
t.integer "expires_in"
|
2016-03-07 12:42:33 +01:00
|
|
|
t.datetime "revoked_at"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.datetime "created_at", null: false
|
|
|
|
t.string "scopes"
|
Make IdsToBigints (mostly!) non-blocking (#5088)
* Make IdsToBigints (mostly!) non-blocking
This pulls in GitLab's MigrationHelpers, which include code to make
column changes in ways that Postgres can do without locking. In general,
this involves creating a new column, adding an index and any foreign
keys as appropriate, adding a trigger to keep it populated alongside
the old column, and then progressively copying data over to the new
column, before removing the old column and replacing it with the new
one.
A few changes to GitLab's MigrationHelpers were necessary:
* Some changes were made to remove dependencies on other GitLab code.
* We explicitly wait for index creation before forging ahead on column
replacements.
* We use different temporary column names, to avoid running into index
name length limits.
* We rename the generated indices back to what they "should" be after
replacing columns.
* We rename the generated foreign keys to use the new column names when
we had to create them. (This allows the migration to be rolled back
without incident.)
# Big Scary Warning
There are two things here that may trip up large instances:
1. The change for tables' "id" columns is not concurrent. In
particular, the stream_entries table may be big, and does not
concurrently migrate its id column. (On the other hand, x_id type
columns are all concurrent.)
2. This migration will take a long time to run, *but it should not
lock tables during that time* (with the exception of the "id"
columns as described above). That means this should probably be run
in `screen` or some other session that can be run for a long time.
Notably, the migration will take *longer* than it would without
these changes, but the website will still be responsive during that
time.
These changes were tested on a relatively large statuses table (256k
entries), and the service remained responsive during the migration.
Migrations both forward and backward were tested.
* Rubocop fixes
* MigrationHelpers: Support ID columns in some cases
This doesn't work in cases where the ID column is referred to as a
foreign key by another table.
* MigrationHelpers: support foreign keys for ID cols
Note that this does not yet support foreign keys on non-primary-key
columns, but Mastodon also doesn't yet have any that we've needed to
migrate.
This means we can perform fully "concurrent" migrations to change ID
column types, and the IdsToBigints migration can happen with effectively
no downtime. (A few operations require a transaction, such as renaming
columns or deleting them, but these transactions should not block for
noticeable amounts of time.)
The algorithm for generating foreign key names has changed with this,
and therefore all of those changed in schema.rb.
* Provide status, allow for interruptions
The MigrationHelpers now allow restarting the rename of a column if it
was interrupted, by removing the old "new column" and re-starting the
process.
Along with this, they now provide status updates on the changes which
are happening, as well as indications about when the changes can be
safely interrupted (when there are at least 10 seconds estimated to be
left before copying data is complete).
The IdsToBigints migration now also sorts the columns it migrates by
size, starting with the largest tables. This should provide
administrators a worst-case scenario estimate for the length of
migrations: each successive change will get faster, giving admins a
chance to abort early on if they need to run the migration later. The
idea is that this does not force them to try to time interruptions
between smaller migrations.
* Fix column sorting in IdsToBigints
Not a significant change, but it impacts the order of columns in the
database and db/schema.rb.
* Actually pause before IdsToBigints
2017-10-02 21:28:59 +02:00
|
|
|
t.bigint "application_id"
|
|
|
|
t.bigint "resource_owner_id"
|
2017-06-02 16:18:54 +02:00
|
|
|
t.index ["refresh_token"], name: "index_oauth_access_tokens_on_refresh_token", unique: true
|
|
|
|
t.index ["resource_owner_id"], name: "index_oauth_access_tokens_on_resource_owner_id"
|
|
|
|
t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true
|
2016-03-07 12:42:33 +01:00
|
|
|
end
|
|
|
|
|
2017-09-22 13:20:04 +02:00
|
|
|
create_table "oauth_applications", force: :cascade do |t|
|
2017-06-02 16:18:54 +02:00
|
|
|
t.string "name", null: false
|
|
|
|
t.string "uid", null: false
|
|
|
|
t.string "secret", null: false
|
|
|
|
t.text "redirect_uri", null: false
|
|
|
|
t.string "scopes", default: "", null: false
|
2016-03-07 12:42:33 +01:00
|
|
|
t.datetime "created_at"
|
|
|
|
t.datetime "updated_at"
|
2017-08-23 00:59:35 +02:00
|
|
|
t.boolean "superapp", default: false, null: false
|
|