Project

General

Profile

Actions

Defect #13592

open

ActiveRecord::RecordNotUnique for git repository

Added by Griffin Smith over 11 years ago. Updated over 11 years ago.

Status:
New
Priority:
Low
Assignee:
-
Category:
SCM
Target version:
-
Start date:
Due date:
% Done:

0%

Estimated time:
Resolution:
Affected version:

Description

I've installed Redmine and linked it to a git repository that's been running development for a very long time (heavy, active development for about a year). Upon trying to load the Repository tab for the project I get an error. Here's the relevant section of the log:

Started GET "/redmine/projects/<project_name>/repository" for 173.164.56.105 at 2013-03-25 16:22:29 -0600
Processing by RepositoriesController#show as HTML
Parameters: {"id"=>"fredchat"}
Current user: admin (id=1)
Completed 500 Internal Server Error in 912ms

ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '1-2a5b30caa8969dded7f57c9cda5f914ea88ea29f' for key 'changesets_repos_rev': INSERT INTO `changesets` (`comments`, `commit_date`, `committed_on`, `committer`, `repository_id`, `revision`, `scmid`, `user_id`) VALUES ('Merge branch \'autoupdate\' of <info_removed> into autoupdate', '2012-09-14 12:08:21', '2012-09-14 12:08:21', 'My Name <>', 1, '2a5b30caa8969dded7f57c9cda5f914ea88ea29f', '2a5b30caa8969dded7f57c9cda5f914ea88ea29f', 4)):
app/models/repository/git.rb:222:in `save_revision'
app/models/repository/git.rb:211:in `block (2 levels) in save_revisions'
app/models/repository/git.rb:208:in `block in save_revisions'
app/models/repository/git.rb:207:in `each'
app/models/repository/git.rb:207:in `save_revisions'
app/models/repository/git.rb:154:in `fetch_changesets'
app/controllers/repositories_controller.rb:114:in `show'


Files

fix-not-unique.patch (976 Bytes) fix-not-unique.patch Prepend underscores before non-unique commit SHA-1s Griffin Smith, 2013-03-25 23:44

Related issues

Related to Redmine - Defect #13086: "Mysql::Error: Duplicate entry" in fetching revisionsNeeds feedback

Actions
Related to Redmine - Defect #2824: MySQL Deadlock Error when showing a big repositoryNew2009-02-24

Actions
Actions #1

Updated by Griffin Smith over 11 years ago

I've attached a patch that fixes this issue by prepending underscores to non-unique commit SHA-1s in a before_create handler

Actions #2

Updated by Etienne Massip over 11 years ago

  • Priority changed from Urgent to Normal
Actions #3

Updated by Etienne Massip over 11 years ago

You're not supposed to have a duplicate SHA-1, do you know why you have this?

Actions #4

Updated by Griffin Smith over 11 years ago

SHA-1 is collision-resistant, but mathematically speaking there's no way it can be collision proof. In especially large datasets it's entirely possible for two checksums to be the same-look up the birthday problem.

Actions #5

Updated by Griffin Smith over 11 years ago

Scratch that, it actually looks like it's trying to overwrite the same revisions, so somewhere the check to see if a revision has already been inserted is failing.

Actions #6

Updated by Toshi MARUYAMA over 11 years ago

  • Priority changed from Normal to Low

Are these really the same hash values?

It is very rare case on Mercurial valid repository.
http://mercurial.selenic.com/wiki/FAQ/TechnicalDetails

Redmine checks hash before inserting database.
source:tags/2.3.0/app/models/repository/git.rb#L167

So, "Not Unique" error does not happen on single process.
But, it happens on multi processe.
In this case, you can ignore it.
See #13086.

Actions #7

Updated by Chris Routh over 11 years ago

I just ran into this issue. I fixed it by truncating the three 'changesets' tables in the redmine DB.

It can be caused by refreshing or making two requests to a new repository from redmine at once. The two requests run in parallel and cause each other to collide. Any attempt made after this occurs to access the repo fails as Redmine tries to insert everything anew rather than update the data in the database, causing more collisions.

Definately something that needs to be dealt with in the redmine code. I've learnt my lesson, but this could cause major issues with a busy redmine server.

Actions

Also available in: Atom PDF