Skip to content

Commit 160c209

Browse files
authored
Merge pull request #92 from arangodb-helper/agency-size-1
Agency size 1
2 parents d2c7e93 + 35cd5aa commit 160c209

File tree

4 files changed

+90
-3
lines changed

4 files changed

+90
-3
lines changed

service/bootstrap_config.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,20 @@ func (bsCfg BootstrapConfig) CreateTLSConfig() (*tls.Config, error) {
6969
Certificates: []tls.Certificate{cert},
7070
}, nil
7171
}
72+
73+
// PeersNeeded returns the minimum number of peers needed for the given config.
74+
func (bsCfg BootstrapConfig) PeersNeeded() int {
75+
minServers := 1
76+
switch bsCfg.Mode {
77+
case ServiceModeCluster:
78+
minServers = 3
79+
case ServiceModeSingle:
80+
minServers = 1
81+
case ServiceModeResilientSingle:
82+
minServers = 2
83+
}
84+
if minServers < bsCfg.AgencySize {
85+
minServers = bsCfg.AgencySize
86+
}
87+
return minServers
88+
}

service/bootstrap_master.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,17 @@ func (s *Service) bootstrapMaster(ctx context.Context, runner Runner, config Con
6161
// Permanent loop:
6262
s.log.Infof("Serving as master with ID '%s' on %s:%d...", s.id, config.OwnAddress, s.announcePort)
6363

64-
if s.mode.IsSingleMode() || s.myPeers.HaveEnoughAgents() {
64+
// Can we start right away?
65+
needMorePeers := true
66+
if s.mode.IsSingleMode() {
67+
needMorePeers = false
68+
} else if !s.myPeers.HaveEnoughAgents() {
69+
needMorePeers = true
70+
} else if bsCfg.StartLocalSlaves {
71+
peersNeeded := bsCfg.PeersNeeded()
72+
needMorePeers = len(s.myPeers.AllPeers) < peersNeeded
73+
}
74+
if !needMorePeers {
6575
// We have all the agents that we need, start a single server/cluster right now
6676
s.saveSetup()
6777
s.log.Info("Starting service...")

service/local_slaves.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ import (
3333

3434
// createAndStartLocalSlaves creates additional peers for local slaves and starts services for them.
3535
func (s *Service) createAndStartLocalSlaves(wg *sync.WaitGroup, config Config, bsCfg BootstrapConfig) {
36-
peers := make([]Peer, 0, bsCfg.AgencySize)
37-
for index := 2; index <= bsCfg.AgencySize; index++ {
36+
peersNeeded := bsCfg.PeersNeeded()
37+
peers := make([]Peer, 0, peersNeeded)
38+
for index := 2; index <= peersNeeded; index++ {
3839
p := Peer{}
3940
var err error
4041
p.ID, err = createUniqueID()

test/docker_cluster_local_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,65 @@ func TestDockerClusterLocal(t *testing.T) {
8686
ShutdownStarter(t, insecureStarterEndpoint(0))
8787
}
8888

89+
// TestDockerClusterLocalAgencySize1 runs the arangodb starter in docker
90+
// with `--starter.local` & `--cluster.agency-size=1`
91+
func TestDockerClusterLocalAgencySize1(t *testing.T) {
92+
needTestMode(t, testModeDocker)
93+
needStarterMode(t, starterModeCluster)
94+
if os.Getenv("IP") == "" {
95+
t.Fatal("IP envvar must be set to IP address of this machine")
96+
}
97+
/*
98+
docker volume create arangodb1
99+
docker run -i --name=adb1 --rm -p 8528:8528 \
100+
-v arangodb1:/data \
101+
-v /var/run/docker.sock:/var/run/docker.sock \
102+
arangodb/arangodb-starter \
103+
--docker.container=adb1 \
104+
--starter.address=$IP \
105+
--starter.local \
106+
--cluster.agency-size=1
107+
*/
108+
volID := createDockerID("vol-starter-test-local-cluster-as1-")
109+
createDockerVolume(t, volID)
110+
defer removeDockerVolume(t, volID)
111+
112+
// Cleanup of left over tests
113+
removeDockerContainersByLabel(t, "starter-test=true")
114+
removeStarterCreatedDockerContainers(t)
115+
116+
start := time.Now()
117+
118+
cID := createDockerID("starter-test-local-cluster-as1-")
119+
dockerRun := Spawn(t, strings.Join([]string{
120+
"docker run -i",
121+
"--label starter-test=true",
122+
"--name=" + cID,
123+
"--rm",
124+
fmt.Sprintf("-p %d:%d", basePort, basePort),
125+
fmt.Sprintf("-v %s:/data", volID),
126+
"-v /var/run/docker.sock:/var/run/docker.sock",
127+
"arangodb/arangodb-starter",
128+
"--docker.container=" + cID,
129+
"--starter.address=$IP",
130+
"--starter.local",
131+
"--cluster.agency-size=1",
132+
createEnvironmentStarterOptions(),
133+
}, " "))
134+
defer dockerRun.Close()
135+
defer removeDockerContainer(t, cID)
136+
137+
if ok := WaitUntilStarterReady(t, whatCluster, dockerRun); ok {
138+
t.Logf("Cluster start took %s", time.Since(start))
139+
testCluster(t, insecureStarterEndpoint(0), false)
140+
}
141+
142+
if isVerbose {
143+
t.Log("Waiting for termination")
144+
}
145+
ShutdownStarter(t, insecureStarterEndpoint(0))
146+
}
147+
89148
// TestOldDockerClusterLocal runs the arangodb starter in docker with `--local`
90149
func TestOldDockerClusterLocal(t *testing.T) {
91150
needTestMode(t, testModeDocker)

0 commit comments

Comments
 (0)