Skip to content

Commit

Permalink
feat: use task to fix missing script (#2178)
Browse files Browse the repository at this point in the history
Signed-off-by: Miles Zhang <[email protected]>
  • Loading branch information
zmcNotafraid authored Sep 9, 2024
1 parent 4098e91 commit 57f165b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 4 deletions.
63 changes: 63 additions & 0 deletions lib/tasks/migration/fix_missing_script.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
namespace :migration do
desc "Usage: RAILS_ENV=production bundle exec rake migration:fix_missing_script"
task fix_missing_script: :environment do
ActiveRecord::Base.connection.execute("SET statement_timeout = 0")

puts "===============lock_script"
output_ids = CellOutput.left_outer_joins(:lock_script).where(lock_script: { id: nil }).select(:lock_script_id).distinct
output_ids.each do |output|
p output.lock_script_id
co = CellOutput.where(lock_script_id: output.lock_script_id).first
if co
rpc_tx = CkbSync::Api.instance.get_transaction(co.tx_hash)
lock = rpc_tx.transaction.outputs[co.cell_index].lock
local_lock = LockScript.find_by(script_hash: lock.compute_hash)
if local_lock
if output.lock_script_id < local_lock.id
ApplicationRecord.transaction do
CellOutput.where(lock_script_id: local_lock.id).in_batches(of: 10000) do |batch|
batch.update_all(lock_script_id: output.lock_script_id)
end
local_lock.update(id: output.lock_script_id)
end
else
CellOutput.where(lock_script_id: output.lock_script_id).in_batches(of: 10000) do |batch|
batch.update_all(lock_script_id: local_lock.id)
end
end
else
LockScript.create(id: output.lock_script_id, code_hash: lock.code_hash, hash_type: lock.hash_type, args: lock.args, script_hash: lock.compute_hash)
end
end
end; nil

puts "=============type script"
output_ids = CellOutput.left_outer_joins(:type_script).where.not(type_script_id: nil).where(type_script: { id: nil }).select(:type_script_id).distinct
output_ids.each do |output|
p output.type_script_id
co = CellOutput.where(type_script_id: output.type_script_id).first
if co
rpc_tx = CkbSync::Api.instance.get_transaction(co.tx_hash)
type = rpc_tx.transaction.outputs[co.cell_index].type
local_type = TypeScript.find_by(script_hash: type.compute_hash)
if local_type
if output.type_script_id < local_type.id
ApplicationRecord.transaction do
CellOutput.where(type_script_id: local_type.id).in_batches(of: 10000) do |batch|
batch.update_all(type_script_id: output.type_script_id)
end
local_type.update(id: output.type_script_id)
end
else
CellOutput.where(type_script_id: output.type_script_id).in_batches(of: 10000) do |batch|
batch.update_all(type_script_id: local_type.id)
end
end
else
TypeScript.create(id: output.type_script_id, code_hash: type.code_hash, hash_type: type.hash_type, args: type.args, script_hash: type.compute_hash)
end
end
end; nil
puts "done"
end
end
8 changes: 4 additions & 4 deletions lib/tasks/migration/update_cell_output_script_id.rake
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace :migration do
pluck(:script_hash)
duplicate_script_hashes.each do |hash|
LockScript.where(script_hash: hash).each do |script|
unless CellOutput.live.where(lock_script_id: script.id).exists?
unless CellOutput.where(lock_script_id: script.id).exists?
script.destroy
end
end
Expand All @@ -35,7 +35,7 @@ namespace :migration do
pluck(:script_hash)
duplicate_script_hashes.each do |hash|
LockScript.where(script_hash: hash).each do |script|
unless CellOutput.live.where(lock_script_id: script.id).exists?
unless CellOutput.where(lock_script_id: script.id).exists?
script.destroy
end
end
Expand All @@ -50,7 +50,7 @@ namespace :migration do

duplicate_type_script_hashes.each do |hash|
TypeScript.where(script_hash: hash).each do |script|
unless CellOutput.live.where(type_script_id: script.id).exists?
unless CellOutput.where(type_script_id: script.id).exists?
script.destroy
end
end
Expand All @@ -76,7 +76,7 @@ namespace :migration do

duplicate_type_script_hashes.each do |hash|
TypeScript.where(script_hash: hash).each do |script|
unless CellOutput.live.where(type_script_id: script.id).exists?
unless CellOutput.where(type_script_id: script.id).exists?
script.destroy
end
end
Expand Down

0 comments on commit 57f165b

Please sign in to comment.