Packages
ferricstore
0.10.2
0.11.14
0.11.12
0.11.11
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.0
0.1.0
FerricFlow durable workflows and queues with native-protocol storage, Raft durability, and Bitcask persistence.
Current section
Files
Jump to
Current section
Files
lib/ferricstore/commands/prob_parameters.ex
defmodule Ferricstore.Commands.ProbParameters do
@moduledoc false
@max_bloom_bits 8_589_934_592
@max_bloom_hashes 1_024
@max_cms_depth 1_024
@max_cms_counters 16_777_216
@max_cms_merge_sources 128
@max_cms_merge_counter_visits @max_cms_counters
@cuckoo_bucket_size 4
@max_cuckoo_capacity 1_073_741_824
@max_topk_k 100_000
@max_topk_counters 1_048_576
@type validation_error ::
:invalid_bloom_dimensions
| :bloom_bit_limit_exceeded
| :bloom_hash_limit_exceeded
| :invalid_cms_dimensions
| :cms_depth_exceeded
| :cms_counter_limit_exceeded
| :cms_merge_source_limit_exceeded
| :cms_merge_work_limit_exceeded
| :invalid_cuckoo_parameters
| :cuckoo_capacity_limit_exceeded
| :unsupported_cuckoo_bucket_size
| :invalid_topk_parameters
| :topk_k_limit_exceeded
| :topk_counter_limit_exceeded
@spec validate_bloom_dimensions(term(), term()) :: :ok | {:error, validation_error()}
def validate_bloom_dimensions(num_bits, num_hashes)
when is_integer(num_bits) and num_bits > 0 and is_integer(num_hashes) and num_hashes > 0 do
cond do
num_bits > @max_bloom_bits -> {:error, :bloom_bit_limit_exceeded}
num_hashes > @max_bloom_hashes -> {:error, :bloom_hash_limit_exceeded}
true -> :ok
end
end
def validate_bloom_dimensions(_num_bits, _num_hashes),
do: {:error, :invalid_bloom_dimensions}
@spec validate_cms_dimensions(term(), term()) :: :ok | {:error, validation_error()}
def validate_cms_dimensions(width, depth)
when is_integer(width) and width > 0 and is_integer(depth) and depth > 0 do
cond do
depth > @max_cms_depth ->
{:error, :cms_depth_exceeded}
width > div(@max_cms_counters, depth) ->
{:error, :cms_counter_limit_exceeded}
true ->
:ok
end
end
def validate_cms_dimensions(_width, _depth),
do: {:error, :invalid_cms_dimensions}
@spec cms_merge_source_limit() :: pos_integer()
def cms_merge_source_limit, do: @max_cms_merge_sources
@spec validate_cms_merge_source_count(term()) :: :ok | {:error, validation_error()}
def validate_cms_merge_source_count(count)
when is_integer(count) and count > 0 and count <= @max_cms_merge_sources,
do: :ok
def validate_cms_merge_source_count(_count),
do: {:error, :cms_merge_source_limit_exceeded}
@spec validate_cms_merge_work(term(), term(), term()) ::
:ok | {:error, validation_error()}
def validate_cms_merge_work(source_count, width, depth) do
with :ok <- validate_cms_merge_source_count(source_count),
:ok <- validate_cms_dimensions(width, depth) do
counter_count = width * depth
if source_count <= div(@max_cms_merge_counter_visits, counter_count) do
:ok
else
{:error, :cms_merge_work_limit_exceeded}
end
end
end
@spec validate_cuckoo_parameters(term(), term()) :: :ok | {:error, validation_error()}
def validate_cuckoo_parameters(capacity, bucket_size)
when is_integer(capacity) and capacity > 0 and is_integer(bucket_size) do
cond do
capacity > @max_cuckoo_capacity -> {:error, :cuckoo_capacity_limit_exceeded}
bucket_size != @cuckoo_bucket_size -> {:error, :unsupported_cuckoo_bucket_size}
true -> :ok
end
end
def validate_cuckoo_parameters(_capacity, _bucket_size),
do: {:error, :invalid_cuckoo_parameters}
@spec validate_topk_parameters(term(), term(), term()) ::
:ok | {:error, validation_error()}
def validate_topk_parameters(k, width, depth)
when is_integer(k) and k > 0 and is_integer(width) and width > 0 and is_integer(depth) and
depth > 0 do
cond do
k > @max_topk_k -> {:error, :topk_k_limit_exceeded}
width > div(@max_topk_counters, depth) -> {:error, :topk_counter_limit_exceeded}
true -> :ok
end
end
def validate_topk_parameters(_k, _width, _depth),
do: {:error, :invalid_topk_parameters}
end