diff --git a/spec/manual/load_test.cr b/spec/manual/load_test.cr new file mode 100644 index 0000000..c158566 --- /dev/null +++ b/spec/manual/load_test.cr @@ -0,0 +1,54 @@ +# This file is to be executed as: +# +# % crystal ./spec/manual/load_test.cr +# +# It generated a number of producers and consumers. If the process hangs +# it means that the connection pool is not working properly. Likely a race condition. +# + +require "../dummy_driver" +require "../../src/db" +require "json" + +CONNECTION = "dummy://host?initial_pool_size=5&max_pool_size=5&max_idle_pool_size=5" + +alias TChannel = Channel(Int32) +alias TDone = Channel(Bool) + +COUNT = 200 + +def start_consumer(channel : TChannel, done : TDone) + spawn do + indeces = Set(Int32).new + loop do + indeces << channel.receive + puts "Received size=#{indeces.size}" + break if indeces.size == COUNT + end + done.send true + end +end + +def start_producers(channel : TChannel) + db = DB.open CONNECTION do |db| + sql = "1,title,description,2023 " * 100_000 + + COUNT.times do |index| + spawn(name: "prod #{index}") do + puts "Sending #{index}" + _films = db.query_all(sql, as: {Int32, String, String, Int32}) + rescue ex + puts "Error: #{ex.message}" + ensure + channel.send index + end + end + end +end + +channel = TChannel.new +done = TDone.new +start_consumer(channel, done) +start_producers(channel) + +done.receive