From 5ef554b4e17389cfca01279522b4bffa9fe64364 Mon Sep 17 00:00:00 2001 From: saint Date: Mon, 19 Aug 2024 18:37:05 +1000 Subject: [PATCH] v0.50 Work on MySQL brokenness --- .nfs00000000000b6da800000003 | Bin 0 -> 106496 bytes gossamer_forums.rb | 139 ++++++++++++----------------------- 2 files changed, 45 insertions(+), 94 deletions(-) create mode 100644 .nfs00000000000b6da800000003 diff --git a/.nfs00000000000b6da800000003 b/.nfs00000000000b6da800000003 new file mode 100644 index 0000000000000000000000000000000000000000..cf1113c36b88909ec6ef15814702929a7d39986b GIT binary patch literal 106496 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
xKK&3EYQ7Eg>73MC8DIj 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 2024 A.D. # Gossamer Threads to Discourse -- Migration-Import Script -# v0.48.6 48-48-48, add handling for deleted-former user as OP poster +# v0.49 Work on Mysql brokenness require 'mysql2' require 'open-uri' @@ -30,23 +30,23 @@ class GossamerForumsImporter < ImportScripts::Base super begin - # Database configuration for ActiveRecord - # This is not used, except for pool size... issue with our Bitnami Discourse? - ActiveRecord::Base.establish_connection( - adapter: 'postgresql', - database: 'slowtwitch', - username: 'admin', - password: "yxnh93Ybbz2Nm8#mp28zCVv", - host: 'slowtwitch.northend.network', - pool: 40, # Adjust based on concurrency needs - timeout: 5000 - ) +# # Database configuration for ActiveRecord +# # This is not used, except for pool size... issue with our Bitnami Discourse? +# ActiveRecord::Base.establish_connection( +# adapter: 'postgresql', +# database: 'slowtwitch', +# username: 'admin', +# password: "yxnh93Ybbz2Nm8#mp28zCVv", +# host: 'slowtwitch.northend.network', +# pool: 20, # Adjust based on concurrency needs +# timeout: 5000 +# ) # Initialize MySQL client to connect to Gossamer Forums database @mysql_client = Mysql2::Client.new( - host: "172.99.0.10", + host: "slowtwitch.northend.network", username: "admin", - password: "x0YGLA9252iiTFQuqaM0ROX8FmQzZuUu", + password: "yxnh93Ybbz2Nm8#mp28zCVv", database: "slowtwitch" ) rescue Mysql2::Error => e @@ -1081,45 +1081,8 @@ class GossamerForumsImporter < ImportScripts::Base result ? result['post_views'] : 0 end -########## THREADING START -------------------------------------------- +########## THREADING START ############################################################################# - # Method to dynamically calculate the optimal thread pool size based on system load - def calculate_dynamic_pool_size - # Fetch current CPU load average using Sys::ProcTable.loadavg - # load_avg = Sys::ProcTable.loadavg.last # Get the 15-minute load average - # load_avg = Sys::ProcTable.loadavg - load_avg = File.read('/proc/loadavg').split - - # Calculate the pool size based on the load average - # Adjust the multiplier and threshold as needed - # pool_size = [(Concurrent.processor_count / (load_avg + 0.1)).to_i, 1].max - - # Extract the 1-minute load average from the fetched data - one_minute_load_avg = load_avg[0].to_f - - # Determine how many logical CPU cores are available on the system - cpu_count = Concurrent.processor_count - - # Log the current load and CPU information for debugging and monitoring purposes - puts "1-minute Load Average: #{one_minute_load_avg}, CPU Count: #{cpu_count}" - - # Calculate the initial pool size based on the ratio of the 1-minute load average to the number of CPUs - # This ratio gives an idea of how many threads should be running to efficiently utilize the CPU resources - initial_pool_size = (cpu_count / one_minute_load_avg).ceil - - # Ensure the pool size is at least 1 to avoid creating a pool with zero threads - initial_pool_size = 1 if initial_pool_size < 1 - - # Cap the maximum pool size to twice the number of CPUs - # This prevents overloading the system with too many threads, which could lead to diminishing returns - max_pool_size = cpu_count * 2 - - # Adjust the final pool size to be within the valid range (1 to max_pool_size) - pool_size = [[initial_pool_size, max_pool_size].min, 1].max - - puts "Calculated and adjusted dynamic pool size: #{pool_size}" # Log the dynamically adjusted pool size - pool_size - end # Get list of TOPICS / OP posts, i.e. post ids that have no parent / root id - SELECT post_id FROM gforum_Post WHERE post_root_id = 0; def threaded_topic_import @@ -1127,19 +1090,15 @@ class GossamerForumsImporter < ImportScripts::Base # Use CachedThreadPool for dynamic thread management #### pool = Concurrent::CachedThreadPool.new ###### pool = Concurrent::FixedThreadPool.new(7) - pool = Concurrent::FixedThreadPool.new(40) + pool = Concurrent::FixedThreadPool.new(7) # Define the connection pool inside the method ###### mariadb_pool = ConnectionPool.new(size: 14, timeout: 100) do - mariadb_pool = ConnectionPool.new(size: 40, timeout: 100) do -# host: "slowtwitch.northend.network", -# username: "admin", -# password: "yxnh93Ybbz2Nm8#mp28zCVv", -# database: "slowtwitch" + mariadb_pool = ConnectionPool.new(size: 14, timeout: 100) do Mysql2::Client.new( - host: "172.99.0.10", + host: "slowtwitch.northend.network", username: "admin", - password: "x0YGLA9252iiTFQuqaM0ROX8FmQzZuUu", + password: "yxnh93Ybbz2Nm8#mp28zCVv", database: "slowtwitch" ) end @@ -1153,7 +1112,7 @@ class GossamerForumsImporter < ImportScripts::Base parent_post_ids = result.map { |row| row['post_id'] } # parent_post_count = parent_post_ids.count - batch_size = 1000 # Set our batch size for number of posts to import in a single batch + batch_size = 10 # Set our batch size for number of posts to import in a single batch #### current_post_batch = 0 # Set our current batch number. This tracks the current batch of posts being processed. @@ -1197,33 +1156,32 @@ class GossamerForumsImporter < ImportScripts::Base # Submit the import job for the current post_id to the thread pool pool.post do - # Initialise a new MariaDB / Mysql2 client inside of each thread -#### mysql_client = Mysql2::Client.new( -#### host: "slowtwitch.northend.network", -#### username: "admin", -#### password: "yxnh93Ybbz2Nm8#mp28zCVv", -#### database: "slowtwitch" -#### ) #### puts "PP 22 -- #{post_id}" begin - mariadb_pool.with do |mysql_client| +####### mariadb_pool.with do |mysql_client| + # Initialise a new MariaDB / Mysql2 client inside of each thread + mysql_client = Mysql2::Client.new( + host: "slowtwitch.northend.network", + username: "admin", + password: "yxnh93Ybbz2Nm8#mp28zCVv", + database: "slowtwitch" + ) # Ensure the connection is active, otherwise reconnect puts "PP 11 -- #{post_id} -- Checking MySQL connections status.." - mysql_client.ping -## || mysql_client = Mysql2::Client.new( -## host: "slowtwitch.northend.network", -## username: "admin", -## password: "yxnh93Ybbz2Nm8#mp28zCVv", -## database: "slowtwitch" -## ) -#### puts " FIRST Checking MySQL connection status..." -#### if mysql_client.query('SELECT 1').nil? -#### puts " MySQL connection is not valid" -#### else -#### puts " MySQL connection is valid" -#### end + mysql_client.ping || mysql_client = Mysql2::Client.new( + host: "slowtwitch.northend.network", + username: "admin", + password: "yxnh93Ybbz2Nm8#mp28zCVv", + database: "slowtwitch" + ) + puts " FIRST Checking MySQL connection status..." + if mysql_client.query('SELECT 1').nil? + puts " !! MySQL connection is NOT VALID !!" + else + puts " MySQL connection is valid" + end # Use connection pooling for PostgreSQL and synchronize access to shared resources ActiveRecord::Base.connection_pool.with_connection do @@ -1238,7 +1196,7 @@ class GossamerForumsImporter < ImportScripts::Base puts "Skipping post_id #{post_id}, already processed." end end - end +####### end rescue => e puts "Error processing post ID #{post_id}: #{e.message}" puts e.backtrace.join("\n") # Print the full stack trace @@ -1250,17 +1208,10 @@ class GossamerForumsImporter < ImportScripts::Base puts "Reconnecting to MySQL for post ID #{post_id} due to connection loss..." retry end -#### ensure -#### # Ensure the MariaDB connection is closed after processing -#### mysql_client.close if mysql_client -#### puts "** CLOSED MariaDB client" -#### puts "PP 22 -- #{post_id}" -#### puts " FINAL Checking MySQL connection status..." -#### if mysql_client.query('SELECT 1').nil? -#### puts " MySQL connection is not valid" -#### else -#### puts " MySQL connection is valid" -#### end + ensure + # Ensure the MariaDB connection is closed after processing + mysql_client.close if mysql_client + puts "** CLOSED MariaDB client" end end end