update dsync implementation to fix a regression (#5513)

Currently minio master requires 4 servers, we
have decided to run on a minimum of 2 servers
instead - fixes a regression from previous
releases where 3 server setups were supported.
This commit is contained in:
Harshavardhana 2018-02-12 01:46:12 -08:00 committed by Nitish Tiwari
parent 4f73fd9487
commit 8de6cf4124
4 changed files with 16 additions and 14 deletions

View File

@ -108,7 +108,7 @@ func TestNewEndpointList(t *testing.T) {
{[]string{"d1", "d2", "d3", "d1"}, fmt.Errorf("duplicate endpoints found")},
{[]string{"d1", "d2", "d3", "./d1"}, fmt.Errorf("duplicate endpoints found")},
{[]string{"http://localhost/d1", "http://localhost/d2", "http://localhost/d1", "http://localhost/d4"}, fmt.Errorf("duplicate endpoints found")},
{[]string{"d1", "d2", "d3", "d4", "d5"}, fmt.Errorf("A total of 5 endpoints were found. For erasure mode it should be an even number between 4 and 16")},
{[]string{"d1", "d2", "d3", "d4", "d5"}, fmt.Errorf("A total of 5 endpoints were found. For erasure mode it should be an even number between 4 and 32")},
{[]string{"ftp://server/d1", "http://server/d2", "http://server/d3", "http://server/d4"}, fmt.Errorf("'ftp://server/d1': invalid URL endpoint format")},
{[]string{"d1", "http://localhost/d2", "d3", "d4"}, fmt.Errorf("mixed style endpoints are not supported")},
{[]string{"http://example.org/d1", "https://example.com/d1", "http://example.net/d1", "https://example.edut/d1"}, fmt.Errorf("mixed scheme is not supported")},

View File

@ -1,5 +1,5 @@
/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.
* Minio Cloud Storage, (C) 2016, 2017, 2018 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -35,7 +35,7 @@ const (
uploadsJSONFile = "uploads.json"
// Maximum erasure blocks.
maxErasureBlocks = 16
maxErasureBlocks = 32
// Minimum erasure blocks.
minErasureBlocks = 4
@ -51,6 +51,7 @@ type xlObjects struct {
// name space mutex for object layer
nsMutex *nsLockMap
// Variable represents bucket policies in memory.
bucketPolicies *bucketPolicies
}

View File

@ -18,6 +18,7 @@ package dsync
import (
"errors"
"math"
)
// Dsync represents dsync client object which is initialized with
@ -41,12 +42,10 @@ type Dsync struct {
// New - initializes a new dsync object with input rpcClnts.
func New(rpcClnts []NetLocker, rpcOwnNode int) (*Dsync, error) {
if len(rpcClnts) < 4 {
return nil, errors.New("Dsync is not designed for less than 4 nodes")
} else if len(rpcClnts) > 16 {
return nil, errors.New("Dsync is not designed for more than 16 nodes")
} else if len(rpcClnts)%2 != 0 {
return nil, errors.New("Dsync is not designed for an uneven number of nodes")
if len(rpcClnts) < 2 {
return nil, errors.New("Dsync is not designed for less than 2 nodes")
} else if len(rpcClnts) > 32 {
return nil, errors.New("Dsync is not designed for more than 32 nodes")
}
if rpcOwnNode > len(rpcClnts) {
@ -55,8 +54,10 @@ func New(rpcClnts []NetLocker, rpcOwnNode int) (*Dsync, error) {
ds := &Dsync{}
ds.dNodeCount = len(rpcClnts)
ds.dquorum = ds.dNodeCount/2 + 1
ds.dquorumReads = ds.dNodeCount / 2
// With odd number of nodes, write and read quorum is basically the same
ds.dquorum = int(ds.dNodeCount/2) + 1
ds.dquorumReads = int(math.Ceil(float64(ds.dNodeCount) / 2.0))
ds.ownNode = rpcOwnNode
// Initialize node name and rpc path for each NetLocker object.

6
vendor/vendor.json vendored
View File

@ -380,10 +380,10 @@
"revisionTime": "2017-02-27T07:32:28Z"
},
{
"checksumSHA1": "qhWQM7xmqaxFqADNTj8YPjE/8Ws=",
"checksumSHA1": "1AQVDkFvVxn1RMTLyjeDSESBhrc=",
"path": "github.com/minio/dsync",
"revision": "ed0989bc6c7b199f749fa6be0b7ee98d689b88c7",
"revisionTime": "2017-11-22T09:16:00Z"
"revision": "439a0961af700f80db84cc180fe324a89070fa65",
"revisionTime": "2018-01-23T12:12:34Z"
},
{
"path": "github.com/minio/go-homedir",