Defect #33121

IssueQuery not usable from plugins

Added by Stefan Rinkes 12 months ago. Updated about 1 month ago.

Status:NewStart date:
Priority:NormalDue date:
Assignee:Jean-Philippe Lang% Done:

0%

Category:Plugin API
Target version:4.1.2
Resolution: Affected version:4.1.0

Description

I'm currently working on updating some plugins for the usage with Redmine 4.1.0.

And noticed I cannot init Redmine while my plugins are already located in plugins-folder.

I stripped it down to an patch for IssueQuery included in the plugin.

Here's a minimal plugin to trigger the issue:

require 'redmine'

module RedmineA
  module IssueQueryPatch
  end

  module ProjectPatch
  end
end

Rails.configuration.to_prepare do
  unless Project.included_modules.include? RedmineA::ProjectPatch
    Project.send(:include, RedmineA::ProjectPatch)
  end

  unless IssueQuery.included_modules.include? RedmineA::IssueQueryPatch
    IssueQuery.send(:include, RedmineA::IssueQueryPatch)
  end
end

Redmine::Plugin.register :redmine_a do
  name 'Redmine Test Plugin'
  author 'Stefan Rinkes'
  description 'To show IssueQuery-Patch failure'
  version '0.0.0'
end

Place this as /usr/src/redmine/plugins/redmine_a/init.rb and try to create a brand new database.

# rake db:create
W, [2020-03-10T14:00:19.875929 #12605]  WARN -- : Creating scope :system. Overwriting existing method Enumeration.system.
W, [2020-03-10T14:00:19.905024 #12605]  WARN -- : Creating scope :sorted. Overwriting existing method Group.sorted.
W, [2020-03-10T14:00:19.949338 #12605]  WARN -- : Creating scope :sorted. Overwriting existing method User.sorted.
rake aborted!
ActiveRecord::NoDatabaseError: Unknown database 'redmine_test'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:26:in `rescue in mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:12:in `mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:830:in `new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:874:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `try_to_checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:814:in `acquire_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:538:in `checkout'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:382:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1033:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_handling.rb:90:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:466:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/attributes.rb:234:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/attribute_decorators.rb:51:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:459:in `block in load_schema'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:456:in `load_schema'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:336:in `columns_hash'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/inheritance.rb:78:in `descends_from_active_record?'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/inheritance.rb:84:in `finder_needs_type_condition?'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/core.rb:287:in `relation'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/scoping/default.rb:34:in `unscoped'
/usr/src/redmine/app/models/user.rb:822:in `anonymous'
/usr/src/redmine/app/models/user.rb:816:in `current'
/usr/src/redmine/app/models/query.rb:91:in `groupable'
/usr/src/redmine/app/models/query.rb:31:in `initialize'
/usr/src/redmine/app/models/issue_query.rb:36:in `new'
/usr/src/redmine/app/models/issue_query.rb:36:in `<class:IssueQuery>'
/usr/src/redmine/app/models/issue_query.rb:20:in `<top (required)>'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `block in require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:257:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:378:in `block in require_or_load'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:37:in `block in load_interlock'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies/interlock.rb:14:in `block in loading'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/concurrency/share_lock.rb:151:in `exclusive'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies/interlock.rb:13:in `loading'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:37:in `load_interlock'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:356:in `require_or_load'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:510:in `load_missing_constant'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:195:in `const_missing'
/usr/src/redmine/plugins/redmine_a/init.rb:16:in `block in <top (required)>'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:426:in `instance_exec'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:426:in `block in make_lambda'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:198:in `block (2 levels) in halting'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:606:in `block (2 levels) in default_terminator'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:605:in `catch'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:605:in `block in default_terminator'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:199:in `block in halting'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `block in invoke_before'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `each'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `invoke_before'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:131:in `run_callbacks'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/reloader.rb:89:in `prepare!'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application/finisher.rb:63:in `block in <module:Finisher>'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:32:in `instance_exec'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:32:in `run'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:60:in `run_initializers'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:361:in `initialize!'
/usr/src/redmine/config/environment.rb:16:in `<top (required)>'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:337:in `require'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:337:in `require_environment!'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:520:in `block in run_tasks_blocks'
/usr/local/bundle/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'

Caused by:
Mysql2::Error: Unknown database 'redmine_test'
/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect'
/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:830:in `new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:874:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `try_to_checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:814:in `acquire_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:538:in `checkout'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:382:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1033:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/connection_handling.rb:90:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:466:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/attributes.rb:234:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/attribute_decorators.rb:51:in `load_schema!'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:459:in `block in load_schema'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:456:in `load_schema'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/model_schema.rb:336:in `columns_hash'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/inheritance.rb:78:in `descends_from_active_record?'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/inheritance.rb:84:in `finder_needs_type_condition?'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/core.rb:287:in `relation'
/usr/local/bundle/gems/activerecord-5.2.4.1/lib/active_record/scoping/default.rb:34:in `unscoped'
/usr/src/redmine/app/models/user.rb:822:in `anonymous'
/usr/src/redmine/app/models/user.rb:816:in `current'
/usr/src/redmine/app/models/query.rb:91:in `groupable'
/usr/src/redmine/app/models/query.rb:31:in `initialize'
/usr/src/redmine/app/models/issue_query.rb:36:in `new'
/usr/src/redmine/app/models/issue_query.rb:36:in `<class:IssueQuery>'
/usr/src/redmine/app/models/issue_query.rb:20:in `<top (required)>'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `block in require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:257:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:291:in `require'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:378:in `block in require_or_load'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:37:in `block in load_interlock'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies/interlock.rb:14:in `block in loading'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/concurrency/share_lock.rb:151:in `exclusive'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies/interlock.rb:13:in `loading'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:37:in `load_interlock'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:356:in `require_or_load'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:510:in `load_missing_constant'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/dependencies.rb:195:in `const_missing'
/usr/src/redmine/plugins/redmine_a/init.rb:16:in `block in <top (required)>'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:426:in `instance_exec'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:426:in `block in make_lambda'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:198:in `block (2 levels) in halting'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:606:in `block (2 levels) in default_terminator'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:605:in `catch'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:605:in `block in default_terminator'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:199:in `block in halting'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `block in invoke_before'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `each'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:513:in `invoke_before'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/callbacks.rb:131:in `run_callbacks'
/usr/local/bundle/gems/activesupport-5.2.4.1/lib/active_support/reloader.rb:89:in `prepare!'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application/finisher.rb:63:in `block in <module:Finisher>'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:32:in `instance_exec'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:32:in `run'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/initializable.rb:60:in `run_initializers'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:361:in `initialize!'
/usr/src/redmine/config/environment.rb:16:in `<top (required)>'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:337:in `require'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:337:in `require_environment!'
/usr/local/bundle/gems/railties-5.2.4.1/lib/rails/application.rb:520:in `block in run_tasks_blocks'
/usr/local/bundle/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:create => db:load_config => environment
(See full trace by running task with --trace)

Removing the plugin will let you create the database and works flawlessy once the database is there.


Related issues

Related to Redmine - Patch #33290: Stop DB access when IssueQuery class is defined New

History

#1 Updated by Ko Nagase about 1 month ago

Well, I encountered almost the same issue in our plugin.
(Note that Redmine 4.0-stable branch is no problem.)

#2 Updated by Jens Krämer about 1 month ago

As a workaround catching ActiveRecord::NoDatabaseError in the to_prepare block should do the trick.

#3 Updated by Ko Nagase about 1 month ago

Well, catching ActiveRecord::NoDatabaseError solved the rake db:create issue,
but when executing rake db:drop (without rake db:migrate), I encountered the following error on PostgreSQL database.


rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description(a.attrelid, a.attnum) AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                LEFT JOIN pg_type t ON a.atttypid = t.oid
                LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
               WHERE a.attrelid = '"users"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum
:

I confirmed that applying the following redmine core patch solved the both rake db:create and rake db:drop case, but is this acceptable way ?

--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -87,7 +87,9 @@ end
 class TimestampQueryColumn < QueryColumn
   def groupable
     if @groupable
-      Redmine::Database.timestamp_to_date(sortable, User.current.time_zone)
+      if ActiveRecord::Base.connection_pool.connected? and ActiveRecord::Base.connection.table_exists?(:users)
+        Redmine::Database.timestamp_to_date(sortable, User.current.time_zone)
+      end
     end
   end

#4 Updated by Kevin Fischer about 1 month ago

#33290 is related to this and the patch attached there should solve this problem, too

#5 Updated by Marius BALTEANU about 1 month ago

  • Related to Patch #33290: Stop DB access when IssueQuery class is defined added

#6 Updated by Marius BALTEANU about 1 month ago

  • Target version set to 4.1.2

Assign this to 4.1.2 in order to be review together with #33290. It seems to be the same problem.

#7 Updated by Marius BALTEANU about 1 month ago

  • Assignee set to Jean-Philippe Lang

Also available in: Atom PDF