Revert "Fixed bug: Race condition in thread object creation."

This reverts commit c6ccb7cf84.
This commit is contained in:
Thorsten Eckel 2015-07-24 09:04:09 +02:00
parent c6ccb7cf84
commit 9c28c50e4b

View file

@ -378,6 +378,7 @@ module Import::OTRS
thread_count = 8 thread_count = 8
threads = {} threads = {}
count = 0 count = 0
locks = { User: {} }
(1..thread_count).each {|thread| (1..thread_count).each {|thread|
threads[thread] = Thread.new { threads[thread] = Thread.new {
Thread.current[:thread_no] = thread Thread.current[:thread_no] = thread
@ -396,7 +397,7 @@ module Import::OTRS
log "... thread# #{thread}, no more work." log "... thread# #{thread}, no more work."
break break
end end
_ticket_result(records, thread) _ticket_result(records, locks, thread)
end end
ActiveRecord::Base.connection.close ActiveRecord::Base.connection.close
} }
@ -460,6 +461,7 @@ module Import::OTRS
count = 0 count = 0
run = true run = true
steps = 20 steps = 20
locks = { User: {} }
while run while run
count += steps count += steps
log 'loading... diff ...' log 'loading... diff ...'
@ -473,12 +475,12 @@ module Import::OTRS
run = false run = false
next next
end end
_ticket_result(records) _ticket_result(records, locks)
end end
end end
def self._ticket_result(result, _thread = '-') def self._ticket_result(result, locks, _thread = '-')
map = { map = {
Ticket: { Ticket: {
Changed: :updated_at, Changed: :updated_at,
@ -570,15 +572,9 @@ module Import::OTRS
ticket_old.update_attributes(ticket_new) ticket_old.update_attributes(ticket_new)
else else
log "add Ticket.find(#{ticket_new[:id]})" log "add Ticket.find(#{ticket_new[:id]})"
begin
ticket = Ticket.new(ticket_new) ticket = Ticket.new(ticket_new)
ticket.id = ticket_new[:id] ticket.id = ticket_new[:id]
ticket.save ticket.save
rescue ActiveRecord::RecordNotUnique
log "Ticket #{ticket_new[:id]} is handled by another thead, skipping."
next
end
end end
# utf8 encode # utf8 encode
@ -588,7 +584,7 @@ module Import::OTRS
# lookup customers to create first # lookup customers to create first
record['Articles'].each { |article| record['Articles'].each { |article|
_article_based_customers(article) _article_based_customers(article, locks)
} }
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
@ -648,14 +644,9 @@ module Import::OTRS
article_object.update_attributes(article_new) article_object.update_attributes(article_new)
else else
log "add Ticket::Article.find(#{article_new[:id]})" log "add Ticket::Article.find(#{article_new[:id]})"
begin
article_object = Ticket::Article.new(article_new) article_object = Ticket::Article.new(article_new)
article_object.id = article_new[:id] article_object.id = article_new[:id]
article_object.save article_object.save
rescue ActiveRecord::RecordNotUnique
log "Ticket #{ticket_new[:id]} (article #{article_new[:id]}) is handled by another thead, skipping."
next
end
end end
next if !article['Attachments'] next if !article['Attachments']
@ -675,7 +666,6 @@ module Import::OTRS
# import article attachments # import article attachments
article['Attachments'].each { |attachment| article['Attachments'].each { |attachment|
begin
Store.add( Store.add(
object: 'Ticket::Article', object: 'Ticket::Article',
o_id: article_object.id, o_id: article_object.id,
@ -688,18 +678,12 @@ module Import::OTRS
}, },
created_by_id: 1, created_by_id: 1,
) )
rescue ActiveRecord::RecordNotUnique
log "Ticket #{ticket_new[:id]} (article #{article_object.id}) is handled by another thead, skipping."
next
end
} }
} }
end end
#puts "HS: #{record['History'].inspect}" #puts "HS: #{record['History'].inspect}"
record['History'].each { |history| record['History'].each { |history|
begin
if history['HistoryType'] == 'NewTicket' if history['HistoryType'] == 'NewTicket'
#puts "HS.add( #{history.inspect} )" #puts "HS.add( #{history.inspect} )"
res = History.add( res = History.add(
@ -711,7 +695,8 @@ module Import::OTRS
created_by_id: history['CreateBy'] created_by_id: history['CreateBy']
) )
#puts "res #{res.inspect}" #puts "res #{res.inspect}"
elsif history['HistoryType'] == 'StateUpdate' end
if history['HistoryType'] == 'StateUpdate'
data = history['Name'] data = history['Name']
# "%%new%%open%%" # "%%new%%open%%"
from = nil from = nil
@ -741,7 +726,8 @@ module Import::OTRS
created_at: history['CreateTime'], created_at: history['CreateTime'],
created_by_id: history['CreateBy'] created_by_id: history['CreateBy']
) )
elsif history['HistoryType'] == 'Move' end
if history['HistoryType'] == 'Move'
data = history['Name'] data = history['Name']
# "%%Queue1%%5%%Postmaster%%1" # "%%Queue1%%5%%Postmaster%%1"
from = nil from = nil
@ -765,7 +751,8 @@ module Import::OTRS
created_at: history['CreateTime'], created_at: history['CreateTime'],
created_by_id: history['CreateBy'] created_by_id: history['CreateBy']
) )
elsif history['HistoryType'] == 'PriorityUpdate' end
if history['HistoryType'] == 'PriorityUpdate'
data = history['Name'] data = history['Name']
# "%%3 normal%%3%%5 very high%%5" # "%%3 normal%%3%%5 very high%%5"
from = nil from = nil
@ -804,11 +791,6 @@ module Import::OTRS
created_at: history['CreateTime'], created_at: history['CreateTime'],
created_by_id: history['CreateBy'] created_by_id: history['CreateBy']
) )
rescue ActiveRecord::RecordNotUnique
log "Ticket #{ticket_new[:id]} (history #{history['HistoryID']}) is handled by another thead, skipping."
next
end
} }
} }
end end
@ -1238,7 +1220,7 @@ module Import::OTRS
# log # log
def self.log(message) def self.log(message)
thread_no = Thread.current[:thread_no] || '-' thread_no = Thread.current[:thread_no] || '-'
Rails.logger.error "thread##{thread_no}: #{message}" Rails.logger.info "thread##{thread_no}: #{message}"
end end
# set translate valid ids to active = true|false # set translate valid ids to active = true|false
@ -1284,7 +1266,7 @@ module Import::OTRS
end end
# create customers for article # create customers for article
def self._article_based_customers(article) def self._article_based_customers(article, locks)
# create customer/sender if needed # create customer/sender if needed
return if article['sender'] != 'customer' return if article['sender'] != 'customer'
@ -1301,6 +1283,15 @@ module Import::OTRS
end end
end end
# create article user if not exists
while locks[:User][ email ]
log "user #{email} is locked"
sleep 1
end
# lock user
locks[:User][ email ] = true
user = User.where( email: email ).first user = User.where( email: email ).first
if !user if !user
user = User.where( login: email ).first user = User.where( login: email ).first
@ -1331,6 +1322,9 @@ module Import::OTRS
end end
article['created_by_id'] = user.id article['created_by_id'] = user.id
# unlock user
locks[:User][ email ] = false
true true
end end