Remove counter, yield everytime

This commit is contained in:
Leeingnyo 2021-09-18 10:59:43 +09:00
parent 9769e760a0
commit b56e16e1e1
5 changed files with 6 additions and 25 deletions

View File

@ -23,7 +23,6 @@ class Config
property cache_enabled = false property cache_enabled = false
property cache_size_mbs = 50 property cache_size_mbs = 50
property cache_log_enabled = true property cache_log_enabled = true
property forcely_yield_count = 1000
property disable_login = false property disable_login = false
property default_username = "" property default_username = ""
property auth_proxy_header_name = "" property auth_proxy_header_name = ""

View File

@ -133,9 +133,7 @@ class Library
storage = Storage.new auto_close: false storage = Storage.new auto_close: false
count = Config.current.forcely_yield_count
examine_context : ExamineContext = { examine_context : ExamineContext = {
file_counter: (YieldCounter.new count),
cached_contents_signature: {} of String => String, cached_contents_signature: {} of String => String,
deleted_title_ids: [] of String, deleted_title_ids: [] of String,
deleted_entry_ids: [] of String, deleted_entry_ids: [] of String,

View File

@ -73,7 +73,7 @@ class Title
def examine(context : ExamineContext) : Bool def examine(context : ExamineContext) : Bool
return false unless Dir.exists? @dir # No title, Remove this return false unless Dir.exists? @dir # No title, Remove this
contents_signature = Dir.contents_signature @dir, contents_signature = Dir.contents_signature @dir,
context["cached_contents_signature"], context["file_counter"] context["cached_contents_signature"]
# Not changed. Reuse this # Not changed. Reuse this
return true if @contents_signature == contents_signature return true if @contents_signature == contents_signature
@ -112,7 +112,7 @@ class Title
previous_entries_size = @entries.size previous_entries_size = @entries.size
@entries.select! do |entry| @entries.select! do |entry|
existence = File.exists? entry.zip_path existence = File.exists? entry.zip_path
context["file_counter"].count_and_yield Fiber.yield
context["deleted_entry_ids"] << entry.id unless existence context["deleted_entry_ids"] << entry.id unless existence
existence existence
end end

View File

@ -134,21 +134,7 @@ class TitleInfo
end end
end end
class YieldCounter
@file_count : UInt32
def initialize(@threshold : Int32)
@file_count = 0
end
def count_and_yield
@file_count += 1
Fiber.yield if @threshold > 0 && @file_count % @threshold == 0
end
end
alias ExamineContext = NamedTuple( alias ExamineContext = NamedTuple(
file_counter: YieldCounter,
cached_contents_signature: Hash(String, String), cached_contents_signature: Hash(String, String),
deleted_title_ids: Array(String), deleted_title_ids: Array(String),
deleted_entry_ids: Array(String)) deleted_entry_ids: Array(String))

View File

@ -54,24 +54,22 @@ class Dir
# Rescan conditions: # Rescan conditions:
# - When a file added, moved, removed, renamed (including which in nested # - When a file added, moved, removed, renamed (including which in nested
# directories) # directories)
def self.contents_signature(dirname, def self.contents_signature(dirname, cache = {} of String => String) : String
cache = {} of String => String,
counter : YieldCounter? = nil) : String
return cache[dirname] if cache[dirname]? return cache[dirname] if cache[dirname]?
counter.count_and_yield unless counter.nil? Fiber.yield
signatures = [] of String signatures = [] of String
self.open dirname do |dir| self.open dirname do |dir|
dir.entries.sort.each do |fn| dir.entries.sort.each do |fn|
next if fn.starts_with? "." next if fn.starts_with? "."
path = File.join dirname, fn path = File.join dirname, fn
if File.directory? path if File.directory? path
signatures << Dir.contents_signature path, cache, counter signatures << Dir.contents_signature path, cache
else else
# Only add its signature value to `signatures` when it is a # Only add its signature value to `signatures` when it is a
# supported file # supported file
signatures << fn if is_supported_file fn signatures << fn if is_supported_file fn
end end
counter.count_and_yield unless counter.nil? Fiber.yield
end end
end end
hash = Digest::SHA1.hexdigest(signatures.join) hash = Digest::SHA1.hexdigest(signatures.join)