Commit Graph
28 Commits
Author SHA1 Message Date
rubic0n 9b17b0a553 Reduce array allocations by using a constant 2021-02-18 00:54:29 -06:00
rubic0n b1445d09b6 Remove 40KB of allocations (4,100 objects) from home feed
(When using dummy data)

* to_s(16) allocates a string per character
  Instead of converting the ord to hex and determining if the hex
  is over 2 characters long, just see if the ord is over 255.
* .match allocates a MatchData instance and sets all sorts of backrefs
  ($1, $2, etc). match? just returns a boolean.
2021-02-18 00:45:21 -06:00
rubic0n 006322cff7 Remove Hash allocation
merge! takes a Hash as an argument. Rather than allocating a Hash,
just use two different `=` calls, to achieve the same result.
2021-02-18 00:35:31 -06:00
rubic0n a623252c59 Convert to boolean in C code
casecmp?(str) is 1.5x faster than casecmp(str).zero?
It's 1 less method call in Ruby, and the C code can convert
to boolean, rather than returning a number and determining
if it's zero.
2021-02-17 23:25:10 -06:00
rubic0n 0c7019f1e8 Add Benchmark IPS gem, to A/B test code 2021-02-17 23:24:34 -06:00
rubic0n 73c0e50936 Prevent constant ElasticAPM warnings in development by disabling it
No changes are needed in prod, since the `enabled` setting defaults
to "true", and prod obviously isn't setting this ENV.
2021-02-13 23:20:43 -06:00
rubic0n f472a6154e Mark the replicas as replicas
Rails won't even attempt to write to a replica. Without this option,
a write attempt would actually run against Postgres, and it would
be up to Postgres to throw a readonly error.

Additionally, marking it as a replica teaches ActiveRecord that it
should not attempt to run migrations against this connection.

https://api.rubyonrails.org/classes/ActiveRecord/DatabaseConfigurations.html#method-i-configs_for

I'm actually pretty sure that the lack of `replica: true`
is why there's currently a db/slave1_schema.rb and db/slave2_schema.rb
2021-02-13 23:20:43 -06:00
rubic0n 903b6c7969 Simplify database.yml by merging in default options
Anything in the &default section can be merged in using <<: *default
In this case, the default already specifies that the adapter is
postgresql, the timeout is 5000, the encoding is unicode. It also
already specified the db pool, but the default actually checked 2
different ENVs and provided a fallback if it's not provided.
Lastly, I was able to move the prepared_statements section to the
defaults, because the .env.vagrant file doesn't specify
ENV['PREPARED_STATEMENTS'], development still just sets it to
'false'.
2021-02-13 23:20:43 -06:00
rubic0n 70c44fc68d Fix vagrant now that Rails 6 replicas are being used 2021-02-13 23:20:43 -06:00
rubic0n 6221581cf0 Create script to generate dummy data, for perf investigation 2021-02-13 23:20:43 -06:00
rubic0n 1179957a32 Start redis server on VM boot
Otherwise you have to start it yourself after vagrant halt / vagrant up
2021-02-13 23:20:43 -06:00
rubic0n 9331f06784 Add rack-mini-profiler, to diagnose perf issues 2021-02-13 23:20:43 -06:00
rubic0n 57a88c5904 Avoid redundant OAuth queries when not signed in
If you aren't signed in, you don't have an auth token.
When you don't have an auth token, React was sending the headers

"Authorization: Bearer null"

This caused 5 Doorkeeper token lookups using
WHERE "oauth_access_tokens"."token" = 'null'
on the Explore page (the root of the app when not signed in).
2021-02-06 22:41:35 -06:00
rubic0n 02bbe4304b Upgrade to Puma 5.2.0 (from 5.1.1)
Most notable change:
10x latency improvement for MRI on ssl connections by reducing overhead

https://github.com/puma/puma/releases/tag/v5.2.0
2021-02-01 00:00:43 -06:00
rubic0n 87c41ede7a Load Rails 6.0 defaults and remove 6.0 migration initializer 2021-01-31 17:39:13 -06:00
rubic0n 8c018b8088 Don't autoload in initializers: SidekiqErrorHandler
DEPRECATION WARNING: Initialization autoloaded the constant
SidekiqErrorHandler.
2021-01-31 17:39:13 -06:00
rubic0n 497ec0c1db Teach Zeitwerk that REST is the class name, not Rest
Also add a comment about the inflector settings.

NameError: uninitialized constant InitialStateSerializer::REST
Did you mean?  Rest
/vagrant/app/serializers/initial_state_serializer.rb:7:in `<class:InitialStateSerializer>'
/vagrant/app/serializers/initial_state_serializer.rb:3:in `<main>'
2021-01-31 17:39:13 -06:00
rubic0n bee832d4ef Fix Zeitwerk load error for SanitizeConfig
"expected file app/lib/sanitize_config.rb to define constant
SanitizeConfig"
2021-01-31 17:39:13 -06:00
rubic0n 2b9144d50c Fix "NameError: uninitialized constant Exceptions"
Zeitwerk operates on files in the autoload paths. Since the
entire "app" directory is autoloaded, all files inside need to
play by Zeitwerk's rules. Zeitwerk expects that a file named
"exceptions.rb" would define a constant named "Exceptions".

The exceptions file doesn't follow Zeitwerk's conventions.
The easiest way to solve this is to move the execptions out of
app/lib and into lib, where `require_relative` doesn't have
Zeitwerk taken into account.
2021-01-31 17:39:13 -06:00
rubic0n f77fa3ca4a Fix autoloading in initialization
DEPRECATION WARNING: Initialization autoloaded the constants
ActionText::ContentHelper and ActionText::TagHelper.

https://github.com/rails/rails/issues/36546

Rails has a Railtie that will take the config setting out of Rails
config, and put it onto ActionController when ActionController is
loaded. Calling ActionController in the initializer forces it to
autoload right now. Referencing the setting through the config allows
it to autoload in when it needs to.
2021-01-31 17:04:58 -06:00
rubic0n 2f95b0d67e Enable remaining settings
- use_cookies_with_metadata
  Provided extra options for cookies. Existing cookies will work fine.
  https://github.com/rails/rails/issues/36546
- return_only_media_type_on_content_type
  Include the charset in the content type. Looking at the headers that
  are being returned, it already did this.
- Use Zeitwerk as the autoloader
  https://github.com/fxn/zeitwerk
2021-01-31 17:04:58 -06:00
rubic0n 2952c9f59d Simplify db config 2021-01-24 23:57:30 -06:00
rubic0n 1b9349bc52 Remove unnecessary queries from requested conversations count 2021-01-24 23:19:20 -06:00
rubic0n 28beb28a78 Upgrade to Rails 6
- Added listen gem because rails app:update failed without it
- Removes nsa gem because it requires activesupport < 6
  Oddly, there's a newer version per GitHub that's not on RubyGems
  that raises the requirement to < 7. But, we need a new release
  before we can use that.
- Upgrade rails-i18n to v6, for Rails 6 compatibility
- Remove redis-rails since it requires Rails < 6, but we can just use
  the regular Rails :redis_cache_store that was introduced in 5.2.
- Run `rails app:update`
  - Had to weed through the `config/environments` changes to pick up
    newly added settings, while not losing settings that were
    intentionally configured
  - This generated config/initializers/new_framework_defaults_6_0.rb.
    The goal is to uncomment all of the settings in that file. Once
    they're all uncommented, delete the file and edit
    config/application.rb's load_defaults to be 6.0.
  - force_ssl controller method is deprecated in favor of a Rails
    config setting.
  - bin/setup was generated by Rails
  - Verbose query logging in development is really helpful. It shows
    you what line of code caused a query to execute.
  - Calling establish_connection after worker boot isn't necessary
    with ActiveRecord anymore. ActiveRecord handles it gracefully.
  - Rails generated a migration to add a foreign key for ActiveStorage.
    Gab currently doesn't use ActiveStorage, and instead uses Paperclip
    (since ActiveStorage didn't exist when Mastadon started). So, this
    change isn't relevant to Gab.
- Added ` || ''` in the profiles controller, because I was unable
  to save a change to a newly created profile. (This probably
  explains the 500 error I received on prod Gab recently.)
2021-01-23 09:01:31 -06:00
rubic0n 70c29c6cbd Fix "ERR! error: password authentication failed for user "vagrant"" 2021-01-23 09:00:35 -06:00
rubic0n 590dfc97e1 Run pending migrations 2021-01-22 22:53:38 -06:00
rubic0n 4f4f248fa1 postgresql_makara adapter is Postgres, not MySQL 2021-01-22 22:53:38 -06:00
rubic0n 194971da19 Install Redis 4+ since Sidekiq 5 needs that 2021-01-22 22:53:38 -06:00