1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

F #3371: refactor and lint history fsck (#3418)

This commit is contained in:
Alejandro Huertas Herrero 2019-06-11 11:39:17 +02:00 committed by Ruben S. Montero
parent fc01c2b480
commit eeee99a7cd
2 changed files with 28 additions and 15 deletions

View File

@ -496,7 +496,6 @@ AllCops:
- src/cloud/ec2/lib/econe_application.rb
- src/onedb/database_schema.rb
- src/onedb/fsck/image.rb
- src/onedb/fsck/history.rb
- src/onedb/fsck/vrouter.rb
- src/onedb/fsck/pool_control.rb
- src/onedb/fsck/marketplace.rb

View File

@ -1,5 +1,7 @@
# History module
module OneDBFsck
# Check history records
def check_history
check_history_etime
@ -18,8 +20,14 @@ module OneDBFsck
# Query to select history elements that:
# - have etime = 0
# - are not the last seq
@db.fetch("SELECT vid,seq FROM history WHERE (etime = 0 AND seq <> (SELECT MAX(seq) FROM history AS subhistory WHERE history.vid = subhistory.vid) )") do |row|
log_error("History record for VM #{row[:vid]} seq # #{row[:seq]} is not closed (etime = 0)", false)
@db.fetch('SELECT vid,seq ' \
'FROM history ' \
'WHERE (etime = 0 AND seq <> ' \
'(SELECT MAX(seq) ' \
'FROM history AS subhistory ' \
'WHERE history.vid = subhistory.vid))') do |row|
log_error("History record for VM #{row[:vid]} seq # #{row[:seq]} " \
'is not closed (etime = 0)', false)
end
end
@ -33,24 +41,29 @@ module OneDBFsck
# - etime = 0
# - is last seq
# - VM is DONE
@db.fetch("SELECT * FROM history WHERE (etime = 0 AND vid IN (SELECT oid FROM vm_pool WHERE state=6) AND seq = (SELECT MAX(seq) FROM history AS subhistory WHERE history.vid=subhistory.vid))") do |row|
log_error("History record for VM #{row[:vid]} seq # #{row[:seq]} is not closed (etime = 0), but the VM is in state DONE")
@db.fetch('SELECT * ' \
'FROM history ' \
'WHERE (etime = 0 AND vid IN ' \
'(SELECT oid FROM vm_pool WHERE state=6) AND ' \
'seq = (SELECT MAX(seq) FROM history AS subhistory ' \
'WHERE history.vid=subhistory.vid))') do |row|
log_error("History record for VM #{row[:vid]} seq # #{row[:seq]} " \
'is not closed (etime = 0), but the VM is in state DONE')
etime = 0
query = "SELECT body FROM vm_pool WHERE oid=#{row[:vid]}"
@db.fetch("SELECT body FROM vm_pool WHERE oid=#{row[:vid]}") do |vm_row|
@db.fetch(query) do |vm_row|
vm_doc = nokogiri_doc(vm_row[:body])
etime = vm_doc.root.at_xpath("ETIME").text.to_i
etime = vm_doc.root.at_xpath('ETIME').text.to_i
end
history_doc = nokogiri_doc(row[:body])
["RETIME", "ESTIME", "EETIME", "ETIME"].each do |att|
%w[RETIME ESTIME EETIME ETIME].each do |att|
elem = history_doc.root.at_xpath(att)
if (elem.text == "0")
elem.content = etime
end
elem.content = etime if elem.text == '0'
end
row[:body] = history_doc.root.to_s
@ -65,9 +78,10 @@ module OneDBFsck
# DATA: TODO: check all fixes to always do the same (update vs rewrite)
@db.transaction do
@fixes_history.each do |row|
@db[:history].where(vid: row[:vid], seq: row[:seq]).update(row)
@db[:history].where(:vid => row[:vid],
:seq => row[:seq]).update(row)
end
end
end
end
end