mirror of https://github.com/minio/minio.git
reject bootup, if binaries are different in a cluster (#19968)
This commit is contained in:
parent
70078eab10
commit
dfab400d43
|
@ -19,9 +19,13 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -43,10 +47,15 @@ type ServerSystemConfig struct {
|
||||||
NEndpoints int
|
NEndpoints int
|
||||||
CmdLines []string
|
CmdLines []string
|
||||||
MinioEnv map[string]string
|
MinioEnv map[string]string
|
||||||
|
Checksum string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Diff - returns error on first difference found in two configs.
|
// Diff - returns error on first difference found in two configs.
|
||||||
func (s1 *ServerSystemConfig) Diff(s2 *ServerSystemConfig) error {
|
func (s1 *ServerSystemConfig) Diff(s2 *ServerSystemConfig) error {
|
||||||
|
if s1.Checksum != s2.Checksum {
|
||||||
|
return fmt.Errorf("Expected MinIO binary checksum: %s, seen: %s", s1.Checksum, s2.Checksum)
|
||||||
|
}
|
||||||
|
|
||||||
ns1 := s1.NEndpoints
|
ns1 := s1.NEndpoints
|
||||||
ns2 := s2.NEndpoints
|
ns2 := s2.NEndpoints
|
||||||
if ns1 != ns2 {
|
if ns1 != ns2 {
|
||||||
|
@ -82,7 +91,7 @@ func (s1 *ServerSystemConfig) Diff(s2 *ServerSystemConfig) error {
|
||||||
extra = append(extra, k)
|
extra = append(extra, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msg := "Expected same MINIO_ environment variables and values across all servers: "
|
msg := "Expected MINIO_* environment name and values across all servers to be same: "
|
||||||
if len(missing) > 0 {
|
if len(missing) > 0 {
|
||||||
msg += fmt.Sprintf(`Missing environment values: %v. `, missing)
|
msg += fmt.Sprintf(`Missing environment values: %v. `, missing)
|
||||||
}
|
}
|
||||||
|
@ -120,7 +129,7 @@ func getServerSystemCfg() *ServerSystemConfig {
|
||||||
}
|
}
|
||||||
envValues[envK] = logger.HashString(env.Get(envK, ""))
|
envValues[envK] = logger.HashString(env.Get(envK, ""))
|
||||||
}
|
}
|
||||||
scfg := &ServerSystemConfig{NEndpoints: globalEndpoints.NEndpoints(), MinioEnv: envValues}
|
scfg := &ServerSystemConfig{NEndpoints: globalEndpoints.NEndpoints(), MinioEnv: envValues, Checksum: binaryChecksum}
|
||||||
var cmdLines []string
|
var cmdLines []string
|
||||||
for _, ep := range globalEndpoints {
|
for _, ep := range globalEndpoints {
|
||||||
cmdLines = append(cmdLines, ep.CmdLine)
|
cmdLines = append(cmdLines, ep.CmdLine)
|
||||||
|
@ -167,6 +176,18 @@ func (client *bootstrapRESTClient) String() string {
|
||||||
return client.gridConn.String()
|
return client.gridConn.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var binaryChecksum = getBinaryChecksum()
|
||||||
|
|
||||||
|
func getBinaryChecksum() string {
|
||||||
|
mw := md5.New()
|
||||||
|
b, err := os.Open(os.Args[0])
|
||||||
|
if err == nil {
|
||||||
|
defer b.Close()
|
||||||
|
io.Copy(mw, b)
|
||||||
|
}
|
||||||
|
return hex.EncodeToString(mw.Sum(nil))
|
||||||
|
}
|
||||||
|
|
||||||
func verifyServerSystemConfig(ctx context.Context, endpointServerPools EndpointServerPools, gm *grid.Manager) error {
|
func verifyServerSystemConfig(ctx context.Context, endpointServerPools EndpointServerPools, gm *grid.Manager) error {
|
||||||
srcCfg := getServerSystemCfg()
|
srcCfg := getServerSystemCfg()
|
||||||
clnts := newBootstrapRESTClients(endpointServerPools, gm)
|
clnts := newBootstrapRESTClients(endpointServerPools, gm)
|
||||||
|
@ -196,7 +217,7 @@ func verifyServerSystemConfig(ctx context.Context, endpointServerPools EndpointS
|
||||||
err := clnt.Verify(ctx, srcCfg)
|
err := clnt.Verify(ctx, srcCfg)
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
bootstrapTraceMsg(fmt.Sprintf("clnt.Verify: %v, endpoint: %s", err, clnt))
|
bootstrapTraceMsg(fmt.Sprintf("bootstrapVerify: %v, endpoint: %s", err, clnt))
|
||||||
if !isNetworkError(err) {
|
if !isNetworkError(err) {
|
||||||
bootLogOnceIf(context.Background(), fmt.Errorf("%s has incorrect configuration: %w", clnt, err), "incorrect_"+clnt.String())
|
bootLogOnceIf(context.Background(), fmt.Errorf("%s has incorrect configuration: %w", clnt, err), "incorrect_"+clnt.String())
|
||||||
incorrectConfigs = append(incorrectConfigs, fmt.Errorf("%s has incorrect configuration: %w", clnt, err))
|
incorrectConfigs = append(incorrectConfigs, fmt.Errorf("%s has incorrect configuration: %w", clnt, err))
|
||||||
|
|
|
@ -79,6 +79,12 @@ func (z *ServerSystemConfig) DecodeMsg(dc *msgp.Reader) (err error) {
|
||||||
}
|
}
|
||||||
z.MinioEnv[za0002] = za0003
|
z.MinioEnv[za0002] = za0003
|
||||||
}
|
}
|
||||||
|
case "Checksum":
|
||||||
|
z.Checksum, err = dc.ReadString()
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Checksum")
|
||||||
|
return
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
err = dc.Skip()
|
err = dc.Skip()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -92,9 +98,9 @@ func (z *ServerSystemConfig) DecodeMsg(dc *msgp.Reader) (err error) {
|
||||||
|
|
||||||
// EncodeMsg implements msgp.Encodable
|
// EncodeMsg implements msgp.Encodable
|
||||||
func (z *ServerSystemConfig) EncodeMsg(en *msgp.Writer) (err error) {
|
func (z *ServerSystemConfig) EncodeMsg(en *msgp.Writer) (err error) {
|
||||||
// map header, size 3
|
// map header, size 4
|
||||||
// write "NEndpoints"
|
// write "NEndpoints"
|
||||||
err = en.Append(0x83, 0xaa, 0x4e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73)
|
err = en.Append(0x84, 0xaa, 0x4e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -142,15 +148,25 @@ func (z *ServerSystemConfig) EncodeMsg(en *msgp.Writer) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// write "Checksum"
|
||||||
|
err = en.Append(0xa8, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = en.WriteString(z.Checksum)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Checksum")
|
||||||
|
return
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalMsg implements msgp.Marshaler
|
// MarshalMsg implements msgp.Marshaler
|
||||||
func (z *ServerSystemConfig) MarshalMsg(b []byte) (o []byte, err error) {
|
func (z *ServerSystemConfig) MarshalMsg(b []byte) (o []byte, err error) {
|
||||||
o = msgp.Require(b, z.Msgsize())
|
o = msgp.Require(b, z.Msgsize())
|
||||||
// map header, size 3
|
// map header, size 4
|
||||||
// string "NEndpoints"
|
// string "NEndpoints"
|
||||||
o = append(o, 0x83, 0xaa, 0x4e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73)
|
o = append(o, 0x84, 0xaa, 0x4e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73)
|
||||||
o = msgp.AppendInt(o, z.NEndpoints)
|
o = msgp.AppendInt(o, z.NEndpoints)
|
||||||
// string "CmdLines"
|
// string "CmdLines"
|
||||||
o = append(o, 0xa8, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x73)
|
o = append(o, 0xa8, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x73)
|
||||||
|
@ -165,6 +181,9 @@ func (z *ServerSystemConfig) MarshalMsg(b []byte) (o []byte, err error) {
|
||||||
o = msgp.AppendString(o, za0002)
|
o = msgp.AppendString(o, za0002)
|
||||||
o = msgp.AppendString(o, za0003)
|
o = msgp.AppendString(o, za0003)
|
||||||
}
|
}
|
||||||
|
// string "Checksum"
|
||||||
|
o = append(o, 0xa8, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d)
|
||||||
|
o = msgp.AppendString(o, z.Checksum)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +260,12 @@ func (z *ServerSystemConfig) UnmarshalMsg(bts []byte) (o []byte, err error) {
|
||||||
}
|
}
|
||||||
z.MinioEnv[za0002] = za0003
|
z.MinioEnv[za0002] = za0003
|
||||||
}
|
}
|
||||||
|
case "Checksum":
|
||||||
|
z.Checksum, bts, err = msgp.ReadStringBytes(bts)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Checksum")
|
||||||
|
return
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
bts, err = msgp.Skip(bts)
|
bts, err = msgp.Skip(bts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -266,5 +291,6 @@ func (z *ServerSystemConfig) Msgsize() (s int) {
|
||||||
s += msgp.StringPrefixSize + len(za0002) + msgp.StringPrefixSize + len(za0003)
|
s += msgp.StringPrefixSize + len(za0002) + msgp.StringPrefixSize + len(za0003)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
s += 9 + msgp.StringPrefixSize + len(z.Checksum)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue