-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfiguration.ex
98 lines (88 loc) · 3.13 KB
/
configuration.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# Module for managing a Calvin deployment configuration. Every component
# can store a basic instance of Configuration to be aware of the number
# of replicas and / or partitions in the Calvin deployment via a PartitionScheme
# or a type of ReplicationScheme, and can call utility functions for generating
# views of relevant components.
defmodule Configuration do
alias __MODULE__
@enforce_keys [:replication_scheme, :partition_scheme]
defstruct(
replication_scheme: nil,
partition_scheme: nil
)
@doc """
Creates a new Configuration with `partition_scheme` for partitioning
configuration and `replication_scheme` for managing replication. Supports
both async replication and synchronous Raft-based replication schemes
"""
@spec new(%ReplicationScheme.Async{} | %ReplicationScheme.Raft{}, %PartitionScheme{}) :: %Configuration{}
def new(replication_scheme, partition_scheme) do
%Configuration {
replication_scheme: replication_scheme,
partition_scheme: partition_scheme
}
end
@doc """
Given a Configuration, returns whether the current configuration contains only a single
replica
"""
@spec running_single_replica?(%Configuration{}) :: boolean()
def running_single_replica?(configuration) do
if configuration.replication_scheme.num_replicas == 1 do
true
else
false
end
end
@doc """
Given a Configuration, returns which type of replication scheme the given configuration
is using - `async` or `raft`
"""
@spec using_replication?(%Configuration{}) :: atom()
def using_replication?(configuration) do
case configuration.replication_scheme do
%ReplicationScheme.Async{} ->
:async
%ReplicationScheme.Raft{} ->
:raft
end
end
@doc """
Returns a list view of partitions per replica in the given Configuration's PartitionScheme
"""
@spec get_partition_view(%Configuration{}) :: [non_neg_integer()]
def get_partition_view(configuration) do
PartitionScheme.get_partition_view(configuration.partition_scheme)
end
@doc """
Returns a list view of replicas in the given Configuration's ReplicationScheme
"""
@spec get_replica_view(%Configuration{}) :: [atom()]
def get_replica_view(configuration) do
ReplicationScheme.get_replica_view(configuration.replication_scheme)
end
@doc """
Returns a list view of Storage components for a replica in the given Configuration
"""
@spec get_storage_view(%Configuration{}, atom()) :: [atom()]
def get_storage_view(configuration, replica) do
partitions = Configuration.get_partition_view(configuration)
Enum.map(partitions,
fn partition ->
Component.id(_replica=replica, _partition=partition, _type=:storage)
end
)
end
@doc """
Returns a list view of Sequencer components for a replica in the given Configuration
"""
@spec get_sequencer_view(%Configuration{}, atom()) :: [atom()]
def get_sequencer_view(configuration, replica) do
partitions = Configuration.get_partition_view(configuration)
Enum.map(partitions,
fn partition ->
Component.id(_replica=replica, _partition=partition, _type=:sequencer)
end
)
end
end