| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The following PR adds behavior to Rails to allow an application to
automatically switch it's connection from the primary to the replica.
A request will be sent to the replica if:
* The request is a read request (`GET` or `HEAD`)
* AND It's been 2 seconds since the last write to the database (because
we don't want to send a user to a replica if the write hasn't made it
to the replica yet)
A request will be sent to the primary if:
* It's not a GET/HEAD request (ie is a POST, PATCH, etc)
* Has been less than 2 seconds since the last write to the database
The implementation that decides when to switch reads (the 2 seconds) is
"safe" to use in production but not recommended without adequate testing
with your infrastructure. At GitHub in addition to the a 5 second delay
we have a curcuit breaker that checks the replication delay
and will send the query to a replica before the 5 seconds has passed.
This is specific to our application and therefore not something Rails
should be doing for you. You'll need to test and implement more robust
handling of when to switch based on your infrastructure. The auto
switcher in Rails is meant to be a basic implementation / API that acts
as a guide for how to implement autoswitching.
The impementation here is meant to be strict enough that you know how to
implement your own resolver and operations classes but flexible enough
that we're not telling you how to do it.
The middleware is not included automatically and can be installed in
your application with the classes you want to use for the resolver and
operations passed in. If you don't pass any classes into the middleware
the Rails default Resolver and Session classes will be used.
The Resolver decides what parameters define when to
switch, Operations sets timestamps for the Resolver to read from. For
example you may want to use cookies instead of a session so you'd
implement a Resolver::Cookies class and pass that into the middleware
via configuration options.
```
config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = MyResolver
config.active_record.database_operations = MyResolver::MyCookies
```
Your classes can inherit from the existing classes and reimplment the
methods (or implement more methods) that you need to do the switching.
You only need to implement methods that you want to change. For example
if you wanted to set the session token for the last read from a replica
you would reimplement the `read_from_replica` method in your resolver
class and implement a method that updates a new timestamp in your
operations class.
|
|\
| |
| | |
Activejob typo fixes.
|
|/ |
|
|\
| |
| | |
MySQL: Support `:size` option to change text and blob size
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
In MySQL, the text column size is 65,535 bytes by default (1 GiB in
PostgreSQL). It is sometimes too short when people want to use a text
column, so they sometimes change the text size to mediumtext (16 MiB) or
longtext (4 GiB) by giving the `limit` option.
Unlike MySQL, PostgreSQL doesn't allow the `limit` option for a text
column (raises ERROR: type modifier is not allowed for type "text").
So `limit: 4294967295` (longtext) couldn't be used in Action Text.
I've allowed changing text and blob size without giving the `limit`
option, it prevents that migration failure on PostgreSQL.
|
|\ \
| | |
| | |
| | |
| | | |
Fix usage documentation in VideoAnalyzer
[ci skip]
|
|/ /
| |
| | |
The code snippet within the usage documentation comment used the wrong object namespace for the ActiveStorage::Analyzer::VideoAnalyzer
|
|\ \
| | |
| | | |
Add line break to Action Text installation outputs
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The Action Text installations appends `require("trix")` to the application.js file. The problem is that there isn't a line break in the beginning of the installation output, leading to syntax errors, e.g.:
```
import './application.scss'require("trix")
```
This commit moves the line break from the end to the beginning of the output, fixing it to:
```
import './application.scss'
require("trix")
```
|
|\ \ \
| |_|/
|/| | |
More Read-Only Changes
|
| | |
| | |
| | |
| | |
| | | |
That method doesn't exist on LookupContext, so the delegate doesn't make
sense.
|
| | |
| | |
| | |
| | | |
We can remove the ivar by caching the digest on the stack
|
| | |
| | |
| | |
| | |
| | |
| | | |
This gets the PartialRenderer to be a bit closer to the
TemplateRenderer. TemplateRenderer already keeps its template in a
local variable.
|
| | |
| | |
| | |
| | | |
This method is private, and we always pass something in.
|
| | |
| | |
| | |
| | | |
Similar to 1853b0d0abf87dfdd4c3a277c3badb17ca19652e
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This reduces the surface area of our API and removes a Liskov issue.
Both TemplateRenderer and PartialRenderer inherit from AbstractRenderer,
but since PartialRenderer implements it's own `find_template` that is
private, and has the wrong method signature, an instance of
PartialRenderer cannot be substituted for an instance of
AbstractRenderer renderer. Removing the superclass implementation
solves both issues.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This patch changes `with_fallbacks` to be a factory method that returns
a new instance of a lookup context which contains the fallback view
paths in addition to the controller specific view paths. Since the
lookup context is more "read only", we may be able to cache them
|
|/ /
| |
| |
| | |
This reverts commit 30f666f87ab873258b797b39f29cf852f7621bea.
|
|\ \
| | |
| | | |
Make the lookup context more "read-only"
|
| | |
| | |
| | |
| | |
| | |
| | | |
The `with_fallbacks` method will temporarily mutate the lookup context
instance, but nobody can call the setter, and we don't have to do a push
/ pop dance.
|
| | |
| | |
| | |
| | |
| | |
| | | |
We can't use the FixtureResolver as a hash key because it doesn't
implement `hash` correctly. This commit renames the method to "data"
(which is just as unfortunately named :( )
|
|\ \ \
| | | |
| | | | |
PostgreSQL: Use native timestamp decoders of pg-1.1
|
| | | |
| | | |
| | | |
| | | |
| | | | |
This improves performance of timestamp conversion and avoids
additional string allocations.
|
| |/ /
|/| |
| | |
| | | |
Follow up #34956.
|
|\ \ \
| | | |
| | | |
| | | |
| | | | |
alkesh26/actionpack-long-string-indentation-and-typo-fix
Actionpack typo fixes.
|
| | | | |
|
| |_|/
|/| | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Because eager load paths support to using `Pathname`, and `Pathname`
doesn't have `length` method.
Ref: https://travis-ci.org/rails/rails/jobs/485088071#L5140-L5143
Follow up aadeed1518b9092ea21adf49c728172368129f0e.
|
| |/
|/| |
|
| |
| |
| |
| | |
Follow-up to #35055.
|
|\ \
| | |
| | | |
Make `t.timestamps` with precision by default.
|
| | | |
|
|\ \ \
| |/ /
|/| | |
Fix error saving Action Text content containing non-blob attachables
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Failing test before the ActionText::RichText change:
```
Error:
ActionText::ModelTest#test_embed_extraction_only_extracts_file_attachments:
ArgumentError: Could not find or build blob: expected attachable, got #<ActionText::Attachables::RemoteImage:0x00007fb0259fef70 @url="http://example.com/cat.jpg", @content_type="image", @width=nil, @height=nil>
```
|
| | | |
|
| | | |
|
| | | |
|
|\ \ \
| | | |
| | | | |
document the possibility of app initializers running before gem initializers
|
| | | |
| | | |
| | | | |
and suggest a workaround
|
|\ \ \ \
| | | | |
| | | | | |
Use Ubuntu Xenial (16.04) at Travis CI
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
https://docs.travis-ci.com/user/reference/xenial/
* MySQL 5.7 and PostgreSQL 10 is available by default
https://docs.travis-ci.com/user/reference/xenial/#databases-and-services
* No matrixes necessary for "GEM=activerecord:mysql2", "GEM=activerecord:postgresql", "GEM=railties"
and "GEM=actionmailer,activemodel,activesupport,actionview,activejob,activestorage,actionmailbox,actiontext"
* Run mysql_upgrade for MariaDB
* Increase ramfs size before install for "GEM=activerecord:postgresql"
* Use FFMpeg 3.x using ppa:jonathonf/ffmpeg-3
Ubuntu 16.04 installs FFMpeg version 2.x by default, which
does not pass two of Active Stroage tests reported at https://github.com/rails/rails/issues/34921
* Use `rabbitmq-server` package and service
* Update bundler and rubygems to address "Could not find 'bundler' (1.17.2)" for ruby-head
```
$ bundle install --jobs 3 --retry 3
Traceback (most recent call last):
2: from /home/travis/.rvm/rubies/ruby-head/bin/bundle:30:in `<main>'
1: from /home/travis/.rvm/rubies/ruby-head/lib/ruby/2.7.0/rubygems.rb:302:in `activate_bin_path'
/home/travis/.rvm/rubies/ruby-head/lib/ruby/2.7.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (1.17.2) required by your /home/travis/build/rails/rails/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.\nTo install the missing version, run `gem install bundler:1.17.2`\n
```
* Use oraclejdk11 (18.9 LTS) to address the following error
```
$ ~/bin/install-jdk.sh --target "/home/travis/oraclejdk8" --workspace "/home/travis/.cache/install-jdk" --feature "8" --license "BCL"
install-jdk.sh 2018-10-17
Expected feature release number in range of 9 to 13, but got: 8
```
Refer:
https://docs.travis-ci.com/user/reference/xenial/#jvm-clojure-groovy-java-scala-support
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
In master, tests pass because `bigdecimal/util` requires in
`active_support/xml_mini`.
But test fails in 5-2-stable because that require does not exist.
Ref: https://travis-ci.org/rails/rails/jobs/484627996#L1969
|
|\ \ \ \ \
| | | | | |
| | | | | | |
Ensure that `redirect_back` with `fallback_location` to another host is allowed
|
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
I would like to add those tests to prevent regression.
|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
Since "actionpack" is not included in isolation test.
Ref: https://travis-ci.org/rails/rails/jobs/484514392#L2715
|
|\ \ \ \ \ \
| |_|_|_|/ /
|/| | | | | |
Switch queue_classic back to origin repository
|
| | |_|/ /
| |/| | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
It has been moved to the a fork as part of https://github.com/rails/rails/pull/31671 .
That was since to that time a required PR was not yet merged.
Now the queue_classic master branch is compatible to recent pg versions,
so that there's no need to keep using a fork.
|
|\ \ \ \ \
| |/ / / /
|/| | | | |
Fixed a bug where the debug view does not show the error page properly
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
There are two cases where the debug view does not show the error details
properly:
* When the cause is mapped to an HTTP status code the last exception is
unexpectedly uwrapped
* When the last error is thrown from a view template the debug view is
not using the `rescues/template_error.html.erb` to generate the view
Both the cases could be fixed by not unwrapping the exception. The only
case where the exception should be unwrapped is when the last error is
an `ActionView::Template::Error` object. In this case the HTTP status
code is determined based on the cause.
There are actually more wrapper exceptions that are intentionally
thrown. However, there is a consistent pattern of setting the original
message and original backtrace to the wrapper exception implemented, so
the debug view will not lose the information about what went wrong
eariler.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
Fix error raised when handler doesn't exist
|