Skip to content
This repository was archived by the owner on Mar 26, 2020. It is now read-only.

Commit ae4b612

Browse files
committed
arbiter: Support replica 2 arbiter 1 usage
Signed-off-by: Prashanth Pai <ppai@redhat.com>
1 parent d31eef4 commit ae4b612

File tree

4 files changed

+32
-15
lines changed

4 files changed

+32
-15
lines changed

e2e/smartvol_ops_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func testSmartVolumeArbiter(t *testing.T) {
106106
createReq := api.VolCreateReq{
107107
Name: smartvolname,
108108
Size: 20,
109-
ReplicaCount: 3,
109+
ReplicaCount: 2,
110110
ArbiterCount: 1,
111111
}
112112
volinfo, err := client.VolumeCreate(createReq)

glustercli/cmd/volume-create.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,26 +166,43 @@ func volumeCreateCmdRun(cmd *cobra.Command, args []string) {
166166
if flagCreateReplicaCount > 0 {
167167
// Replicate Volume Support
168168

169-
if numBricks%flagCreateReplicaCount != 0 {
170-
failure("Invalid number of bricks specified", nil, 1)
169+
// if arbiter count is specified
170+
if cmd.Flags().Changed("arbiter") {
171+
if flagCreateArbiterCount != 1 && flagCreateReplicaCount != 2 {
172+
failure("Invalid arbiter/replica count specified. Supported arbiter configuration: replica 2, arbiter 1", nil, 1)
173+
}
174+
}
175+
176+
if numBricks%(flagCreateReplicaCount+flagCreateArbiterCount) != 0 {
177+
failure("Invalid number of bricks specified. Number of bricks must be a multiple of replica (+arbiter) count.", nil, 1)
171178
}
172179

173-
numSubvols := numBricks / flagCreateReplicaCount
180+
// FIXME: Things would've been so much simpler if specifying the
181+
// arbiter brick was simply a separate command flag such as
182+
// --arbiter-brick or even a boolean as we always pick the last
183+
// brick as arbiter.
184+
185+
numSubvols := numBricks / (flagCreateReplicaCount + flagCreateArbiterCount)
174186

187+
subvolStart := 0
188+
subvolEnd := flagCreateReplicaCount + flagCreateArbiterCount
175189
for i := 0; i < numSubvols; i++ {
176-
idx := i * flagCreateReplicaCount
177190

178-
// If Arbiter is set, set it as Brick Type for last brick
191+
// If arbiter count is set, mark the brick type of last
192+
// brick in the subvol as of Arbiter type.
179193
if flagCreateArbiterCount > 0 {
180-
bricks[idx+flagCreateReplicaCount-1].Type = "arbiter"
194+
bricks[subvolEnd-1].Type = "arbiter"
181195
}
182196

183197
subvols = append(subvols, api.SubvolReq{
184198
Type: "replicate",
185-
Bricks: bricks[idx : idx+flagCreateReplicaCount],
199+
Bricks: bricks[subvolStart:subvolEnd],
186200
ReplicaCount: flagCreateReplicaCount,
187201
ArbiterCount: flagCreateArbiterCount,
188202
})
203+
204+
subvolStart = subvolEnd
205+
subvolEnd += (flagCreateReplicaCount + flagCreateArbiterCount)
189206
}
190207
} else if flagCreateDisperseCount > 0 || flagCreateDisperseDataCount > 0 || flagCreateDisperseRedundancyCount > 0 {
191208
subvolSize := 0

glusterd2/bricksplanner/subvoltype_replicate.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@ func (s *replicaSubvolPlanner) Init(req *api.VolCreateReq, subvolSize uint64) {
2222
}
2323

2424
func (s *replicaSubvolPlanner) BricksCount() int {
25-
return s.replicaCount
25+
return s.replicaCount + s.arbiterCount
2626
}
2727

2828
func (s *replicaSubvolPlanner) BrickSize(idx int) uint64 {
29-
if idx == (s.replicaCount-1) && s.arbiterCount > 0 {
29+
if idx == (s.replicaCount) && s.arbiterCount > 0 {
3030
return s.arbiterBrickSize
3131
}
3232

3333
return s.brickSize
3434
}
3535

3636
func (s *replicaSubvolPlanner) BrickType(idx int) string {
37-
if idx == (s.replicaCount-1) && s.arbiterCount > 0 {
37+
if idx == (s.replicaCount) && s.arbiterCount > 0 {
3838
return "arbiter"
3939
}
4040

glusterd2/commands/volumes/volume-create-txn.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ func populateSubvols(volinfo *volume.Volinfo, req *api.VolCreateReq) error {
6565
return errors.New("replica count not specified")
6666
}
6767

68-
if subvolreq.ReplicaCount > 0 && subvolreq.ReplicaCount != len(subvolreq.Bricks) {
69-
return errors.New("invalid number of bricks")
68+
if subvolreq.ReplicaCount > 0 && (subvolreq.ReplicaCount+subvolreq.ArbiterCount) != len(subvolreq.Bricks) {
69+
return errors.New("invalid number of bricks specified. Number of bricks must be a multiple of replica (+arbiter) count")
7070
}
7171

7272
name := fmt.Sprintf("%s-%s-%d", volinfo.Name, strings.ToLower(subvolreq.Type), idx)
@@ -88,8 +88,8 @@ func populateSubvols(volinfo *volume.Volinfo, req *api.VolCreateReq) error {
8888
}
8989

9090
if subvolreq.ArbiterCount != 0 {
91-
if subvolreq.ReplicaCount != 3 || subvolreq.ArbiterCount != 1 {
92-
return errors.New("for arbiter configuration, replica count must be 3 and arbiter count must be 1. The 3rd brick of the replica will be the arbiter")
91+
if subvolreq.ReplicaCount != 2 || subvolreq.ArbiterCount != 1 {
92+
return errors.New("for arbiter configuration, replica count must be 2 and arbiter count must be 1. The 3rd brick of the replica will be the arbiter")
9393
}
9494
s.ArbiterCount = 1
9595
}

0 commit comments

Comments
 (0)