From 90496a0aa0894809900fc8f6a5c253e110c4a98b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Mon, 3 Aug 2015 12:38:02 +0200 Subject: [PATCH] Feature #3831: Mark unresolved problems in fsck --- src/onedb/fsck.rb | 58 +++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/onedb/fsck.rb b/src/onedb/fsck.rb index 8f88888b16..6e23dc8a8a 100644 --- a/src/onedb/fsck.rb +++ b/src/onedb/fsck.rb @@ -136,6 +136,9 @@ EOT init_log_time() @errors = 0 + @repaired_errors = 0 + @unrepaired_errors = 0 + puts db_version = read_db_version() @@ -175,12 +178,14 @@ EOT end if ( max_oid > control_oid ) - log_error("pool_control for table #{table} has last_oid #{control_oid}, but it is #{max_oid}") + msg = "pool_control for table #{table} has last_oid #{control_oid}, but it is #{max_oid}" if control_oid != -1 if db_version[:is_slave] && federated_tables.include?(table) - log_error("^ Needs to be fixed in the master OpenNebula") + log_error(msg, false) + log_msg("^ Needs to be fixed in the master OpenNebula") else + log_error(msg) @db.run("UPDATE pool_control SET last_oid=#{max_oid} WHERE tablename='#{table}'") end else @@ -221,7 +226,7 @@ EOT user_gids = Set.new if group[gid].nil? - log_error("User #{row[:oid]} has primary group #{gid}, but it does not exist") + log_error("User #{row[:oid]} has primary group #{gid}, but it does not exist", !db_version[:is_slave]) user_gid = 1 @@ -247,7 +252,7 @@ EOT } if !user_gids.include?(user_gid) - log_error("User #{row[:oid]} does not have his primary group #{user_gid} in the list of secondary groups") + log_error("User #{row[:oid]} does not have his primary group #{user_gid} in the list of secondary groups", !db_version[:is_slave]) doc.root.xpath("GROUPS").each { |e| e.add_child(doc.create_element("ID")).content = user_gid.to_s @@ -260,7 +265,7 @@ EOT user_gids.each do |secondary_gid| if group[secondary_gid].nil? - log_error("User #{row[:oid]} has secondary group #{secondary_gid}, but it does not exist") + log_error("User #{row[:oid]} has secondary group #{secondary_gid}, but it does not exist", !db_version[:is_slave]) doc.root.xpath("GROUPS").each { |e| e.xpath("ID[.=#{secondary_gid}]").each{|x| x.remove} @@ -275,7 +280,7 @@ EOT if gid != row[:gid] log_error( "User #{row[:oid]} is in group #{gid}, but the DB "<< - "table has GID column #{row[:gid]}") + "table has GID column #{row[:gid]}", !db_version[:is_slave]) users_fix[row[:oid]] = {:body => doc.root.to_s, :gid => user_gid} end @@ -290,7 +295,7 @@ EOT end end elsif !users_fix.empty? - log_error("^ User errors need to be fixed in the master OpenNebula") + log_msg("^ User errors need to be fixed in the master OpenNebula") end log_time() @@ -316,7 +321,7 @@ EOT id_elem = users_elem.at_xpath("ID[.=#{id}]") if id_elem.nil? - log_error("User #{id} is missing from Group #{gid} users id list") + log_error("User #{id} is missing from Group #{gid} users id list", !db_version[:is_slave]) error_found = true else id_elem.remove @@ -326,7 +331,7 @@ EOT end users_elem.xpath("ID").each do |id_elem| - log_error("User #{id_elem.text} is in Group #{gid} users id list, but it should not") + log_error("User #{id_elem.text} is in Group #{gid} users id list, but it should not", !db_version[:is_slave]) error_found = true end @@ -336,7 +341,7 @@ EOT # commit @db[:group_pool_new].insert(row) elsif error_found - log_error("^ Group errors need to be fixed in the master OpenNebula") + log_msg("^ Group errors need to be fixed in the master OpenNebula") end end end @@ -650,7 +655,7 @@ EOT " #{doc.root.get_text('SOURCE')}\n"<< " * The DB entry can be then deleted with the command:\n"<< " DELETE FROM image_pool WHERE oid=#{row[:oid]};\n"<< - " * Run fsck again.\n") + " * Run fsck again.\n", false) else if ds_name != ds_entry[:name] log_error("Image #{row[:oid]} has a wrong name for datastore #{ds_id}, #{ds_name}. It will be changed to #{ds_entry[:name]}") @@ -799,7 +804,7 @@ EOT if counters[:image][img_id].nil? log_error("VM #{row[:oid]} is using Image #{img_id}, but "<< - "it does not exist") + "it does not exist", false) else counters[:image][img_id][:vms].add(row[:oid]) end @@ -815,7 +820,7 @@ EOT if !net_id.nil? if counters[:vnet][net_id].nil? log_error("VM #{row[:oid]} is using VNet #{net_id}, "<< - "but it does not exist") + "but it does not exist", false) else mac = nic.at_xpath("MAC").nil? ? nil : nic.at_xpath("MAC").text @@ -824,7 +829,7 @@ EOT if ar_id_e.nil? if !counters[:vnet][net_id][:no_ar_leases][mac_s_to_i(mac)].nil? log_error("VNet has more than one VM with the same MAC address (#{mac}). "<< - "FSCK can't handle this, and consistency is not guaranteed") + "FSCK can't handle this, and consistency is not guaranteed", false) end counters[:vnet][net_id][:no_ar_leases][mac_s_to_i(mac)] = { @@ -841,7 +846,7 @@ EOT if counters[:vnet][net_id][:ar_leases][ar_id].nil? log_error("VM #{row[:oid]} is using VNet #{net_id}, AR #{ar_id}, "<< - "but the AR does not exist") + "but the AR does not exist", false) else counters[:vnet][net_id][:ar_leases][ar_id][mac_s_to_i(mac)] = { :ip => nic.at_xpath("IP").nil? ? nil : nic.at_xpath("IP").text, @@ -885,7 +890,7 @@ EOT if counters_host.nil? log_error("VM #{row[:oid]} is using Host #{hid}, "<< - "but it does not exist") + "but it does not exist", false) else if counters_host[:name] != hostname log_error("VM #{row[:oid]} has a wrong hostname for "<< @@ -1169,7 +1174,7 @@ EOT log_error( "VNet #{row[:oid]} is using parent "<< "VNet #{parent_vnet}, AR #{parent_ar}, "<< - "but the AR does not exist") + "but the AR does not exist", false) end # MAC @@ -1437,7 +1442,7 @@ EOT "#{lease_obj} #{lease_oid}. #{key.to_s.upcase} "<< "does not match: "<< "#{counter_lease[key]} != #{lease[key]}. "<< - "This can't be fixed") + "This can't be fixed", false) end end end @@ -1493,7 +1498,7 @@ EOT counter_no_ar.each do |mac, counter_lease| log_error("VM #{counter_lease[:vm]} has a lease from "<< - "VNet #{oid}, but it could not be matched to any AR") + "VNet #{oid}, but it could not be matched to any AR", false) end row[:body] = doc.root.to_s @@ -1611,9 +1616,19 @@ EOT return true end - def log_error(message) + def log_error(message, repaired=true) @errors += 1 + if repaired + @repaired_errors += 1 + else + @unrepaired_errors += 1 + end + + if !repaired + message = "[UNREPAIRED] " + message + end + log_msg(message) end @@ -1629,6 +1644,9 @@ EOT def log_total_errors() puts log_msg "Total errors found: #{@errors}" + log_msg "Total errors repaired: #{@repaired_errors}" + log_msg "Total errors unrepaired: #{@unrepaired_errors}" + puts "A copy of this output was stored in #{LOG}" end