diff --git a/README.md b/README.md index 20c2ab5b..fb02277b 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ In order to execute code submissions using the [DockerContainerPool](https://git - We recommend using [Capistrano](https://capistranorb.com/) for deployment. - Once deployed, CodeOcean assumes to run exclusively under a (sub)domain. If you want to use it under a custom subpath, you can specify the desired path using an environment variable: `RAILS_RELATIVE_URL_ROOT=/codeocean`. Please ensure to rebuild all assets and restart the server to apply the new path. +- When using [PgBouncer](https://www.pgbouncer.org), please make sure to correctly set the `intervalstyle` to `iso_8601` for the database. Otherwise, the application will not be able to parse timestamps correctly. See [a similar issue here](https://gitlab.com/gitlab-org/gitlab/-/issues/349912) and [our migration](./db/migrate/20221206221333_set_database_interval_style.rb) for more details. ## Monitoring - We use a [Prometheus Exporter](https://github.com/discourse/prometheus_exporter) and a [Telegraf Client](https://github.com/jgraichen/telegraf-ruby) diff --git a/db/migrate/20221206221333_set_database_interval_style.rb b/db/migrate/20221206221333_set_database_interval_style.rb new file mode 100644 index 00000000..e7968d2a --- /dev/null +++ b/db/migrate/20221206221333_set_database_interval_style.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class SetDatabaseIntervalStyle < ActiveRecord::Migration[7.0] + # We set the intervalstyle to ISO 8601 for the current database. + # Without this change, a transaction-based PgBouncer might cause + # issues with when switching between different sessions (e.g., by + # returning intervals in the default intervalstyle). + + def change + connection = ActiveRecord::Base.connection + dbname = connection.current_database + + reversible do |dir| + dir.up do + execute <<~SQL.squish + ALTER DATABASE "#{dbname}" SET intervalstyle = 'iso_8601'; + SQL + end + + dir.down do + execute <<~SQL.squish + ALTER DATABASE "#{dbname}" SET intervalstyle = 'postgres'; + SQL + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index bcec5078..32fd3c5a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2022_12_04_120508) do +ActiveRecord::Schema[7.0].define(version: 2022_12_06_221333) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" enable_extension "pgcrypto" diff --git a/db/seeds.rb b/db/seeds.rb index 3136b9df..a57b49f9 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -22,6 +22,10 @@ end Rails.application.eager_load! (ApplicationRecord.descendants - [ActiveRecord::SchemaMigration, User]).each(&:delete_all) +# Set the default intervalstyle to iso_8601 +dbname = ApplicationRecord.connection.current_database +ApplicationRecord.connection.exec_query("ALTER DATABASE \"#{dbname}\" SET intervalstyle = 'iso_8601';") + # delete file uploads FileUtils.rm_rf(Rails.public_path.join('uploads'))