Project

General

Profile

Actions

Defect #2882

closed

trackers doubled

Added by Robert Cerny about 15 years ago. Updated almost 15 years ago.

Status:
Closed
Priority:
Normal
Category:
Database
Target version:
-
Start date:
2009-03-02
Due date:
% Done:

100%

Estimated time:
Resolution:
Cant reproduce
Affected version:

Description

Hello guys,
we used to use 0.7.3 for long time in our company. Suddenly several months ago we found that tracker names are doubled (New Issue). I checked the database contents but it looks like it's correct

mysql> select * from trackers;
+----+--------------------+-------------+----------+---------------+
| id | name               | is_in_chlog | position | is_in_roadmap |
+----+--------------------+-------------+----------+---------------+
|  1 | Chyba              |           1 |        1 |             0 | 
|  2 | Vylepšení        |           1 |        2 |             1 | 
|  3 | Podpora na místě |           1 |        3 |             1 | 
|  4 | Podpora vzdáleně |           0 |        4 |             1 | 
|  6 | Reklamace          |           1 |        5 |             1 | 
|  7 | Objednávka        |           0 |        6 |             1 | 
|  8 | Dotaz              |           1 |        7 |             1 | 
+----+--------------------+-------------+----------+---------------+

We didn't care about it much because it's just a small cosmetic issue. I decided to upgrade to 0.8.1 today and the doubled trackers are still on place. Is there any help for me?


Files

Redmine.html (12.4 KB) Redmine.html Robert Cerny, 2009-03-04 18:35
2882-use-uniq-for-habtm.patch (3.06 KB) 2882-use-uniq-for-habtm.patch Use uniq on the HABTM association instead of a db unique index Eric Davis, 2009-05-18 18:41
Actions #1

Updated by Jean-Philippe Lang about 15 years ago

Not able to reproduce. Can you attach the html source of the page where it happens please?

Actions #2

Updated by Robert Cerny about 15 years ago

Enclosed please find requested data

Actions #3

Updated by Jean-Philippe Lang about 15 years ago

Maybe you have duplicated rows in your projects_trackers table (this table stores this association between project and trackers).
Can you check that?

Actions #4

Updated by Robert Cerny about 15 years ago

mysql> select * from projects_trackers;
+------------+------------+
| project_id | tracker_id |
+------------+------------+
|          1 |          1 | 
|          1 |          2 | 
|          2 |          3 | 
|          3 |          1 | 
|          3 |          3 | 
|          5 |          3 | 
|          5 |          2 | 
|          5 |          4 | 
|          3 |          4 | 
|          2 |          1 | 
|          2 |          2 | 
|          2 |          4 | 
|          6 |          1 | 
|          6 |          2 | 
|          6 |          3 | 
|          6 |          4 | 
|          5 |          1 | 
|          8 |          1 | 
|          8 |          2 | 
|          9 |          1 | 
|          9 |          2 | 
|          9 |          3 | 
|          9 |          4 | 
|          2 |          6 | 
|         11 |          1 | 
|         11 |          2 | 
|         12 |          7 | 
|          5 |          6 | 
|          5 |          7 | 
|         13 |          1 | 
|         13 |          2 | 
|          2 |          7 | 
|         14 |          1 | 
|         14 |          2 | 
|         13 |          8 | 
|          1 |          1 | 
|          1 |          2 | 
|          2 |          3 | 
|          3 |          1 | 
|          3 |          3 | 
|          5 |          3 | 
|          5 |          2 | 
|          5 |          4 | 
|          3 |          4 | 
|          2 |          1 | 
|          2 |          2 | 
|          2 |          4 | 
|          6 |          1 | 
|          6 |          2 | 
|          6 |          3 | 
|          6 |          4 | 
|          5 |          1 | 
|          8 |          1 | 
|          8 |          2 | 
|          9 |          1 | 
|          9 |          2 | 
|          9 |          3 | 
|          9 |          4 | 
|          2 |          6 | 
|         11 |          1 | 
|         11 |          2 | 
|         12 |          7 | 
|          5 |          6 | 
|          5 |          7 | 
|         13 |          1 | 
|         13 |          2 | 
|          2 |          7 | 
|         14 |          1 | 
|         14 |          2 | 
|         13 |          8 | 
+------------+------------+
70 rows in set (0.03 sec)

Actions #5

Updated by Jean-Philippe Lang about 15 years ago

  • Status changed from New to Closed
  • Resolution set to Cant reproduce

I was right, all the lines are duplicated. The solution is to manually remove all the duplicates.
I've migrated several database and never faced this problem. And I can't see what could have produced this, so I close this defect. Reopen if you have any idea about the cause of this problem.

Actions #6

Updated by Jean-Philippe Lang about 15 years ago

A database migration is added in r2580. It will:
  • remove duplicates, if any
  • add a unique index to avoid this kind of problem
Actions #7

Updated by Eric Davis almost 15 years ago

I just got hit by this bug. Somehow my Redmine was trying to insert duplicate Trackers and MySQL threw back an error from this unique index. Since the MySQL error wasn't being caught, it rendered the 500 error page. By I removing the database index and added the :uniq option to the Projects / Trackers association I was able to prevent this error while still keeping the trackers from duplicating.

Jean-Philippe: Since this patch backs out your change, can you review this patch before I commit it?

Actions #8

Updated by Eric Davis almost 15 years ago

Here's the backtrace I got. Redmine version is r2757.

A ActiveRecord::StatementInvalid occurred in projects#add:

  Mysql::Error: Duplicate entry '85-3' for key 1: INSERT INTO `projects_trackers` (`project_id`, `tracker_id`) VALUES (85, 3)
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:188:in `log_without_newrelic_instrumentation'

-------------------------------
Request:
-------------------------------

  * URL       : https://projects.littlestreamsoftware.com/projects/new
  * IP address: 
  * Parameters: {"commit"=>"Save", "enabled_modules"=>["issue_tracking", "time_tracking", "files", "budget_module", "customer_module", "schedule_module"], "project"=>{"issue_custom_field_ids"=>[""], "name"=>"removed", "tracker_ids"=>["3", ""], "description"=>"removed", "homepage"=>"", "is_public"=>"0", "identifier"=>"removed", "parent_id"=>"54", "custom_field_values"=>{"6"=>"Prospecting", "2"=>"0", "3"=>"", "4"=>""}}, "action"=>"add", "controller"=>"projects"}
  * Rails root: /home/websites/projects.littlestreamsoftware.com/releases/20090517194548

-------------------------------
Backtrace:
-------------------------------

  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:188:in `log_without_newrelic_instrumentation'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/instrumentation/active_record_instrumentation.rb:54:in `log_with_capture_sql'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/instrumentation/active_record_instrumentation.rb:37:in `log_without_trace_Database___adapter_name____args_1__'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:41:in `trace_method_execution_with_scope'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/instrumentation/active_record_instrumentation.rb:36:in `log_without_trace_Database___adapter_name____args_1__'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:138:in `log_without_trace_Database_all'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:41:in `trace_method_execution_with_scope'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:137:in `log_without_trace_Database_all'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:141:in `log'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:309:in `execute'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:171:in `insert_sql'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:319:in `insert_sql'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:44:in `insert_without_query_dirty'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:18:in `insert'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/has_and_belongs_to_many_association.rb:56:in `insert_record'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:145:in `send'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:145:in `send'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations.rb:1391:in `after_create_or_update_associated_records_for_trackers'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_collection.rb:359:in `method_missing'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:212:in `method_missing'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:212:in `each'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:212:in `send'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb:212:in `method_missing'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations/association_collection.rb:359:in `method_missing'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/associations.rb:1391:in `after_create_or_update_associated_records_for_trackers'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in `send'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:178:in `evaluate_method'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:166:in `call'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:93:in `run'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:92:in `each'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:92:in `send'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:92:in `run'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/callbacks.rb:277:in `run_callbacks'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/callbacks.rb:315:in `callback'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/callbacks.rb:238:in `create_without_timestamps'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/timestamp.rb:29:in `create'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:2699:in `create_or_update_without_callbacks'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/callbacks.rb:222:in `create_or_update'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:2383:in `save_without_validation'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/validations.rb:1009:in `save_without_dirty'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/dirty.rb:79:in `save_without_transactions'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:179:in `send'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:179:in `with_transaction_returning_status'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/database_statements.rb:66:in `transaction'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:129:in `transaction'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:138:in `transaction'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:178:in `with_transaction_returning_status'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:146:in `save_without_trace_ActiveRecord___self_class_name__save'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:158:in `rollback_active_record_state!'
  /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/transactions.rb:146:in `save_without_trace_ActiveRecord___self_class_name__save'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:138:in `save_without_trace_ActiveRecord_save'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:41:in `trace_method_execution_with_scope'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:137:in `save_without_trace_ActiveRecord_save'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:141:in `save_without_trace_ActiveRecord_all'
  [RAILS_ROOT]/vendor/plugins/newrelic_rpm/lib/new_relic/agent/method_tracer.rb:141:in `save'
  [RAILS_ROOT]/app/controllers/projects_controller.rb:77:in `add'
Actions #9

Updated by Jean-Philippe Lang almost 15 years ago

Eric, I don't think removing the unique index and ignoring duplicates is the right solution.
I'd really prefer this defect to be fixed instead, if it is confirmed.

Did you get this error with any plugin installed (see #3368)?

Actions #10

Updated by Eric Davis almost 15 years ago

  • Status changed from Reopened to Closed
  • % Done changed from 0 to 100
  • Resolution set to Cant reproduce

Jean-Philippe Lang wrote:

Did you get this error with any plugin installed (see #3368)?

You're right. I thought I was testing with a clean Redmine install earlier (fresh database, no plugins, from trunk) but I must have had something else loaded. When I installed the Stuff To Do plugin (like in #3368), I was able to reproduce the error. It looks like the require 'project' in the plugin was the cause. Why a require caused a MySQL error, I do not know....

Sorry for the noise and thank you for reviewing the patch.

Actions

Also available in: Atom PDF