Skip to content
Snippets Groups Projects

Add cron worker to automatically rollout zoekt exact code search to paid namespaces

Merged John Mason requested to merge jm-namespace-assignment-service into master
1 unresolved thread
Compare and Show latest version
1 file
+ 38
10
Compare changes
  • Side-by-side
  • Inline
@@ -17,7 +17,7 @@ def initialize(
end
def plan
namespace_plans = enabled_namespaces.map do |enabled_namespace|
all_plans = enabled_namespaces.map do |enabled_namespace|
Plan.new(
enabled_namespace: enabled_namespace,
nodes: nodes,
@@ -25,9 +25,23 @@ def plan
).generate
end
namespace_plans = []
failed_plans = []
all_plans.each do |p|
if p[:errors].present?
failed_plans << p
else
namespace_plans << p
end
end
successful_plans = all_plans.filter { |p| !p[:errors].present? }
{
total_required_storage_bytes: namespace_plans.sum { |plan| plan[:namespace_required_storage_bytes] },
namespaces: namespace_plans
namespaces: successful_plans,
failures: failed_plans
}
end
@@ -67,14 +81,18 @@ def initialize(
end
def generate
num_replicas.times { simulate_replica_plan }
if fetch_projects.exists?
num_replicas.times { simulate_replica_plan }
else
create_empty_replica
end
{
namespace_id: namespace.id,
enabled_namespace_id: enabled_namespace.id,
namespace_required_storage_bytes: calculate_namespace_storage,
replicas: replica_plans,
errors: errors
errors: errors.uniq
}
end
@@ -100,12 +118,22 @@ def simulate_replica_plan
add_replica_plan(replica_indices)
end
def create_empty_replica
best_node = nodes.reject do |node|
@used_node_ids.include?(node[:id])
end.max_by { |node| node[:unclaimed_storage_bytes] }
if best_node
replica_indices = [simulate_index(best_node)]
add_replica_plan(replica_indices)
@used_node_ids.add(best_node[:id])
else
log_error(nil, :node_unavailable, "No nodes available to create an empty replica")
end
end
def fetch_projects
namespace.all_projects
.with_statistics
.joins(:statistics)
.group('projects.id, project_statistics.id, repository_size')
.order('repository_size DESC, projects.id ASC')
namespace.all_projects.with_statistics
end
def assign_to_node(stats, replica_indices)
@@ -153,7 +181,7 @@ def simulate_index(node)
{
node_id: node[:id],
projects: { project_id_from: nil, project_id_to: nil },
required_storage_bytes: 0,
required_storage_bytes: 1.kilobyte,
max_storage_bytes: node[:unclaimed_storage_bytes]
}
end
Loading