From f6f1e0cb65ead5a47e3e88d1edb4d83cd6d713ce Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:27:08 -0700 Subject: [PATCH 01/12] embed: support multiple log outputs for structured logging Zap support multi-writer by default. Signed-off-by: Gyuho Lee --- embed/config.go | 78 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/embed/config.go b/embed/config.go index 55e6a746e88..6cb26820d86 100644 --- a/embed/config.go +++ b/embed/config.go @@ -23,6 +23,7 @@ import ( "net/url" "os" "path/filepath" + "sort" "strings" "sync" "syscall" @@ -394,7 +395,17 @@ func (cfg *Config) setupLogging() error { } case "zap": - // TODO: make this more configurable + if cfg.LogOutput == "" { + cfg.LogOutput = DefaultLogOutput + } + outputs := strings.Split(cfg.LogOutput, ",") + for _, v := range outputs { + if v == DefaultLogOutput { + panic(fmt.Errorf("multi logoutput for %q is not supported yet", DefaultLogOutput)) + } + } + + // TODO: use zapcore to support more features? lcfg := zap.Config{ Level: zap.NewAtomicLevelAt(zap.InfoLevel), Development: false, @@ -404,35 +415,50 @@ func (cfg *Config) setupLogging() error { }, Encoding: "json", EncoderConfig: zap.NewProductionEncoderConfig(), - } - switch cfg.LogOutput { - case DefaultLogOutput: - if syscall.Getppid() == 1 { - // capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr)) - // where "NewDefaultFormatter" returns "NewJournaldFormatter" - // when syscall.Getppid() == 1, specify 'stdout' or 'stderr' to - // skip journald logging even when running under systemd - fmt.Println("running under init, which may be systemd!") - // TODO: capnlog.NewJournaldFormatter() - lcfg.OutputPaths = []string{"stderr"} - lcfg.ErrorOutputPaths = []string{"stderr"} - } else { - lcfg.OutputPaths = []string{"stderr"} - lcfg.ErrorOutputPaths = []string{"stderr"} - } - case "stderr": - lcfg.OutputPaths = []string{"stderr"} - lcfg.ErrorOutputPaths = []string{"stderr"} + OutputPaths: make([]string, 0), + ErrorOutputPaths: make([]string, 0), + } + outputPaths, errOutputPaths := make(map[string]struct{}), make(map[string]struct{}) + for _, v := range outputs { + switch v { + case DefaultLogOutput: + if syscall.Getppid() == 1 { + // capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr)) + // where "NewDefaultFormatter" returns "NewJournaldFormatter" + // when syscall.Getppid() == 1, specify 'stdout' or 'stderr' to + // skip journald logging even when running under systemd + // TODO: capnlog.NewJournaldFormatter() + fmt.Println("running under init, which may be systemd!") + outputPaths["stderr"] = struct{}{} + errOutputPaths["stderr"] = struct{}{} + continue + } - case "stdout": - lcfg.OutputPaths = []string{"stdout"} - lcfg.ErrorOutputPaths = []string{"stdout"} + outputPaths["stderr"] = struct{}{} + errOutputPaths["stderr"] = struct{}{} - default: - lcfg.OutputPaths = []string{cfg.LogOutput} - lcfg.ErrorOutputPaths = []string{cfg.LogOutput} + case "stderr": + outputPaths["stderr"] = struct{}{} + errOutputPaths["stderr"] = struct{}{} + + case "stdout": + outputPaths["stdout"] = struct{}{} + errOutputPaths["stdout"] = struct{}{} + + default: + outputPaths[v] = struct{}{} + errOutputPaths[v] = struct{}{} + } + } + for v := range outputPaths { + lcfg.OutputPaths = append(lcfg.OutputPaths, v) + } + for v := range errOutputPaths { + lcfg.ErrorOutputPaths = append(lcfg.ErrorOutputPaths, v) } + sort.Strings(lcfg.OutputPaths) + sort.Strings(lcfg.ErrorOutputPaths) if cfg.Debug { lcfg.Level = zap.NewAtomicLevelAt(zap.DebugLevel) From 954afc91561c1c5d8b25d4940a903d146cdfb2fc Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:32:14 -0700 Subject: [PATCH 02/12] CHANGELOG-3.4: highlight multi-log writer change Signed-off-by: Gyuho Lee --- CHANGELOG-3.4.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG-3.4.md b/CHANGELOG-3.4.md index 6ef2dc82e88..dd3ee09a076 100644 --- a/CHANGELOG-3.4.md +++ b/CHANGELOG-3.4.md @@ -140,10 +140,11 @@ See [security doc](https://github.com/coreos/etcd/blob/master/Documentation/op-g - Add [`--logger`](https://github.com/coreos/etcd/pull/9572) flag to support [structured logger and logging to file](https://github.com/coreos/etcd/issues/9438) in server-side. - e.g. `--logger=capnslog --log-output=default` is the default setting and same as previous etcd server logging format. - TODO: `--logger=zap` is experimental, and journald logging may not work when etcd runs as PID 1. - - e.g. `--logger=zap --log-output=/tmp/test.log` will log server operations with [JSON-encoded format](TODO) and writes logs to the specified file `/tmp/test.log`. - - e.g. `--logger=zap --log-output=default` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stderr` (detect systemd journald TODO). - - e.g. `--logger=zap --log-output=stderr` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stderr` (bypass journald TODO). - - e.g. `--logger=zap --log-output=stdout` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stdout` (bypass journald TODO). + - e.g. `--logger=zap --log-output=/tmp/test.log` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to the specified file `/tmp/test.log`. + - e.g. `--logger=zap --log-output=default` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stderr` (detect systemd journald TODO). + - e.g. `--logger=zap --log-output=stderr` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stderr` (bypass journald TODO). + - e.g. `--logger=zap --log-output=stdout` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stdout` (bypass journald TODO). + - e.g. `--logger=zap --log-output=a.log,b.log,c.log,stdout` [writes server logs to multiple files `a.log`, `b.log` and `c.log` at the same time](https://github.com/coreos/etcd/pull/9579) and outputs to `stdout`, in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig). - e.g. `--logger=zap --log-output=/dev/null` will discard all server logs. ### Added: `embed` From bf937535f5fcbe1b1c13c79d91ad296fb03383e7 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:50:48 -0700 Subject: [PATCH 03/12] embed: change "Config.LogOutput" to []string Signed-off-by: Gyuho Lee --- embed/config.go | 37 ++++++++++++++++++++++--------------- embed/config_test.go | 6 +++--- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/embed/config.go b/embed/config.go index 6cb26820d86..d681edf9f95 100644 --- a/embed/config.go +++ b/embed/config.go @@ -242,11 +242,12 @@ type Config struct { Logger string `json:"logger"` // LogOutput is either: - // - "default" as os.Stderr - // - "stderr" as os.Stderr - // - "stdout" as os.Stdout - // - file path to append server logs to - LogOutput string `json:"log-output"` + // - "default" as os.Stderr, + // - "stderr" as os.Stderr, + // - "stdout" as os.Stdout, + // - file path to append server logs to. + // It can be multiple when "Logger" is zap. + LogOutput []string `json:"log-output"` // Debug is true, to enable debug level logging. Debug bool `json:"debug"` @@ -319,7 +320,7 @@ func NewConfig() *Config { loggerMu: new(sync.RWMutex), logger: nil, Logger: "capnslog", - LogOutput: DefaultLogOutput, + LogOutput: []string{DefaultLogOutput}, Debug: false, LogPkgLevels: "", } @@ -381,27 +382,33 @@ func (cfg *Config) setupLogging() error { repoLog.SetLogLevel(settings) } + if len(cfg.LogOutput) != 1 { + fmt.Printf("expected only 1 value in 'log-output', got %v\n", cfg.LogOutput) + os.Exit(1) + } // capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr)) // where NewDefaultFormatter returns NewJournaldFormatter when syscall.Getppid() == 1 // specify 'stdout' or 'stderr' to skip journald logging even when running under systemd - switch cfg.LogOutput { + output := cfg.LogOutput[0] + switch output { case "stdout": capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stdout, cfg.Debug)) case "stderr": capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stderr, cfg.Debug)) case DefaultLogOutput: default: - plog.Panicf(`unknown log-output %q (only supports %q, "stdout", "stderr")`, cfg.LogOutput, DefaultLogOutput) + plog.Panicf(`unknown log-output %q (only supports %q, "stdout", "stderr")`, output, DefaultLogOutput) } case "zap": - if cfg.LogOutput == "" { - cfg.LogOutput = DefaultLogOutput + if len(cfg.LogOutput) == 0 { + cfg.LogOutput = []string{DefaultLogOutput} } - outputs := strings.Split(cfg.LogOutput, ",") - for _, v := range outputs { - if v == DefaultLogOutput { - panic(fmt.Errorf("multi logoutput for %q is not supported yet", DefaultLogOutput)) + if len(cfg.LogOutput) > 1 { + for _, v := range cfg.LogOutput { + if v == DefaultLogOutput { + panic(fmt.Errorf("multi logoutput for %q is not supported yet", DefaultLogOutput)) + } } } @@ -420,7 +427,7 @@ func (cfg *Config) setupLogging() error { ErrorOutputPaths: make([]string, 0), } outputPaths, errOutputPaths := make(map[string]struct{}), make(map[string]struct{}) - for _, v := range outputs { + for _, v := range cfg.LogOutput { switch v { case DefaultLogOutput: if syscall.Getppid() == 1 { diff --git a/embed/config_test.go b/embed/config_test.go index 0012a28d20e..ef3d9dde11d 100644 --- a/embed/config_test.go +++ b/embed/config_test.go @@ -34,14 +34,14 @@ func TestConfigFileOtherFields(t *testing.T) { PeerSecurityCfgFile securityConfig `json:"peer-transport-security"` ForceNewCluster bool `json:"force-new-cluster"` Logger string `json:"logger"` - LogOutput string `json:"log-output"` + LogOutputs []string `json:"log-output"` Debug bool `json:"debug"` }{ ctls, ptls, true, "zap", - "/dev/null", + []string{"/dev/null"}, false, } @@ -157,7 +157,7 @@ func mustCreateCfgFile(t *testing.T, b []byte) *os.File { func TestAutoCompactionModeInvalid(t *testing.T) { cfg := NewConfig() cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.AutoCompactionMode = "period" err := cfg.Validate() From 1974785511b00d827c8d928e866606c1eb26f7af Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:51:15 -0700 Subject: [PATCH 04/12] etcdmain: accept multiple values in "--log-output" Signed-off-by: Gyuho Lee --- etcdmain/config.go | 10 +++++++++- etcdmain/help.go | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/etcdmain/config.go b/etcdmain/config.go index 13cae74e101..c4a6d0a481a 100644 --- a/etcdmain/config.go +++ b/etcdmain/config.go @@ -24,6 +24,7 @@ import ( "net/url" "os" "runtime" + "sort" "strings" "github.com/coreos/etcd/embed" @@ -216,7 +217,7 @@ func newConfig() *config { // logging fs.StringVar(&cfg.ec.Logger, "logger", "capnslog", "Specify 'zap' for structured logging or 'capnslog'.") - fs.StringVar(&cfg.ec.LogOutput, "log-output", embed.DefaultLogOutput, "Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.") + fs.Var(flags.NewUniqueStringsValue(embed.DefaultLogOutput), "log-output", "Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd, or list of comma separated output targets.") fs.BoolVar(&cfg.ec.Debug, "debug", false, "Enable debug-level logging for etcd.") fs.StringVar(&cfg.ec.LogPkgLevels, "log-package-levels", "", "(To be deprecated) Specify a particular log level for each etcd package (eg: 'etcdmain=CRITICAL,etcdserver=DEBUG').") @@ -304,6 +305,13 @@ func (cfg *config) configFromCmdLine() error { cfg.ec.CORS = flags.UniqueURLsMapFromFlag(cfg.cf.flagSet, "cors") cfg.ec.HostWhitelist = flags.UniqueStringsMapFromFlag(cfg.cf.flagSet, "host-whitelist") + outputs := flags.UniqueStringsMapFromFlag(cfg.cf.flagSet, "log-output") + oss := make([]string, 0, len(outputs)) + for v := range outputs { + oss = append(oss, v) + } + sort.Strings(oss) + cfg.ec.LogOutput = oss cfg.ec.ClusterState = cfg.cf.clusterState.String() cfg.cp.Fallback = cfg.cf.fallback.String() diff --git a/etcdmain/help.go b/etcdmain/help.go index a825628d50e..72e50043a09 100644 --- a/etcdmain/help.go +++ b/etcdmain/help.go @@ -157,7 +157,7 @@ Logging: --logger 'capnslog' Specify 'zap' for structured logging or 'capnslog'. --log-output 'default' - Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd. + Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd, or list of comma separated output targets. --debug 'false' Enable debug-level logging for etcd. From 3e99487372a09b1469d40a3c37f20af5e3e8cdb1 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:51:42 -0700 Subject: [PATCH 05/12] snapshot: set string for LogOutput Signed-off-by: Gyuho Lee --- snapshot/member_test.go | 2 +- snapshot/v3_snapshot_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/snapshot/member_test.go b/snapshot/member_test.go index 6e3608a1605..652b0c94733 100644 --- a/snapshot/member_test.go +++ b/snapshot/member_test.go @@ -64,7 +64,7 @@ func TestSnapshotV3RestoreMultiMemberAdd(t *testing.T) { cfg := embed.NewConfig() cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.Name = "3" cfg.InitialClusterToken = testClusterTkn diff --git a/snapshot/v3_snapshot_test.go b/snapshot/v3_snapshot_test.go index e86762a0622..bed892efdd2 100644 --- a/snapshot/v3_snapshot_test.go +++ b/snapshot/v3_snapshot_test.go @@ -44,7 +44,7 @@ func TestSnapshotV3RestoreSingle(t *testing.T) { cfg := embed.NewConfig() cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.Name = "s1" cfg.InitialClusterToken = testClusterTkn @@ -153,7 +153,7 @@ func createSnapshotFile(t *testing.T, kvs []kv) string { cfg := embed.NewConfig() cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.Name = "default" cfg.ClusterState = "new" @@ -220,7 +220,7 @@ func restoreCluster(t *testing.T, clusterN int, dbPath string) ( for i := 0; i < clusterN; i++ { cfg := embed.NewConfig() cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.Name = fmt.Sprintf("%d", i) cfg.InitialClusterToken = testClusterTkn From cd7bfe1ea5d1eeade53242826f503716369c46c8 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:51:52 -0700 Subject: [PATCH 06/12] integration: set strings for LogOutput Signed-off-by: Gyuho Lee --- integration/embed_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration/embed_test.go b/integration/embed_test.go index cd8cda94937..985fe3929fc 100644 --- a/integration/embed_test.go +++ b/integration/embed_test.go @@ -53,7 +53,7 @@ func TestEmbedEtcd(t *testing.T) { for i := range tests { tests[i].cfg = *embed.NewConfig() tests[i].cfg.Logger = "zap" - tests[i].cfg.LogOutput = "/dev/null" + tests[i].cfg.LogOutput = []string{"/dev/null"} tests[i].cfg.Debug = false } @@ -180,7 +180,7 @@ func newEmbedURLs(secure bool, n int) (urls []url.URL) { func setupEmbedCfg(cfg *embed.Config, curls []url.URL, purls []url.URL) { cfg.Logger = "zap" - cfg.LogOutput = "/dev/null" + cfg.LogOutput = []string{"/dev/null"} cfg.Debug = false cfg.ClusterState = "new" From 8049df15c44c72d0e57d59af9b1c627535c0a7e8 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:53:42 -0700 Subject: [PATCH 07/12] CHANGELOG-3.4: highlight embed.Config.LogOutput field change Signed-off-by: Gyuho Lee --- CHANGELOG-3.4.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG-3.4.md b/CHANGELOG-3.4.md index dd3ee09a076..b1e83be2f98 100644 --- a/CHANGELOG-3.4.md +++ b/CHANGELOG-3.4.md @@ -71,6 +71,7 @@ See [code changes](https://github.com/coreos/etcd/compare/v3.3.0...v3.4.0) and [ - Previously, `Create(dirpath string, metadata []byte) (*WAL, error)`, now `Create(lg *zap.Logger, dirpath string, metadata []byte) (*WAL, error)`. - Remove [`embed.Config.SetupLogging`](https://github.com/coreos/etcd/pull/9572). - Now logger is set up automatically based on [`embed.Config.Logger`, `embed.Config.LogOutput`, `embed.Config.Debug` fields](https://github.com/coreos/etcd/pull/9572). +- Change [`embed.Config.LogOutput` type from `string` to `[]string`](https://github.com/coreos/etcd/pull/9579) to support multiple log outputs. - Remove [`pkg/cors` package](https://github.com/coreos/etcd/pull/9490). - Move `"github.com/coreos/etcd/snap"` to [`"github.com/coreos/etcd/raftsnap"`](https://github.com/coreos/etcd/pull/9211). - Move `"github.com/coreos/etcd/etcdserver/auth"` to [`"github.com/coreos/etcd/etcdserver/v2auth"`](https://github.com/coreos/etcd/pull/9275). From 671e4a50bc99d11b4f0f6d263170e9c2f0796852 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 11:55:07 -0700 Subject: [PATCH 08/12] CHANGELOG-3.4: add "LogOutput" change Signed-off-by: Gyuho Lee --- Documentation/upgrades/upgrade_3_4.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Documentation/upgrades/upgrade_3_4.md b/Documentation/upgrades/upgrade_3_4.md index 96f7d2ae291..054a0c036a4 100644 --- a/Documentation/upgrades/upgrade_3_4.md +++ b/Documentation/upgrades/upgrade_3_4.md @@ -79,6 +79,16 @@ cfg := &embed.Config{Debug: false} -cfg.SetupLogging() ``` +Changed [`embed.Config.LogOutput` type from `string` to `[]string`](https://github.com/coreos/etcd/pull/9579) to support multiple log outputs. + +```diff +import "github.com/coreos/etcd/embed" + +cfg := &embed.Config{Debug: false} +-cfg.LogOutput = "stderr" ++cfg.LogOutput = []string{"stderr"} +``` + ### Server upgrade checklists #### Upgrade requirements From 8ee87787ddc8968e295e98104327114662ed7f51 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 13:03:09 -0700 Subject: [PATCH 09/12] functional: use strings for LogOutput Signed-off-by: Gyuho Lee --- functional.yaml | 6 +- functional/agent/handler.go | 7 +- functional/rpcpb/etcd_config_test.go | 4 +- functional/rpcpb/rpc.pb.go | 357 ++++++++++++----------- functional/rpcpb/rpc.proto | 2 +- functional/tester/cluster_read_config.go | 12 +- functional/tester/cluster_test.go | 6 +- 7 files changed, 206 insertions(+), 188 deletions(-) diff --git a/functional.yaml b/functional.yaml index e7552c29e70..8e21280aa2f 100644 --- a/functional.yaml +++ b/functional.yaml @@ -34,7 +34,7 @@ agent-configs: pre-vote: true initial-corrupt-check: true logger: zap - log-output: /tmp/etcd-functional-1/etcd.log + log-output: [/tmp/etcd-functional-1/etcd.log] debug: true client-cert-data: "" client-cert-path: "" @@ -85,7 +85,7 @@ agent-configs: pre-vote: true initial-corrupt-check: true logger: zap - log-output: /tmp/etcd-functional-2/etcd.log + log-output: [/tmp/etcd-functional-2/etcd.log] debug: true client-cert-data: "" client-cert-path: "" @@ -136,7 +136,7 @@ agent-configs: pre-vote: true initial-corrupt-check: true logger: zap - log-output: /tmp/etcd-functional-3/etcd.log + log-output: [/tmp/etcd-functional-3/etcd.log] debug: true client-cert-data: "" client-cert-path: "" diff --git a/functional/agent/handler.go b/functional/agent/handler.go index 1b8c3115143..714bcbd01a5 100644 --- a/functional/agent/handler.go +++ b/functional/agent/handler.go @@ -85,13 +85,14 @@ func (srv *Server) handleTesterRequest(req *rpcpb.Request) (resp *rpcpb.Response } } +// just archive the first file func (srv *Server) createEtcdLogFile() error { var err error - srv.etcdLogFile, err = os.Create(srv.Member.Etcd.LogOutput) + srv.etcdLogFile, err = os.Create(srv.Member.Etcd.LogOutput[0]) if err != nil { return err } - srv.lg.Info("created etcd log file", zap.String("path", srv.Member.Etcd.LogOutput)) + srv.lg.Info("created etcd log file", zap.String("path", srv.Member.Etcd.LogOutput[0])) return nil } @@ -664,7 +665,7 @@ func (srv *Server) handle_SIGQUIT_ETCD_AND_ARCHIVE_DATA() (*rpcpb.Response, erro // TODO: support separate WAL directory if err = archive( srv.Member.BaseDir, - srv.Member.Etcd.LogOutput, + srv.Member.Etcd.LogOutput[0], srv.Member.Etcd.DataDir, ); err != nil { return nil, err diff --git a/functional/rpcpb/etcd_config_test.go b/functional/rpcpb/etcd_config_test.go index 0ad410885c6..89bc2947084 100644 --- a/functional/rpcpb/etcd_config_test.go +++ b/functional/rpcpb/etcd_config_test.go @@ -58,7 +58,7 @@ func TestEtcd(t *testing.T) { InitialCorruptCheck: true, Logger: "zap", - LogOutput: "/tmp/etcd-functional-1/etcd.log", + LogOutput: []string{"/tmp/etcd-functional-1/etcd.log"}, Debug: true, } @@ -133,7 +133,7 @@ func TestEtcd(t *testing.T) { expc.PreVote = true expc.ExperimentalInitialCorruptCheck = true expc.Logger = "zap" - expc.LogOutput = "/tmp/etcd-functional-1/etcd.log" + expc.LogOutput = []string{"/tmp/etcd-functional-1/etcd.log"} expc.Debug = true cfg, err := e.EmbedConfig() if err != nil { diff --git a/functional/rpcpb/rpc.pb.go b/functional/rpcpb/rpc.pb.go index e340b5e1a78..9eb4eb1bec1 100644 --- a/functional/rpcpb/rpc.pb.go +++ b/functional/rpcpb/rpc.pb.go @@ -761,8 +761,8 @@ type Etcd struct { InitialCorruptCheck bool `protobuf:"varint,64,opt,name=InitialCorruptCheck,proto3" json:"InitialCorruptCheck,omitempty" yaml:"initial-corrupt-check"` Logger string `protobuf:"bytes,71,opt,name=Logger,proto3" json:"Logger,omitempty" yaml:"logger"` // LogOutput is the log file to store current etcd server logs. - LogOutput string `protobuf:"bytes,72,opt,name=LogOutput,proto3" json:"LogOutput,omitempty" yaml:"log-output"` - Debug bool `protobuf:"varint,73,opt,name=Debug,proto3" json:"Debug,omitempty" yaml:"debug"` + LogOutput []string `protobuf:"bytes,72,rep,name=LogOutput" json:"LogOutput,omitempty" yaml:"log-output"` + Debug bool `protobuf:"varint,73,opt,name=Debug,proto3" json:"Debug,omitempty" yaml:"debug"` } func (m *Etcd) Reset() { *m = Etcd{} } @@ -1790,12 +1790,21 @@ func (m *Etcd) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.Logger) } if len(m.LogOutput) > 0 { - dAtA[i] = 0xc2 - i++ - dAtA[i] = 0x4 - i++ - i = encodeVarintRpc(dAtA, i, uint64(len(m.LogOutput))) - i += copy(dAtA[i:], m.LogOutput) + for _, s := range m.LogOutput { + dAtA[i] = 0xc2 + i++ + dAtA[i] = 0x4 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } } if m.Debug { dAtA[i] = 0xc8 @@ -2200,9 +2209,11 @@ func (m *Etcd) Size() (n int) { if l > 0 { n += 2 + l + sovRpc(uint64(l)) } - l = len(m.LogOutput) - if l > 0 { - n += 2 + l + sovRpc(uint64(l)) + if len(m.LogOutput) > 0 { + for _, s := range m.LogOutput { + l = len(s) + n += 2 + l + sovRpc(uint64(l)) + } } if m.Debug { n += 3 @@ -4859,7 +4870,7 @@ func (m *Etcd) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.LogOutput = string(dAtA[iNdEx:postIndex]) + m.LogOutput = append(m.LogOutput, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 73: if wireType != 0 { @@ -5010,91 +5021,91 @@ var ( func init() { proto.RegisterFile("rpcpb/rpc.proto", fileDescriptorRpc) } var fileDescriptorRpc = []byte{ - // 2852 bytes of a gzipped FileDescriptorProto + // 2854 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0xcb, 0x77, 0xdb, 0xc6, 0xf5, 0x36, 0x45, 0x49, 0x96, 0xae, 0x5e, 0xd4, 0xc8, 0xb2, 0xe1, 0x97, 0x20, 0xc3, 0x71, 0x7e, 0xb2, 0x12, 0xd8, 0xf9, 0xd9, 0x39, 0x79, 0x38, 0x4d, 0x1c, 0x90, 0x82, 0x2d, 0x56, 0x10, 0x49, 0x0f, 0x21, 0xdb, 0x59, 0xf1, 0x40, 0xe4, 0x48, 0xe2, 0x31, 0x05, 0x30, 0xc0, 0xd0, 0x91, 0xb2, 0xeb, 0xaa, 0xdb, 0x36, 0x7d, 0x9c, 0xf6, 0x9c, 0xae, 0xba, 0x6e, 0xda, 0x7f, 0xc3, 0x79, 0xb5, 0x69, 0xbb, 0x6a, 0x17, 0x3c, 0x6d, 0xba, 0xe9, 0xaa, 0x0b, 0x9e, 0xbe, 0x57, 0x3d, 0x33, 0x03, - 0x88, 0x03, 0x80, 0x94, 0xb4, 0x92, 0xe6, 0xde, 0xef, 0xfb, 0xe6, 0xce, 0xdc, 0xc1, 0xdc, 0x0b, - 0x10, 0xe6, 0xfc, 0x76, 0xbd, 0xbd, 0x7d, 0xdb, 0x6f, 0xd7, 0x6f, 0xb5, 0x7d, 0x8f, 0x7a, 0x68, - 0x8c, 0x1b, 0x2e, 0xe9, 0xbb, 0x4d, 0xba, 0xd7, 0xd9, 0xbe, 0x55, 0xf7, 0xf6, 0x6f, 0xef, 0x7a, - 0xbb, 0xde, 0x6d, 0xee, 0xdd, 0xee, 0xec, 0xf0, 0x11, 0x1f, 0xf0, 0xff, 0x04, 0x4b, 0xfb, 0x6e, - 0x06, 0xce, 0x62, 0xf2, 0x61, 0x87, 0x04, 0x14, 0xdd, 0x82, 0xc9, 0x72, 0x9b, 0xf8, 0x0e, 0x6d, - 0x7a, 0xae, 0x92, 0x59, 0xce, 0xac, 0xcc, 0xde, 0xc9, 0xdd, 0xe2, 0xaa, 0xb7, 0x8e, 0xec, 0xb8, - 0x0f, 0x41, 0x37, 0x60, 0x7c, 0x93, 0xec, 0x6f, 0x13, 0x5f, 0x19, 0x59, 0xce, 0xac, 0x4c, 0xdd, - 0x99, 0x09, 0xc1, 0xc2, 0x88, 0x43, 0x27, 0x83, 0xd9, 0x24, 0xa0, 0xc4, 0x57, 0xb2, 0x31, 0x98, - 0x30, 0xe2, 0xd0, 0xa9, 0xfd, 0x75, 0x04, 0xa6, 0xab, 0xae, 0xd3, 0x0e, 0xf6, 0x3c, 0x5a, 0x74, - 0x77, 0x3c, 0xb4, 0x04, 0x20, 0x14, 0x4a, 0xce, 0x3e, 0xe1, 0xf1, 0x4c, 0x62, 0xc9, 0x82, 0x56, - 0x21, 0x27, 0x46, 0x85, 0x56, 0x93, 0xb8, 0x74, 0x0b, 0x5b, 0x81, 0x32, 0xb2, 0x9c, 0x5d, 0x99, - 0xc4, 0x29, 0x3b, 0xd2, 0xfa, 0xda, 0x15, 0x87, 0xee, 0xf1, 0x48, 0x26, 0x71, 0xcc, 0xc6, 0xf4, - 0xa2, 0xf1, 0x83, 0x66, 0x8b, 0x54, 0x9b, 0x1f, 0x13, 0x65, 0x94, 0xe3, 0x52, 0x76, 0xf4, 0x2a, - 0xcc, 0x47, 0x36, 0xdb, 0xa3, 0x4e, 0x8b, 0x83, 0xc7, 0x38, 0x38, 0xed, 0x90, 0x95, 0xb9, 0x71, - 0x83, 0x1c, 0x2a, 0xe3, 0xcb, 0x99, 0x95, 0x2c, 0x4e, 0xd9, 0xe5, 0x48, 0xd7, 0x9d, 0x60, 0x4f, - 0x39, 0xcb, 0x71, 0x31, 0x9b, 0xac, 0x87, 0xc9, 0xf3, 0x66, 0xc0, 0xf2, 0x35, 0x11, 0xd7, 0x8b, - 0xec, 0x08, 0xc1, 0xa8, 0xed, 0x79, 0xcf, 0x94, 0x49, 0x1e, 0x1c, 0xff, 0x5f, 0xfb, 0x59, 0x06, - 0x26, 0x30, 0x09, 0xda, 0x9e, 0x1b, 0x10, 0xa4, 0xc0, 0xd9, 0x6a, 0xa7, 0x5e, 0x27, 0x41, 0xc0, - 0xf7, 0x78, 0x02, 0x47, 0x43, 0x74, 0x1e, 0xc6, 0xab, 0xd4, 0xa1, 0x9d, 0x80, 0xe7, 0x77, 0x12, - 0x87, 0x23, 0x29, 0xef, 0xd9, 0xe3, 0xf2, 0xfe, 0x66, 0x3c, 0x9f, 0x7c, 0x2f, 0xa7, 0xee, 0x2c, - 0x84, 0x60, 0xd9, 0x85, 0x63, 0x40, 0xed, 0x93, 0xe9, 0x68, 0x02, 0xf4, 0x1a, 0x4c, 0x98, 0xb4, - 0xde, 0x30, 0x0f, 0x48, 0x5d, 0x9c, 0x80, 0xfc, 0xb9, 0x5e, 0x57, 0xcd, 0x1d, 0x3a, 0xfb, 0xad, - 0x7b, 0x1a, 0xa1, 0xf5, 0x86, 0x4e, 0x0e, 0x48, 0x5d, 0xc3, 0x47, 0x28, 0x74, 0x17, 0x26, 0x8d, - 0x5d, 0xe2, 0x52, 0xa3, 0xd1, 0xf0, 0x95, 0x29, 0x4e, 0x59, 0xec, 0x75, 0xd5, 0x79, 0x41, 0x71, - 0x98, 0x4b, 0x77, 0x1a, 0x0d, 0x5f, 0xc3, 0x7d, 0x1c, 0xb2, 0x60, 0xfe, 0x81, 0xd3, 0x6c, 0xb5, - 0xbd, 0xa6, 0x4b, 0xd7, 0x6d, 0xbb, 0xc2, 0xc9, 0xd3, 0x9c, 0xbc, 0xd4, 0xeb, 0xaa, 0x97, 0x04, - 0x79, 0x27, 0x82, 0xe8, 0x7b, 0x94, 0xb6, 0x43, 0x95, 0x34, 0x11, 0xe9, 0x70, 0x36, 0xef, 0x04, - 0x64, 0xad, 0xe9, 0x2b, 0x84, 0x6b, 0x2c, 0xf4, 0xba, 0xea, 0x9c, 0xd0, 0xd8, 0x76, 0x02, 0xa2, - 0x37, 0x9a, 0xbe, 0x86, 0x23, 0x0c, 0x7a, 0x08, 0x73, 0x2c, 0x7a, 0x71, 0x5a, 0x2b, 0xbe, 0x77, - 0x70, 0xa8, 0x7c, 0xc6, 0x33, 0x91, 0xbf, 0xd2, 0xeb, 0xaa, 0x8a, 0xb4, 0xd6, 0x3a, 0x87, 0xe8, - 0x6d, 0x86, 0xd1, 0x70, 0x92, 0x85, 0x0c, 0x98, 0x61, 0xa6, 0x0a, 0x21, 0xbe, 0x90, 0xf9, 0x5c, - 0xc8, 0x5c, 0xea, 0x75, 0xd5, 0xf3, 0x92, 0x4c, 0x9b, 0x10, 0x3f, 0x12, 0x89, 0x33, 0x50, 0x05, - 0x50, 0x5f, 0xd5, 0x74, 0x1b, 0x7c, 0x61, 0xca, 0xa7, 0x3c, 0xff, 0x79, 0xb5, 0xd7, 0x55, 0x2f, - 0xa7, 0xc3, 0x21, 0x21, 0x4c, 0xc3, 0x03, 0xb8, 0xe8, 0xff, 0x61, 0x94, 0x59, 0x95, 0x5f, 0x8a, - 0x3b, 0x62, 0x2a, 0x4c, 0x3f, 0xb3, 0xe5, 0xe7, 0x7a, 0x5d, 0x75, 0xaa, 0x2f, 0xa8, 0x61, 0x0e, - 0x45, 0x79, 0x58, 0x64, 0x7f, 0xcb, 0x6e, 0xff, 0x30, 0x07, 0xd4, 0xf3, 0x89, 0xf2, 0xab, 0xb4, - 0x06, 0x1e, 0x0c, 0x45, 0x6b, 0x30, 0x2b, 0x02, 0x29, 0x10, 0x9f, 0xae, 0x39, 0xd4, 0x51, 0xbe, - 0xcf, 0x9f, 0xf9, 0xfc, 0xe5, 0x5e, 0x57, 0xbd, 0x20, 0xe6, 0x0c, 0xe3, 0xaf, 0x13, 0x9f, 0xea, - 0x0d, 0x87, 0x3a, 0x1a, 0x4e, 0x70, 0xe2, 0x2a, 0xfc, 0xe2, 0xf8, 0xe4, 0x58, 0x95, 0xb6, 0x43, - 0xf7, 0x62, 0x2a, 0xfc, 0x62, 0x31, 0x60, 0x46, 0x58, 0x36, 0xc8, 0x21, 0x0f, 0xe5, 0x07, 0x42, - 0x44, 0xca, 0x4b, 0x28, 0xf2, 0x8c, 0x1c, 0x86, 0x91, 0xc4, 0x19, 0x31, 0x09, 0x1e, 0xc7, 0x0f, - 0x8f, 0x93, 0x10, 0x61, 0xc4, 0x19, 0xc8, 0x86, 0x05, 0x61, 0xb0, 0xfd, 0x4e, 0x40, 0x49, 0xa3, - 0x60, 0xf0, 0x58, 0x7e, 0x24, 0x84, 0xae, 0xf5, 0xba, 0xea, 0xd5, 0x98, 0x10, 0x15, 0x30, 0xbd, - 0xee, 0x84, 0x21, 0x0d, 0xa2, 0x0f, 0x50, 0xe5, 0xe1, 0xfd, 0xf8, 0x14, 0xaa, 0x22, 0xca, 0x41, - 0x74, 0xf4, 0x1e, 0x4c, 0xb3, 0x33, 0x79, 0x94, 0xbb, 0x7f, 0x08, 0xb9, 0x8b, 0xbd, 0xae, 0xba, - 0x28, 0xe4, 0xf8, 0x19, 0x96, 0x32, 0x17, 0xc3, 0xcb, 0x7c, 0x1e, 0xce, 0x3f, 0x8f, 0xe1, 0x8b, - 0x30, 0x62, 0x78, 0xf4, 0x0e, 0x4c, 0xb1, 0x71, 0x94, 0xaf, 0x7f, 0x09, 0xba, 0xd2, 0xeb, 0xaa, - 0xe7, 0x24, 0x7a, 0x3f, 0x5b, 0x32, 0x5a, 0x22, 0xf3, 0xb9, 0xff, 0x3d, 0x9c, 0x2c, 0xa6, 0x96, - 0xd1, 0xa8, 0x04, 0xf3, 0x6c, 0x18, 0xcf, 0xd1, 0x7f, 0xb2, 0xc9, 0xe7, 0x8f, 0x4b, 0xa4, 0x32, - 0x94, 0xa6, 0xa6, 0xf4, 0x78, 0x48, 0xff, 0x3d, 0x51, 0x4f, 0x44, 0x96, 0xa6, 0xa2, 0x77, 0x13, - 0x85, 0xf4, 0x0f, 0xa3, 0xc9, 0xd5, 0x05, 0xa1, 0x3b, 0xda, 0xd8, 0x58, 0x8d, 0x7d, 0x2b, 0x51, - 0x13, 0xfe, 0x78, 0xea, 0xa2, 0xf0, 0xf3, 0xe9, 0xa8, 0x8d, 0x60, 0xf7, 0x2b, 0x5b, 0x1b, 0xbb, - 0x5f, 0x33, 0xc9, 0xfb, 0x95, 0x6d, 0x44, 0x78, 0xbf, 0x86, 0x18, 0xf4, 0x2a, 0x9c, 0x2d, 0x11, - 0xfa, 0x91, 0xe7, 0x3f, 0x13, 0x75, 0x2c, 0x8f, 0x7a, 0x5d, 0x75, 0x56, 0xc0, 0x5d, 0xe1, 0xd0, - 0x70, 0x04, 0x41, 0xd7, 0x61, 0x94, 0xdf, 0xfe, 0x62, 0x8b, 0xa4, 0x1b, 0x4a, 0x5c, 0xf7, 0xdc, - 0x89, 0x0a, 0x30, 0xbb, 0x46, 0x5a, 0xce, 0xa1, 0xe5, 0x50, 0xe2, 0xd6, 0x0f, 0x37, 0x03, 0x5e, - 0x69, 0x66, 0xe4, 0x6b, 0xa1, 0xc1, 0xfc, 0x7a, 0x4b, 0x00, 0xf4, 0xfd, 0x40, 0xc3, 0x09, 0x0a, - 0xfa, 0x36, 0xe4, 0xe2, 0x16, 0xfc, 0x9c, 0xd7, 0x9c, 0x19, 0xb9, 0xe6, 0x24, 0x65, 0x74, 0xff, - 0xb9, 0x86, 0x53, 0x3c, 0xf4, 0x01, 0x2c, 0x6e, 0xb5, 0x1b, 0x0e, 0x25, 0x8d, 0x44, 0x5c, 0x33, - 0x5c, 0xf0, 0x7a, 0xaf, 0xab, 0xaa, 0x42, 0xb0, 0x23, 0x60, 0x7a, 0x3a, 0xbe, 0xc1, 0x0a, 0xe8, - 0x0d, 0x00, 0xec, 0x75, 0xdc, 0x86, 0xd5, 0xdc, 0x6f, 0x52, 0x65, 0x71, 0x39, 0xb3, 0x32, 0x96, - 0x3f, 0xdf, 0xeb, 0xaa, 0x48, 0xe8, 0xf9, 0xcc, 0xa7, 0xb7, 0x98, 0x53, 0xc3, 0x12, 0x12, 0xe5, - 0x61, 0xd6, 0x3c, 0x68, 0xd2, 0xb2, 0x5b, 0x70, 0x02, 0xc2, 0x8a, 0xa4, 0x72, 0x3e, 0x55, 0x8d, - 0x0e, 0x9a, 0x54, 0xf7, 0x5c, 0x9d, 0x15, 0xd6, 0x8e, 0x4f, 0x34, 0x9c, 0x60, 0xa0, 0xb7, 0x61, - 0xca, 0x74, 0x9d, 0xed, 0x16, 0xa9, 0xb4, 0x7d, 0x6f, 0x47, 0xb9, 0xc0, 0x05, 0x2e, 0xf4, 0xba, - 0xea, 0x42, 0x28, 0xc0, 0x9d, 0x7a, 0x9b, 0x79, 0x35, 0x2c, 0x63, 0xd1, 0x3d, 0x98, 0x62, 0x32, - 0x7c, 0x31, 0x9b, 0x81, 0xa2, 0xf2, 0x7d, 0x90, 0x8e, 0x69, 0x9d, 0x17, 0x62, 0xbe, 0x09, 0x6c, - 0xf1, 0x32, 0x98, 0x4d, 0xcb, 0x86, 0xd5, 0xbd, 0xce, 0xce, 0x4e, 0x8b, 0x28, 0xcb, 0xc9, 0x69, - 0x39, 0x37, 0x10, 0xde, 0x90, 0x1a, 0x62, 0xd1, 0xcb, 0x30, 0xc6, 0x86, 0x81, 0x72, 0x8d, 0x75, - 0xa2, 0xf9, 0x5c, 0xaf, 0xab, 0x4e, 0xf7, 0x49, 0x81, 0x86, 0x85, 0x1b, 0x6d, 0x48, 0x1d, 0x47, - 0xc1, 0xdb, 0xdf, 0x77, 0xdc, 0x46, 0xa0, 0x68, 0x9c, 0x73, 0xb5, 0xd7, 0x55, 0x2f, 0x26, 0x3b, - 0x8e, 0x7a, 0x88, 0x91, 0x1b, 0x8e, 0x88, 0xc7, 0x8e, 0x23, 0xee, 0xb8, 0x2e, 0xf1, 0x59, 0x07, - 0xc4, 0x1f, 0xcb, 0x9b, 0xc9, 0x2a, 0xe5, 0x73, 0x3f, 0xef, 0x96, 0xa2, 0x2a, 0x15, 0xa7, 0xa0, - 0x22, 0xe4, 0xcc, 0x03, 0x4a, 0x7c, 0xd7, 0x69, 0x1d, 0xc9, 0xac, 0x72, 0x19, 0x29, 0x20, 0x12, - 0x22, 0x64, 0xa1, 0x14, 0x0d, 0xdd, 0x81, 0xc9, 0x2a, 0xf5, 0x49, 0x10, 0x10, 0x3f, 0x50, 0x08, - 0x5f, 0x94, 0xd4, 0xb6, 0x05, 0x91, 0x4b, 0xc3, 0x7d, 0x18, 0xba, 0x0d, 0x13, 0x85, 0x3d, 0x52, - 0x7f, 0xc6, 0x28, 0x3b, 0x9c, 0x22, 0x3d, 0xd5, 0xf5, 0xd0, 0xa3, 0xe1, 0x23, 0x10, 0x2b, 0x89, - 0x82, 0xbd, 0x41, 0x0e, 0x79, 0xfb, 0xcd, 0x9b, 0xa6, 0x31, 0xf9, 0x7c, 0x89, 0x99, 0xf8, 0x55, + 0x88, 0x03, 0x80, 0x94, 0xb4, 0xb2, 0xe7, 0xde, 0xef, 0xfb, 0xe6, 0xce, 0xdc, 0x99, 0xb9, 0x17, + 0x14, 0xcc, 0xf9, 0xed, 0x7a, 0x7b, 0xfb, 0xb6, 0xdf, 0xae, 0xdf, 0x6a, 0xfb, 0x1e, 0xf5, 0xd0, + 0x18, 0x37, 0x5c, 0xd2, 0x77, 0x9b, 0x74, 0xaf, 0xb3, 0x7d, 0xab, 0xee, 0xed, 0xdf, 0xde, 0xf5, + 0x76, 0xbd, 0xdb, 0xdc, 0xbb, 0xdd, 0xd9, 0xe1, 0x23, 0x3e, 0xe0, 0xff, 0x13, 0x2c, 0xed, 0xbb, + 0x19, 0x38, 0x8b, 0xc9, 0x87, 0x1d, 0x12, 0x50, 0x74, 0x0b, 0x26, 0xcb, 0x6d, 0xe2, 0x3b, 0xb4, + 0xe9, 0xb9, 0x4a, 0x66, 0x39, 0xb3, 0x32, 0x7b, 0x27, 0x77, 0x8b, 0xab, 0xde, 0x3a, 0xb2, 0xe3, + 0x3e, 0x04, 0xdd, 0x80, 0xf1, 0x4d, 0xb2, 0xbf, 0x4d, 0x7c, 0x65, 0x64, 0x39, 0xb3, 0x32, 0x75, + 0x67, 0x26, 0x04, 0x0b, 0x23, 0x0e, 0x9d, 0x0c, 0x66, 0x93, 0x80, 0x12, 0x5f, 0xc9, 0xc6, 0x60, + 0xc2, 0x88, 0x43, 0xa7, 0xf6, 0xd7, 0x11, 0x98, 0xae, 0xba, 0x4e, 0x3b, 0xd8, 0xf3, 0x68, 0xd1, + 0xdd, 0xf1, 0xd0, 0x12, 0x80, 0x50, 0x28, 0x39, 0xfb, 0x84, 0xc7, 0x33, 0x89, 0x25, 0x0b, 0x5a, + 0x85, 0x9c, 0x18, 0x15, 0x5a, 0x4d, 0xe2, 0xd2, 0x2d, 0x6c, 0x05, 0xca, 0xc8, 0x72, 0x76, 0x65, + 0x12, 0xa7, 0xec, 0x48, 0xeb, 0x6b, 0x57, 0x1c, 0xba, 0xc7, 0x23, 0x99, 0xc4, 0x31, 0x1b, 0xd3, + 0x8b, 0xc6, 0x0f, 0x9a, 0x2d, 0x52, 0x6d, 0x7e, 0x4c, 0x94, 0x51, 0x8e, 0x4b, 0xd9, 0xd1, 0xab, + 0x30, 0x1f, 0xd9, 0x6c, 0x8f, 0x3a, 0x2d, 0x0e, 0x1e, 0xe3, 0xe0, 0xb4, 0x43, 0x56, 0xe6, 0xc6, + 0x0d, 0x72, 0xa8, 0x8c, 0x2f, 0x67, 0x56, 0xb2, 0x38, 0x65, 0x97, 0x23, 0x5d, 0x77, 0x82, 0x3d, + 0xe5, 0x2c, 0xc7, 0xc5, 0x6c, 0xb2, 0x1e, 0x26, 0xcf, 0x9b, 0x01, 0xcb, 0xd7, 0x44, 0x5c, 0x2f, + 0xb2, 0x23, 0x04, 0xa3, 0xb6, 0xe7, 0x3d, 0x53, 0x26, 0x79, 0x70, 0xfc, 0xff, 0xda, 0xcf, 0x32, + 0x30, 0x81, 0x49, 0xd0, 0xf6, 0xdc, 0x80, 0x20, 0x05, 0xce, 0x56, 0x3b, 0xf5, 0x3a, 0x09, 0x02, + 0xbe, 0xc7, 0x13, 0x38, 0x1a, 0xa2, 0xf3, 0x30, 0x5e, 0xa5, 0x0e, 0xed, 0x04, 0x3c, 0xbf, 0x93, + 0x38, 0x1c, 0x49, 0x79, 0xcf, 0x1e, 0x97, 0xf7, 0x37, 0xe3, 0xf9, 0xe4, 0x7b, 0x39, 0x75, 0x67, + 0x21, 0x04, 0xcb, 0x2e, 0x1c, 0x03, 0x6a, 0x9f, 0x4c, 0x47, 0x13, 0xa0, 0xd7, 0x60, 0xc2, 0xa4, + 0xf5, 0x86, 0x79, 0x40, 0xea, 0xe2, 0x04, 0xe4, 0xcf, 0xf5, 0xba, 0x6a, 0xee, 0xd0, 0xd9, 0x6f, + 0xdd, 0xd3, 0x08, 0xad, 0x37, 0x74, 0x72, 0x40, 0xea, 0x1a, 0x3e, 0x42, 0xa1, 0xbb, 0x30, 0x69, + 0xec, 0x12, 0x97, 0x1a, 0x8d, 0x86, 0xaf, 0x4c, 0x71, 0xca, 0x62, 0xaf, 0xab, 0xce, 0x0b, 0x8a, + 0xc3, 0x5c, 0xba, 0xd3, 0x68, 0xf8, 0x1a, 0xee, 0xe3, 0x90, 0x05, 0xf3, 0x0f, 0x9c, 0x66, 0xab, + 0xed, 0x35, 0x5d, 0xba, 0x6e, 0xdb, 0x15, 0x4e, 0x9e, 0xe6, 0xe4, 0xa5, 0x5e, 0x57, 0xbd, 0x24, + 0xc8, 0x3b, 0x11, 0x44, 0xdf, 0xa3, 0xb4, 0x1d, 0xaa, 0xa4, 0x89, 0x48, 0x87, 0xb3, 0x79, 0x27, + 0x20, 0x6b, 0x4d, 0x5f, 0x21, 0x5c, 0x63, 0xa1, 0xd7, 0x55, 0xe7, 0x84, 0xc6, 0xb6, 0x13, 0x10, + 0xbd, 0xd1, 0xf4, 0x35, 0x1c, 0x61, 0xd0, 0x43, 0x98, 0x63, 0xd1, 0x8b, 0xd3, 0x5a, 0xf1, 0xbd, + 0x83, 0x43, 0xe5, 0x33, 0x9e, 0x89, 0xfc, 0x95, 0x5e, 0x57, 0x55, 0xa4, 0xb5, 0xd6, 0x39, 0x44, + 0x6f, 0x33, 0x8c, 0x86, 0x93, 0x2c, 0x64, 0xc0, 0x0c, 0x33, 0x55, 0x08, 0xf1, 0x85, 0xcc, 0xe7, + 0x42, 0xe6, 0x52, 0xaf, 0xab, 0x9e, 0x97, 0x64, 0xda, 0x84, 0xf8, 0x91, 0x48, 0x9c, 0x81, 0x2a, + 0x80, 0xfa, 0xaa, 0xa6, 0xdb, 0xe0, 0x0b, 0x53, 0x3e, 0xe5, 0xf9, 0xcf, 0xab, 0xbd, 0xae, 0x7a, + 0x39, 0x1d, 0x0e, 0x09, 0x61, 0x1a, 0x1e, 0xc0, 0x45, 0xff, 0x0f, 0xa3, 0xcc, 0xaa, 0xfc, 0x52, + 0xbc, 0x11, 0x53, 0x61, 0xfa, 0x99, 0x2d, 0x3f, 0xd7, 0xeb, 0xaa, 0x53, 0x7d, 0x41, 0x0d, 0x73, + 0x28, 0xca, 0xc3, 0x22, 0xfb, 0xb7, 0xec, 0xf6, 0x0f, 0x73, 0x40, 0x3d, 0x9f, 0x28, 0xbf, 0x4a, + 0x6b, 0xe0, 0xc1, 0x50, 0xb4, 0x06, 0xb3, 0x22, 0x90, 0x02, 0xf1, 0xe9, 0x9a, 0x43, 0x1d, 0xe5, + 0xfb, 0xfc, 0xce, 0xe7, 0x2f, 0xf7, 0xba, 0xea, 0x05, 0x31, 0x67, 0x18, 0x7f, 0x9d, 0xf8, 0x54, + 0x6f, 0x38, 0xd4, 0xd1, 0x70, 0x82, 0x13, 0x57, 0xe1, 0x0f, 0xc7, 0x27, 0xc7, 0xaa, 0xb4, 0x1d, + 0xba, 0x17, 0x53, 0xe1, 0x0f, 0x8b, 0x01, 0x33, 0xc2, 0xb2, 0x41, 0x0e, 0x79, 0x28, 0x3f, 0x10, + 0x22, 0x52, 0x5e, 0x42, 0x91, 0x67, 0xe4, 0x30, 0x8c, 0x24, 0xce, 0x88, 0x49, 0xf0, 0x38, 0x7e, + 0x78, 0x9c, 0x84, 0x08, 0x23, 0xce, 0x40, 0x36, 0x2c, 0x08, 0x83, 0xed, 0x77, 0x02, 0x4a, 0x1a, + 0x05, 0x83, 0xc7, 0xf2, 0x23, 0x21, 0x74, 0xad, 0xd7, 0x55, 0xaf, 0xc6, 0x84, 0xa8, 0x80, 0xe9, + 0x75, 0x27, 0x0c, 0x69, 0x10, 0x7d, 0x80, 0x2a, 0x0f, 0xef, 0xc7, 0xa7, 0x50, 0x15, 0x51, 0x0e, + 0xa2, 0xa3, 0xf7, 0x60, 0x9a, 0x9d, 0xc9, 0xa3, 0xdc, 0xfd, 0x43, 0xc8, 0x5d, 0xec, 0x75, 0xd5, + 0x45, 0x21, 0xc7, 0xcf, 0xb0, 0x94, 0xb9, 0x18, 0x5e, 0xe6, 0xf3, 0x70, 0xfe, 0x79, 0x0c, 0x5f, + 0x84, 0x11, 0xc3, 0xa3, 0x77, 0x60, 0x8a, 0x8d, 0xa3, 0x7c, 0xfd, 0x4b, 0xd0, 0x95, 0x5e, 0x57, + 0x3d, 0x27, 0xd1, 0xfb, 0xd9, 0x92, 0xd1, 0x12, 0x99, 0xcf, 0xfd, 0xef, 0xe1, 0x64, 0x31, 0xb5, + 0x8c, 0x46, 0x25, 0x98, 0x67, 0xc3, 0x78, 0x8e, 0xfe, 0x93, 0x4d, 0xde, 0x3f, 0x2e, 0x91, 0xca, + 0x50, 0x9a, 0x9a, 0xd2, 0xe3, 0x21, 0xfd, 0xf7, 0x44, 0x3d, 0x11, 0x59, 0x9a, 0x8a, 0xde, 0x4d, + 0x14, 0xd2, 0x3f, 0x8c, 0x26, 0x57, 0x17, 0x84, 0xee, 0x68, 0x63, 0x63, 0x35, 0xf6, 0xad, 0x44, + 0x4d, 0xf8, 0xe3, 0xa9, 0x8b, 0xc2, 0xcf, 0xa7, 0xa3, 0x36, 0x82, 0xbd, 0xaf, 0x6c, 0x6d, 0xec, + 0x7d, 0xcd, 0x24, 0xdf, 0x57, 0xb6, 0x11, 0xe1, 0xfb, 0x1a, 0x62, 0xd0, 0xab, 0x70, 0xb6, 0x44, + 0xe8, 0x47, 0x9e, 0xff, 0x4c, 0xd4, 0xb1, 0x3c, 0xea, 0x75, 0xd5, 0x59, 0x01, 0x77, 0x85, 0x43, + 0xc3, 0x11, 0x04, 0x5d, 0x87, 0x51, 0xfe, 0xfa, 0x8b, 0x2d, 0x92, 0x5e, 0x28, 0xf1, 0xdc, 0x73, + 0x27, 0x2a, 0xc0, 0xec, 0x1a, 0x69, 0x39, 0x87, 0x96, 0x43, 0x89, 0x5b, 0x3f, 0xdc, 0x0c, 0x78, + 0xa5, 0x99, 0x91, 0x9f, 0x85, 0x06, 0xf3, 0xeb, 0x2d, 0x01, 0xd0, 0xf7, 0x03, 0x0d, 0x27, 0x28, + 0xe8, 0xdb, 0x90, 0x8b, 0x5b, 0xf0, 0x73, 0x5e, 0x73, 0x66, 0xe4, 0x9a, 0x93, 0x94, 0xd1, 0xfd, + 0xe7, 0x1a, 0x4e, 0xf1, 0xd0, 0x07, 0xb0, 0xb8, 0xd5, 0x6e, 0x38, 0x94, 0x34, 0x12, 0x71, 0xcd, + 0x70, 0xc1, 0xeb, 0xbd, 0xae, 0xaa, 0x0a, 0xc1, 0x8e, 0x80, 0xe9, 0xe9, 0xf8, 0x06, 0x2b, 0xa0, + 0x37, 0x00, 0xb0, 0xd7, 0x71, 0x1b, 0x56, 0x73, 0xbf, 0x49, 0x95, 0xc5, 0xe5, 0xcc, 0xca, 0x58, + 0xfe, 0x7c, 0xaf, 0xab, 0x22, 0xa1, 0xe7, 0x33, 0x9f, 0xde, 0x62, 0x4e, 0x0d, 0x4b, 0x48, 0x94, + 0x87, 0x59, 0xf3, 0xa0, 0x49, 0xcb, 0x6e, 0xc1, 0x09, 0x08, 0x2b, 0x92, 0xca, 0xf9, 0x54, 0x35, + 0x3a, 0x68, 0x52, 0xdd, 0x73, 0x75, 0x56, 0x58, 0x3b, 0x3e, 0xd1, 0x70, 0x82, 0x81, 0xde, 0x86, + 0x29, 0xd3, 0x75, 0xb6, 0x5b, 0xa4, 0xd2, 0xf6, 0xbd, 0x1d, 0xe5, 0x02, 0x17, 0xb8, 0xd0, 0xeb, + 0xaa, 0x0b, 0xa1, 0x00, 0x77, 0xea, 0x6d, 0xe6, 0xd5, 0xb0, 0x8c, 0x45, 0xf7, 0x60, 0x8a, 0xc9, + 0xf0, 0xc5, 0x6c, 0x06, 0x8a, 0xca, 0xf7, 0x41, 0x3a, 0xa6, 0x75, 0x5e, 0x88, 0xf9, 0x26, 0xb0, + 0xc5, 0xcb, 0x60, 0x36, 0x2d, 0x1b, 0x56, 0xf7, 0x3a, 0x3b, 0x3b, 0x2d, 0xa2, 0x2c, 0x27, 0xa7, + 0xe5, 0xdc, 0x40, 0x78, 0x43, 0x6a, 0x88, 0x45, 0x2f, 0xc3, 0x18, 0x1b, 0x06, 0xca, 0x35, 0xd6, + 0x89, 0xe6, 0x73, 0xbd, 0xae, 0x3a, 0xdd, 0x27, 0x05, 0x1a, 0x16, 0x6e, 0xb4, 0x21, 0x75, 0x1c, + 0x05, 0x6f, 0x7f, 0xdf, 0x71, 0x1b, 0x81, 0xa2, 0x71, 0xce, 0xd5, 0x5e, 0x57, 0xbd, 0x98, 0xec, + 0x38, 0xea, 0x21, 0x46, 0x6e, 0x38, 0x22, 0x1e, 0x3b, 0x8e, 0xb8, 0xe3, 0xba, 0xc4, 0x67, 0x1d, + 0x10, 0xbf, 0x96, 0x37, 0x93, 0x55, 0xca, 0xe7, 0x7e, 0xde, 0x2d, 0x45, 0x55, 0x2a, 0x4e, 0x41, + 0x45, 0xc8, 0x99, 0x07, 0x94, 0xf8, 0xae, 0xd3, 0x3a, 0x92, 0x59, 0xe5, 0x32, 0x52, 0x40, 0x24, + 0x44, 0xc8, 0x42, 0x29, 0x1a, 0xba, 0x03, 0x93, 0x55, 0xea, 0x93, 0x20, 0x20, 0x7e, 0xa0, 0x10, + 0xbe, 0x28, 0xa9, 0x6d, 0x0b, 0x22, 0x97, 0x86, 0xfb, 0x30, 0x74, 0x1b, 0x26, 0x0a, 0x7b, 0xa4, + 0xfe, 0x8c, 0x51, 0x76, 0x38, 0x45, 0xba, 0xd5, 0xf5, 0xd0, 0xa3, 0xe1, 0x23, 0x10, 0x2b, 0x89, + 0x82, 0xbd, 0x41, 0x0e, 0x79, 0xfb, 0xcd, 0x9b, 0xa6, 0x31, 0xf9, 0x7c, 0x89, 0x99, 0xf8, 0x53, 0x1b, 0x34, 0x3f, 0x26, 0x1a, 0x8e, 0x33, 0xd0, 0x23, 0x40, 0x31, 0x83, 0xe5, 0xf8, 0xbb, 0x44, 0x74, 0x4d, 0x63, 0xf9, 0xe5, 0x5e, 0x57, 0xbd, 0x32, 0x50, 0x47, 0x6f, 0x31, 0x9c, 0x86, 0x07, 0x90, 0xd1, 0x13, 0x38, 0xd7, 0xb7, 0x76, 0x76, 0x76, 0x9a, 0x07, 0xd8, 0x71, 0x77, 0x89, 0xf2, @@ -5105,89 +5116,89 @@ var fileDescriptorRpc = []byte{ 0x68, 0x38, 0x49, 0x43, 0xef, 0x47, 0xb9, 0x11, 0xc5, 0x3d, 0x10, 0x1d, 0xe4, 0x98, 0x5c, 0x80, 0x43, 0x1d, 0xd1, 0x16, 0x04, 0x47, 0xa9, 0x09, 0x09, 0xe8, 0xf5, 0xe8, 0x08, 0x3d, 0xaa, 0x54, 0x45, 0xef, 0x38, 0x26, 0xf7, 0xf1, 0x21, 0xfb, 0xc3, 0x76, 0xff, 0x10, 0x3d, 0xaa, 0x54, 0xb5, - 0xef, 0xcc, 0x89, 0x6e, 0x93, 0xdd, 0xe2, 0xfd, 0xb7, 0x46, 0xf9, 0x16, 0x77, 0x9d, 0x7d, 0xa2, + 0xef, 0xcc, 0x89, 0x6e, 0x93, 0xbd, 0xe2, 0xfd, 0xaf, 0x46, 0xf9, 0x15, 0x77, 0x9d, 0x7d, 0xa2, 0x61, 0xee, 0x94, 0xeb, 0xc8, 0xc8, 0x29, 0xea, 0xc8, 0x2a, 0x8c, 0x3f, 0x31, 0x2c, 0x86, 0xce, 0x26, 0xcb, 0xc8, 0x47, 0x4e, 0x4b, 0x80, 0x43, 0x04, 0x2a, 0xc3, 0xc2, 0x3a, 0x71, 0x7c, 0xba, 0x4d, 0x1c, 0x5a, 0x74, 0x29, 0xf1, 0x9f, 0x3b, 0xad, 0xb0, 0x4a, 0x64, 0xe5, 0xdd, 0xdc, 0x8b, - 0x40, 0x7a, 0x33, 0x44, 0x69, 0x78, 0x10, 0x13, 0x15, 0x61, 0xde, 0x6c, 0x91, 0x3a, 0x7b, 0xef, - 0xb6, 0x9b, 0xfb, 0xc4, 0xeb, 0xd0, 0xcd, 0x80, 0x57, 0x8b, 0xac, 0xfc, 0x94, 0x93, 0x10, 0xa2, - 0x53, 0x81, 0xd1, 0x70, 0x9a, 0xc5, 0x1e, 0x74, 0xab, 0x19, 0x50, 0xe2, 0x4a, 0xef, 0xcd, 0x8b, - 0xc9, 0x9b, 0xa7, 0xc5, 0x11, 0x51, 0x8b, 0xdf, 0xf1, 0x5b, 0x81, 0x86, 0x53, 0x34, 0x84, 0x61, - 0xc1, 0x68, 0x3c, 0x27, 0x3e, 0x6d, 0x06, 0x44, 0x52, 0x3b, 0xcf, 0xd5, 0xa4, 0x07, 0xc8, 0x89, - 0x40, 0x71, 0xc1, 0x41, 0x64, 0xf4, 0x76, 0xd4, 0xea, 0x1a, 0x1d, 0xea, 0xd9, 0x56, 0x35, 0xbc, - 0xf5, 0xa5, 0xdc, 0x38, 0x1d, 0xea, 0xe9, 0x94, 0x09, 0xc4, 0x91, 0xec, 0x1e, 0xec, 0xb7, 0xde, - 0x46, 0x87, 0xee, 0x29, 0x0a, 0xe7, 0x0e, 0xe9, 0xd6, 0x9d, 0x4e, 0xa2, 0x5b, 0x67, 0x14, 0xf4, - 0x2d, 0x59, 0x84, 0xbd, 0xf0, 0x2b, 0x17, 0x93, 0x2f, 0x9e, 0x9c, 0xbd, 0xd3, 0x64, 0x97, 0x7f, - 0x02, 0xdb, 0x8f, 0x7e, 0x83, 0x1c, 0x72, 0xf2, 0xa5, 0xe4, 0xc9, 0x62, 0x4f, 0x8e, 0xe0, 0xc6, - 0x91, 0xc8, 0x4a, 0xb5, 0xd2, 0x5c, 0xe0, 0x72, 0xb2, 0xd1, 0x97, 0xda, 0x34, 0xa1, 0x33, 0x88, - 0xc6, 0xf6, 0x42, 0xa4, 0x8b, 0xf5, 0x70, 0x3c, 0x2b, 0x2a, 0xcf, 0x8a, 0xb4, 0x17, 0x61, 0x8e, - 0x79, 0xef, 0x27, 0x12, 0x92, 0xa0, 0x20, 0x1b, 0xe6, 0x8f, 0x52, 0x74, 0xa4, 0xb3, 0xcc, 0x75, - 0xa4, 0xdb, 0xa6, 0xe9, 0x36, 0x69, 0xd3, 0x69, 0xe9, 0xfd, 0x2c, 0x4b, 0x92, 0x69, 0x01, 0x56, - 0x9a, 0xd9, 0xff, 0x51, 0x7e, 0xaf, 0xf1, 0x1c, 0x25, 0xfb, 0xe3, 0x7e, 0x92, 0x65, 0x30, 0x7b, - 0x41, 0xe5, 0x9d, 0x7a, 0x3c, 0xcd, 0x1a, 0x97, 0x90, 0x0e, 0x9c, 0x68, 0xef, 0x53, 0xb9, 0x1e, - 0xc0, 0x65, 0x1d, 0x6d, 0xd4, 0xfb, 0xf3, 0xfd, 0xbe, 0x3e, 0xfc, 0x55, 0x41, 0x6c, 0x77, 0x0c, - 0x1e, 0x2d, 0x26, 0x4a, 0xf7, 0x4b, 0x43, 0x9b, 0x7d, 0x41, 0x96, 0xc1, 0x68, 0x33, 0xd1, 0x9c, - 0x73, 0x85, 0x1b, 0x27, 0xf5, 0xe6, 0x42, 0x28, 0xcd, 0x64, 0x1d, 0x57, 0x51, 0xa4, 0xa2, 0xd0, - 0xea, 0xf0, 0x0f, 0x6e, 0x37, 0x93, 0x67, 0x27, 0x4a, 0x55, 0x5d, 0x00, 0x34, 0x9c, 0x60, 0xb0, - 0x27, 0x3a, 0x6e, 0xa9, 0x52, 0x87, 0x92, 0xb0, 0x11, 0x90, 0x36, 0x38, 0x21, 0xa4, 0x07, 0x0c, - 0xa6, 0xe1, 0x41, 0xe4, 0xb4, 0xa6, 0xed, 0x3d, 0x23, 0xae, 0xf2, 0xca, 0x49, 0x9a, 0x94, 0xc1, - 0x52, 0x9a, 0x9c, 0x8c, 0xee, 0xc3, 0x4c, 0xf4, 0x7a, 0x50, 0xf0, 0x3a, 0x2e, 0x55, 0xee, 0xf2, - 0xbb, 0x50, 0x2e, 0x30, 0xd1, 0x7b, 0x48, 0x9d, 0xf9, 0x59, 0x81, 0x91, 0xf1, 0xc8, 0x82, 0xf9, - 0x47, 0x1d, 0x8f, 0x3a, 0x79, 0xa7, 0xfe, 0x8c, 0xb8, 0x8d, 0xfc, 0x21, 0x25, 0x81, 0xf2, 0x3a, - 0x17, 0x91, 0xda, 0xef, 0x0f, 0x19, 0x44, 0xdf, 0x16, 0x18, 0x7d, 0x9b, 0x81, 0x34, 0x9c, 0x26, - 0xb2, 0x52, 0x52, 0xf1, 0xc9, 0x63, 0x8f, 0x12, 0xe5, 0x7e, 0xf2, 0xba, 0x6a, 0xfb, 0x44, 0x7f, - 0xee, 0xb1, 0xdd, 0x89, 0x30, 0xf2, 0x8e, 0x78, 0xbe, 0xdf, 0x69, 0x53, 0xde, 0xd5, 0x28, 0xef, - 0x27, 0x8f, 0xf1, 0xd1, 0x8e, 0x08, 0x94, 0xce, 0xfb, 0x20, 0x69, 0x47, 0x24, 0x32, 0xba, 0x09, - 0xe3, 0x96, 0xb7, 0xbb, 0x4b, 0x7c, 0xe5, 0x21, 0xdf, 0xd8, 0xf9, 0x5e, 0x57, 0x9d, 0x09, 0x1f, - 0x74, 0x6e, 0xd7, 0x70, 0x08, 0x40, 0x77, 0x61, 0xd2, 0xf2, 0x76, 0xcb, 0x1d, 0xda, 0xee, 0x50, - 0x65, 0x3d, 0xf9, 0x8d, 0xac, 0xe5, 0xed, 0xea, 0x1e, 0xf7, 0x69, 0xb8, 0x8f, 0x63, 0x9d, 0xed, - 0x1a, 0xd9, 0xee, 0xec, 0x2a, 0x45, 0x1e, 0xa5, 0xd4, 0xd9, 0x36, 0x98, 0x59, 0xc3, 0xc2, 0xbd, - 0xfa, 0xd3, 0xac, 0xf4, 0x19, 0x19, 0xcd, 0xc1, 0x54, 0xa9, 0x6c, 0xd7, 0xaa, 0xb6, 0x81, 0x6d, - 0x73, 0x2d, 0x77, 0x06, 0x9d, 0x07, 0x54, 0x2c, 0x15, 0xed, 0xa2, 0x61, 0x09, 0x63, 0xcd, 0xb4, - 0x0b, 0x6b, 0x39, 0x40, 0x39, 0x98, 0xc6, 0xa6, 0x64, 0x99, 0x62, 0x96, 0x6a, 0xf1, 0xa1, 0x6d, - 0xe2, 0x4d, 0x61, 0x39, 0x87, 0x96, 0xe1, 0x4a, 0xb5, 0xf8, 0xf0, 0xd1, 0x56, 0x51, 0x60, 0x6a, - 0x46, 0x69, 0xad, 0x86, 0xcd, 0xcd, 0xf2, 0x63, 0xb3, 0xb6, 0x66, 0xd8, 0x46, 0x6e, 0x11, 0xcd, - 0xc3, 0x4c, 0xd5, 0x78, 0x6c, 0xd6, 0xaa, 0x25, 0xa3, 0x52, 0x5d, 0x2f, 0xdb, 0xb9, 0x25, 0x74, - 0x0d, 0xae, 0x32, 0xe1, 0x32, 0x36, 0x6b, 0xd1, 0x04, 0x0f, 0x70, 0x79, 0xb3, 0x0f, 0x51, 0xd1, - 0x45, 0x58, 0x1c, 0xec, 0x5a, 0x66, 0xec, 0xd4, 0x94, 0x06, 0x2e, 0xac, 0x17, 0xa3, 0x39, 0x57, - 0xd0, 0x6d, 0x78, 0xe5, 0xb8, 0xa8, 0xf8, 0xb8, 0x6a, 0x97, 0x2b, 0x35, 0xe3, 0xa1, 0x59, 0xb2, - 0x73, 0x37, 0xd1, 0x55, 0xb8, 0x98, 0xb7, 0x8c, 0xc2, 0xc6, 0x7a, 0xd9, 0x32, 0x6b, 0x15, 0xd3, - 0xc4, 0xb5, 0x4a, 0x19, 0xdb, 0x35, 0xfb, 0x69, 0x0d, 0x3f, 0xcd, 0x35, 0x90, 0x0a, 0x97, 0xb7, - 0x4a, 0xc3, 0x01, 0x04, 0x5d, 0x82, 0xc5, 0x35, 0xd3, 0x32, 0x3e, 0x48, 0xb9, 0x5e, 0x64, 0xd0, - 0x15, 0xb8, 0xb0, 0x55, 0x1a, 0xec, 0xfd, 0x2c, 0xb3, 0xfa, 0x37, 0x80, 0x51, 0xf6, 0xfe, 0x81, - 0x14, 0x38, 0x17, 0xed, 0x6d, 0xb9, 0x64, 0xd6, 0x1e, 0x94, 0x2d, 0xab, 0xfc, 0xc4, 0xc4, 0xb9, - 0x33, 0xe1, 0x6a, 0x52, 0x9e, 0xda, 0x56, 0xc9, 0x2e, 0x5a, 0x35, 0x1b, 0x17, 0x1f, 0x3e, 0x34, - 0x71, 0x7f, 0x87, 0x32, 0x08, 0xc1, 0x6c, 0x44, 0xb0, 0x4c, 0x63, 0xcd, 0xc4, 0xb9, 0x11, 0x74, - 0x13, 0x6e, 0xc4, 0x6d, 0xc3, 0xe8, 0x59, 0x99, 0xfe, 0x68, 0xab, 0x8c, 0xb7, 0x36, 0x73, 0xa3, - 0xec, 0xd0, 0x44, 0x36, 0xc3, 0xb2, 0x72, 0x63, 0xe8, 0x3a, 0xa8, 0xd1, 0x16, 0x4b, 0xbb, 0x1b, - 0x8b, 0x1c, 0xd0, 0x3d, 0x78, 0xe3, 0x04, 0xd0, 0xb0, 0x28, 0xa6, 0x58, 0x4a, 0x06, 0x70, 0xc3, - 0xf5, 0x4c, 0xa3, 0xd7, 0xe1, 0xb5, 0xa1, 0xee, 0x61, 0xa2, 0x33, 0xe8, 0x01, 0xe4, 0x07, 0xb0, - 0xc4, 0x2a, 0x43, 0x8b, 0x38, 0x97, 0xa1, 0x50, 0x44, 0x0d, 0x0f, 0x61, 0x01, 0x1b, 0x76, 0x61, - 0x3d, 0x37, 0x8b, 0x56, 0xe1, 0xe5, 0xa1, 0xc7, 0x21, 0xbe, 0x09, 0x0d, 0x64, 0xc0, 0xbb, 0xa7, - 0xc3, 0x0e, 0x0b, 0x9b, 0xa0, 0x97, 0x60, 0x79, 0xb8, 0x44, 0xb8, 0x25, 0x3b, 0xe8, 0x1d, 0x78, - 0xf3, 0x24, 0xd4, 0xb0, 0x29, 0x76, 0x8f, 0x9f, 0x22, 0x3c, 0x06, 0x7b, 0xec, 0xd9, 0x1b, 0x8e, - 0x62, 0x07, 0xa3, 0x89, 0xfe, 0x0f, 0xb4, 0x81, 0x87, 0x3d, 0xbe, 0x2d, 0x2f, 0x32, 0xe8, 0x16, - 0xdc, 0xc4, 0x46, 0x69, 0xad, 0xbc, 0x59, 0x3b, 0x05, 0xfe, 0xb3, 0x0c, 0x7a, 0x0f, 0xde, 0x3e, - 0x19, 0x38, 0x6c, 0x81, 0x9f, 0x67, 0x90, 0x09, 0xef, 0x9f, 0x7a, 0xbe, 0x61, 0x32, 0x5f, 0x64, - 0xd0, 0x35, 0xb8, 0x32, 0x98, 0x1f, 0xe6, 0xe1, 0xcb, 0x0c, 0x5a, 0x81, 0xeb, 0xc7, 0xce, 0x14, - 0x22, 0xbf, 0xca, 0xa0, 0xb7, 0xe0, 0xee, 0x71, 0x90, 0x61, 0x61, 0xfc, 0x3a, 0x83, 0xee, 0xc3, - 0xbd, 0x53, 0xcc, 0x31, 0x4c, 0xe0, 0x37, 0xc7, 0xac, 0x23, 0x4c, 0xf6, 0xd7, 0x27, 0xaf, 0x23, - 0x44, 0xfe, 0x36, 0x83, 0x96, 0xe0, 0xe2, 0x60, 0x08, 0x3b, 0x13, 0xbf, 0xcb, 0xa0, 0x1b, 0xb0, - 0x7c, 0xac, 0x12, 0x83, 0xfd, 0x3e, 0x83, 0x14, 0x58, 0x28, 0x95, 0x6b, 0x0f, 0x8c, 0xa2, 0x55, - 0x7b, 0x52, 0xb4, 0xd7, 0x6b, 0x55, 0x1b, 0x9b, 0xd5, 0x6a, 0xee, 0x17, 0x23, 0x2c, 0x94, 0x98, - 0xa7, 0x54, 0x0e, 0x9d, 0xb5, 0x07, 0x65, 0x5c, 0xb3, 0x8a, 0x8f, 0xcd, 0x12, 0x43, 0x7e, 0x3a, - 0x82, 0xe6, 0x00, 0x18, 0xac, 0x52, 0x2e, 0x96, 0xec, 0x6a, 0xee, 0x7b, 0x59, 0x34, 0x03, 0x13, - 0xe6, 0x53, 0xdb, 0xc4, 0x25, 0xc3, 0xca, 0xfd, 0x3d, 0xbb, 0xba, 0x0f, 0x13, 0xd1, 0x27, 0x0e, - 0x34, 0x0e, 0x23, 0x1b, 0x8f, 0x73, 0x67, 0xd0, 0x24, 0x8c, 0x59, 0xa6, 0x51, 0x35, 0x73, 0x19, - 0xb4, 0x00, 0x73, 0xa6, 0x65, 0x16, 0xec, 0x62, 0xb9, 0x54, 0xc3, 0x5b, 0xa5, 0x12, 0xbf, 0x3c, - 0x73, 0x30, 0xfd, 0x84, 0x3d, 0xf9, 0x91, 0x25, 0x8b, 0x16, 0x61, 0xde, 0x2a, 0x17, 0x36, 0x6a, - 0xd8, 0x28, 0x98, 0x38, 0x32, 0x8f, 0x32, 0x20, 0x17, 0x8a, 0x2c, 0x63, 0xab, 0x79, 0x38, 0x1b, - 0x7e, 0x1f, 0x41, 0x53, 0x70, 0x76, 0xe3, 0x71, 0x6d, 0xdd, 0xa8, 0xae, 0xe7, 0xce, 0xf4, 0x91, - 0xe6, 0xd3, 0x4a, 0x11, 0xb3, 0x99, 0x01, 0xc6, 0x8f, 0x26, 0x9c, 0x86, 0x89, 0x52, 0xb9, 0x56, - 0x58, 0x37, 0x0b, 0x1b, 0xb9, 0xec, 0x9d, 0xfb, 0x30, 0x69, 0xfb, 0x8e, 0x1b, 0xb4, 0x3d, 0x9f, - 0xa2, 0x3b, 0xf2, 0x60, 0x36, 0xfc, 0x4a, 0x1b, 0xfe, 0x5e, 0x7c, 0x69, 0xee, 0x68, 0x2c, 0x7e, - 0x4a, 0xd4, 0xce, 0xac, 0x64, 0x5e, 0xcb, 0xe4, 0xcf, 0xbd, 0xf8, 0xf3, 0xd2, 0x99, 0x17, 0xdf, - 0x2c, 0x65, 0xbe, 0xfe, 0x66, 0x29, 0xf3, 0xa7, 0x6f, 0x96, 0x32, 0x3f, 0xf9, 0xcb, 0xd2, 0x99, - 0xed, 0x71, 0xfe, 0x7b, 0xf3, 0xdd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x7b, 0xc4, 0x2d, - 0xb8, 0x1e, 0x00, 0x00, + 0x40, 0x7a, 0x33, 0x44, 0x69, 0x78, 0x10, 0x13, 0x15, 0x61, 0xde, 0x6c, 0x91, 0x3a, 0xfb, 0xee, + 0xb6, 0x9b, 0xfb, 0xc4, 0xeb, 0xd0, 0xcd, 0x80, 0x57, 0x8b, 0xac, 0x7c, 0xcb, 0x49, 0x08, 0xd1, + 0xa9, 0xc0, 0x68, 0x38, 0xcd, 0x62, 0x17, 0xdd, 0x6a, 0x06, 0x94, 0xb8, 0xd2, 0x77, 0xf3, 0x62, + 0xf2, 0xe5, 0x69, 0x71, 0x44, 0xd4, 0xe2, 0x77, 0xfc, 0x56, 0xa0, 0xe1, 0x14, 0x0d, 0x61, 0x58, + 0x30, 0x1a, 0xcf, 0x89, 0x4f, 0x9b, 0x01, 0x91, 0xd4, 0xce, 0x73, 0x35, 0xe9, 0x02, 0x39, 0x11, + 0x28, 0x2e, 0x38, 0x88, 0x8c, 0xde, 0x8e, 0x5a, 0x5d, 0xa3, 0x43, 0x3d, 0xdb, 0xaa, 0x86, 0xaf, + 0xbe, 0x94, 0x1b, 0xa7, 0x43, 0x3d, 0x9d, 0x32, 0x81, 0x38, 0x92, 0xbd, 0x83, 0xfd, 0xd6, 0xdb, + 0xe8, 0xd0, 0x3d, 0x45, 0xe1, 0xdc, 0x21, 0xdd, 0xba, 0xd3, 0x49, 0x74, 0xeb, 0x8c, 0x82, 0xbe, + 0x25, 0x8b, 0xb0, 0x0f, 0x7e, 0xe5, 0x62, 0xf2, 0xc3, 0x93, 0xb3, 0x77, 0x9a, 0xec, 0xf1, 0x4f, + 0x60, 0xfb, 0xd1, 0x6f, 0x90, 0x43, 0x4e, 0xbe, 0x94, 0x3c, 0x59, 0xec, 0xe6, 0x08, 0x6e, 0x1c, + 0x89, 0xac, 0x54, 0x2b, 0xcd, 0x05, 0x2e, 0x27, 0x1b, 0x7d, 0xa9, 0x4d, 0x13, 0x3a, 0x83, 0x68, + 0x6c, 0x2f, 0x44, 0xba, 0x58, 0x0f, 0xc7, 0xb3, 0xa2, 0xf2, 0xac, 0x48, 0x7b, 0x11, 0xe6, 0x98, + 0xf7, 0x7e, 0x22, 0x21, 0x09, 0x0a, 0xb2, 0x61, 0xfe, 0x28, 0x45, 0x47, 0x3a, 0xcb, 0x5c, 0x47, + 0x7a, 0x6d, 0x9a, 0x6e, 0x93, 0x36, 0x9d, 0x96, 0xde, 0xcf, 0xb2, 0x24, 0x99, 0x16, 0x60, 0xa5, + 0x99, 0xfd, 0x3f, 0xca, 0xef, 0x35, 0x9e, 0xa3, 0x64, 0x7f, 0xdc, 0x4f, 0xb2, 0x0c, 0x66, 0x1f, + 0xa8, 0xbc, 0x53, 0x8f, 0xa7, 0x59, 0xe3, 0x12, 0xd2, 0x81, 0x13, 0xed, 0x7d, 0x2a, 0xd7, 0x03, + 0xb8, 0xac, 0xa3, 0x8d, 0x7a, 0x7f, 0xbe, 0xdf, 0xd7, 0x87, 0x7f, 0x2a, 0x88, 0xed, 0x8e, 0xc1, + 0xa3, 0xc5, 0x44, 0xe9, 0x7e, 0x69, 0x68, 0xb3, 0x2f, 0xc8, 0x32, 0x18, 0x6d, 0x26, 0x9a, 0x73, + 0xae, 0x70, 0xe3, 0xa4, 0xde, 0x5c, 0x08, 0xa5, 0x99, 0xac, 0xe3, 0x2a, 0x8a, 0x54, 0x14, 0x5a, + 0x1d, 0xfe, 0x83, 0xdb, 0xcd, 0xe4, 0xd9, 0x89, 0x52, 0x55, 0x17, 0x00, 0x0d, 0x27, 0x18, 0xec, + 0x46, 0xc7, 0x2d, 0x55, 0xea, 0x50, 0x12, 0x36, 0x02, 0xd2, 0x06, 0x27, 0x84, 0xf4, 0x80, 0xc1, + 0x34, 0x3c, 0x88, 0x9c, 0xd6, 0xb4, 0xbd, 0x67, 0xc4, 0x55, 0x5e, 0x39, 0x49, 0x93, 0x32, 0x58, + 0x4a, 0x93, 0x93, 0xd1, 0x7d, 0x98, 0x89, 0x3e, 0x0f, 0x0a, 0x5e, 0xc7, 0xa5, 0xca, 0x5d, 0xfe, + 0x16, 0xca, 0x05, 0x26, 0xfa, 0x0e, 0xa9, 0x33, 0x3f, 0x2b, 0x30, 0x32, 0x1e, 0x59, 0x30, 0xff, + 0xa8, 0xe3, 0x51, 0x27, 0xef, 0xd4, 0x9f, 0x11, 0xb7, 0x91, 0x3f, 0xa4, 0x24, 0x50, 0x5e, 0xe7, + 0x22, 0x52, 0xfb, 0xfd, 0x21, 0x83, 0xe8, 0xdb, 0x02, 0xa3, 0x6f, 0x33, 0x90, 0x86, 0xd3, 0x44, + 0x56, 0x4a, 0x2a, 0x3e, 0x79, 0xec, 0x51, 0xa2, 0xdc, 0x4f, 0x3e, 0x57, 0x6d, 0x9f, 0xe8, 0xcf, + 0x3d, 0xb6, 0x3b, 0x11, 0x46, 0xde, 0x11, 0xcf, 0xf7, 0x3b, 0x6d, 0xca, 0xbb, 0x1a, 0xe5, 0xfd, + 0xe4, 0x31, 0x3e, 0xda, 0x11, 0x81, 0xd2, 0x79, 0x1f, 0x24, 0xed, 0x88, 0x44, 0x46, 0x37, 0x61, + 0xdc, 0xf2, 0x76, 0x77, 0x89, 0xaf, 0x3c, 0xe4, 0x1b, 0x3b, 0xdf, 0xeb, 0xaa, 0x33, 0xe1, 0x45, + 0xe7, 0x76, 0x0d, 0x87, 0x00, 0x74, 0x17, 0x26, 0x2d, 0x6f, 0xb7, 0xdc, 0xa1, 0xed, 0x0e, 0x55, + 0xd6, 0xf9, 0x75, 0x96, 0x6a, 0x6b, 0xcb, 0xdb, 0xd5, 0x3d, 0xee, 0xd3, 0x70, 0x1f, 0xc7, 0x3a, + 0xdb, 0x35, 0xb2, 0xdd, 0xd9, 0x55, 0x8a, 0x3c, 0x4a, 0xa9, 0xb3, 0x6d, 0x30, 0xb3, 0x86, 0x85, + 0x7b, 0xf5, 0xa7, 0x59, 0xe9, 0x67, 0x64, 0x34, 0x07, 0x53, 0xa5, 0xb2, 0x5d, 0xab, 0xda, 0x06, + 0xb6, 0xcd, 0xb5, 0xdc, 0x19, 0x74, 0x1e, 0x50, 0xb1, 0x54, 0xb4, 0x8b, 0x86, 0x25, 0x8c, 0x35, + 0xd3, 0x2e, 0xac, 0xe5, 0x00, 0xe5, 0x60, 0x1a, 0x9b, 0x92, 0x65, 0x8a, 0x59, 0xaa, 0xc5, 0x87, + 0xb6, 0x89, 0x37, 0x85, 0xe5, 0x1c, 0x5a, 0x86, 0x2b, 0xd5, 0xe2, 0xc3, 0x47, 0x5b, 0x45, 0x81, + 0xa9, 0x19, 0xa5, 0xb5, 0x1a, 0x36, 0x37, 0xcb, 0x8f, 0xcd, 0xda, 0x9a, 0x61, 0x1b, 0xb9, 0x45, + 0x34, 0x0f, 0x33, 0x55, 0xe3, 0xb1, 0x59, 0xab, 0x96, 0x8c, 0x4a, 0x75, 0xbd, 0x6c, 0xe7, 0x96, + 0xd0, 0x35, 0xb8, 0xca, 0x84, 0xcb, 0xd8, 0xac, 0x45, 0x13, 0x3c, 0xc0, 0xe5, 0xcd, 0x3e, 0x44, + 0x45, 0x17, 0x61, 0x71, 0xb0, 0x6b, 0x99, 0xb1, 0x53, 0x53, 0x1a, 0xb8, 0xb0, 0x5e, 0x8c, 0xe6, + 0x5c, 0x41, 0xb7, 0xe1, 0x95, 0xe3, 0xa2, 0xe2, 0xe3, 0xaa, 0x5d, 0xae, 0xd4, 0x8c, 0x87, 0x66, + 0xc9, 0xce, 0xdd, 0x44, 0x57, 0xe1, 0x62, 0xde, 0x32, 0x0a, 0x1b, 0xeb, 0x65, 0xcb, 0xac, 0x55, + 0x4c, 0x13, 0xd7, 0x2a, 0x65, 0x6c, 0xd7, 0xec, 0xa7, 0x35, 0xfc, 0x34, 0xd7, 0x40, 0x2a, 0x5c, + 0xde, 0x2a, 0x0d, 0x07, 0x10, 0x74, 0x09, 0x16, 0xd7, 0x4c, 0xcb, 0xf8, 0x20, 0xe5, 0x7a, 0x91, + 0x41, 0x57, 0xe0, 0xc2, 0x56, 0x69, 0xb0, 0xf7, 0xb3, 0xcc, 0xea, 0xdf, 0x00, 0x46, 0xd9, 0xf7, + 0x07, 0x52, 0xe0, 0x5c, 0xb4, 0xb7, 0xe5, 0x92, 0x59, 0x7b, 0x50, 0xb6, 0xac, 0xf2, 0x13, 0x13, + 0xe7, 0xce, 0x84, 0xab, 0x49, 0x79, 0x6a, 0x5b, 0x25, 0xbb, 0x68, 0xd5, 0x6c, 0x5c, 0x7c, 0xf8, + 0xd0, 0xc4, 0xfd, 0x1d, 0xca, 0x20, 0x04, 0xb3, 0x11, 0xc1, 0x32, 0x8d, 0x35, 0x13, 0xe7, 0x46, + 0xd0, 0x4d, 0xb8, 0x11, 0xb7, 0x0d, 0xa3, 0x67, 0x65, 0xfa, 0xa3, 0xad, 0x32, 0xde, 0xda, 0xcc, + 0x8d, 0xb2, 0x43, 0x13, 0xd9, 0x0c, 0xcb, 0xca, 0x8d, 0xa1, 0xeb, 0xa0, 0x46, 0x5b, 0x2c, 0xed, + 0x6e, 0x2c, 0x72, 0x40, 0xf7, 0xe0, 0x8d, 0x13, 0x40, 0xc3, 0xa2, 0x98, 0x62, 0x29, 0x19, 0xc0, + 0x0d, 0xd7, 0x33, 0x8d, 0x5e, 0x87, 0xd7, 0x86, 0xba, 0x87, 0x89, 0xce, 0xa0, 0x07, 0x90, 0x1f, + 0xc0, 0x12, 0xab, 0x0c, 0x2d, 0xe2, 0x5c, 0x86, 0x42, 0x11, 0x35, 0x3c, 0x84, 0x05, 0x6c, 0xd8, + 0x85, 0xf5, 0xdc, 0x2c, 0x5a, 0x85, 0x97, 0x87, 0x1e, 0x87, 0xf8, 0x26, 0x34, 0x90, 0x01, 0xef, + 0x9e, 0x0e, 0x3b, 0x2c, 0x6c, 0x82, 0x5e, 0x82, 0xe5, 0xe1, 0x12, 0xe1, 0x96, 0xec, 0xa0, 0x77, + 0xe0, 0xcd, 0x93, 0x50, 0xc3, 0xa6, 0xd8, 0x3d, 0x7e, 0x8a, 0xf0, 0x18, 0xec, 0xb1, 0xbb, 0x37, + 0x1c, 0xc5, 0x0e, 0x46, 0x13, 0xfd, 0x1f, 0x68, 0x03, 0x0f, 0x7b, 0x7c, 0x5b, 0x5e, 0x64, 0xd0, + 0x2d, 0xb8, 0x89, 0x8d, 0xd2, 0x5a, 0x79, 0xb3, 0x76, 0x0a, 0xfc, 0x67, 0x19, 0xf4, 0x1e, 0xbc, + 0x7d, 0x32, 0x70, 0xd8, 0x02, 0x3f, 0xcf, 0x20, 0x13, 0xde, 0x3f, 0xf5, 0x7c, 0xc3, 0x64, 0xbe, + 0xc8, 0xa0, 0x6b, 0x70, 0x65, 0x30, 0x3f, 0xcc, 0xc3, 0x97, 0x19, 0xb4, 0x02, 0xd7, 0x8f, 0x9d, + 0x29, 0x44, 0x7e, 0x95, 0x41, 0x6f, 0xc1, 0xdd, 0xe3, 0x20, 0xc3, 0xc2, 0xf8, 0x75, 0x06, 0xdd, + 0x87, 0x7b, 0xa7, 0x98, 0x63, 0x98, 0xc0, 0x6f, 0x8e, 0x59, 0x47, 0x98, 0xec, 0xaf, 0x4f, 0x5e, + 0x47, 0x88, 0xfc, 0x6d, 0x06, 0x2d, 0xc1, 0xc5, 0xc1, 0x10, 0x76, 0x26, 0x7e, 0x97, 0x41, 0x37, + 0x60, 0xf9, 0x58, 0x25, 0x06, 0xfb, 0x7d, 0x06, 0x29, 0xb0, 0x50, 0x2a, 0xd7, 0x1e, 0x18, 0x45, + 0xab, 0xf6, 0xa4, 0x68, 0xaf, 0xd7, 0xaa, 0x36, 0x36, 0xab, 0xd5, 0xdc, 0x2f, 0x46, 0x58, 0x28, + 0x31, 0x4f, 0xa9, 0x1c, 0x3a, 0x6b, 0x0f, 0xca, 0xb8, 0x66, 0x15, 0x1f, 0x9b, 0x25, 0x86, 0xfc, + 0x74, 0x04, 0xcd, 0x01, 0x30, 0x58, 0xa5, 0x5c, 0x2c, 0xd9, 0xd5, 0xdc, 0xf7, 0xb2, 0x68, 0x06, + 0x26, 0xcc, 0xa7, 0xb6, 0x89, 0x4b, 0x86, 0x95, 0xfb, 0x7b, 0x76, 0x75, 0x1f, 0x26, 0xa2, 0x9f, + 0x38, 0xd0, 0x38, 0x8c, 0x6c, 0x3c, 0xce, 0x9d, 0x41, 0x93, 0x30, 0x66, 0x99, 0x46, 0xd5, 0xcc, + 0x65, 0xd0, 0x02, 0xcc, 0x99, 0x96, 0x59, 0xb0, 0x8b, 0xe5, 0x52, 0x0d, 0x6f, 0x95, 0x4a, 0xfc, + 0xf1, 0xcc, 0xc1, 0xf4, 0x13, 0x76, 0xf3, 0x23, 0x4b, 0x16, 0x2d, 0xc2, 0xbc, 0x55, 0x2e, 0x6c, + 0xd4, 0xb0, 0x51, 0x30, 0x71, 0x64, 0x1e, 0x65, 0x40, 0x2e, 0x14, 0x59, 0xc6, 0x56, 0xf3, 0x70, + 0x36, 0xfc, 0x7d, 0x04, 0x4d, 0xc1, 0xd9, 0x8d, 0xc7, 0xb5, 0x75, 0xa3, 0xba, 0x9e, 0x3b, 0xd3, + 0x47, 0x9a, 0x4f, 0x2b, 0x45, 0xcc, 0x66, 0x06, 0x18, 0x3f, 0x9a, 0x70, 0x1a, 0x26, 0x4a, 0xe5, + 0x5a, 0x61, 0xdd, 0x2c, 0x6c, 0xe4, 0xb2, 0x77, 0xee, 0xc3, 0xa4, 0xed, 0x3b, 0x6e, 0xd0, 0xf6, + 0x7c, 0x8a, 0xee, 0xc8, 0x83, 0xd9, 0xf0, 0x57, 0xda, 0xf0, 0xef, 0xc5, 0x97, 0xe6, 0x8e, 0xc6, + 0xe2, 0x4f, 0x89, 0xda, 0x99, 0x95, 0xcc, 0x6b, 0x99, 0xfc, 0xb9, 0x17, 0x7f, 0x5e, 0x3a, 0xf3, + 0xe2, 0x9b, 0xa5, 0xcc, 0xd7, 0xdf, 0x2c, 0x65, 0xfe, 0xf4, 0xcd, 0x52, 0xe6, 0x27, 0x7f, 0x59, + 0x3a, 0xb3, 0x3d, 0xce, 0xff, 0xde, 0x7c, 0xf7, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xdc, + 0x19, 0xd8, 0xb8, 0x1e, 0x00, 0x00, } diff --git a/functional/rpcpb/rpc.proto b/functional/rpcpb/rpc.proto index 222e59654db..359db161acb 100644 --- a/functional/rpcpb/rpc.proto +++ b/functional/rpcpb/rpc.proto @@ -204,7 +204,7 @@ message Etcd { string Logger = 71 [(gogoproto.moretags) = "yaml:\"logger\""]; // LogOutput is the log file to store current etcd server logs. - string LogOutput = 72 [(gogoproto.moretags) = "yaml:\"log-output\""]; + repeated string LogOutput = 72 [(gogoproto.moretags) = "yaml:\"log-output\""]; bool Debug = 73 [(gogoproto.moretags) = "yaml:\"debug\""]; } diff --git a/functional/tester/cluster_read_config.go b/functional/tester/cluster_read_config.go index 4ef6135e15c..49572e98a48 100644 --- a/functional/tester/cluster_read_config.go +++ b/functional/tester/cluster_read_config.go @@ -311,11 +311,17 @@ func read(lg *zap.Logger, fpath string) (*Cluster, error) { clus.Members[i].ClientCertData = string(data) } - if mem.Etcd.LogOutput == "" { + if len(mem.Etcd.LogOutput) == 0 { return nil, fmt.Errorf("mem.Etcd.LogOutput cannot be empty") } - if !strings.HasPrefix(mem.Etcd.LogOutput, mem.BaseDir) { - return nil, fmt.Errorf("LogOutput %q must be prefixed with BaseDir %q", mem.Etcd.LogOutput, mem.BaseDir) + for _, v := range mem.Etcd.LogOutput { + switch v { + case "stderr", "stdout", "/dev/null", "default": + default: + if !strings.HasPrefix(v, mem.BaseDir) { + return nil, fmt.Errorf("LogOutput %q must be prefixed with BaseDir %q", v, mem.BaseDir) + } + } } } } diff --git a/functional/tester/cluster_test.go b/functional/tester/cluster_test.go index 979a82b9600..3d3122ec919 100644 --- a/functional/tester/cluster_test.go +++ b/functional/tester/cluster_test.go @@ -63,7 +63,7 @@ func Test_read(t *testing.T) { PreVote: true, InitialCorruptCheck: true, Logger: "zap", - LogOutput: "/tmp/etcd-functional-1/etcd.log", + LogOutput: []string{"/tmp/etcd-functional-1/etcd.log"}, Debug: true, }, ClientCertData: "", @@ -116,7 +116,7 @@ func Test_read(t *testing.T) { PreVote: true, InitialCorruptCheck: true, Logger: "zap", - LogOutput: "/tmp/etcd-functional-2/etcd.log", + LogOutput: []string{"/tmp/etcd-functional-2/etcd.log"}, Debug: true, }, ClientCertData: "", @@ -169,7 +169,7 @@ func Test_read(t *testing.T) { PreVote: true, InitialCorruptCheck: true, Logger: "zap", - LogOutput: "/tmp/etcd-functional-3/etcd.log", + LogOutput: []string{"/tmp/etcd-functional-3/etcd.log"}, Debug: true, }, ClientCertData: "", From 7215e54755b797aaf11e28214cb5e7984501a45c Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 13:29:23 -0700 Subject: [PATCH 10/12] etcd.conf.yml: change "log-output" type Signed-off-by: Gyuho Lee --- etcd.conf.yml.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etcd.conf.yml.sample b/etcd.conf.yml.sample index 2bc115f8315..9b52b2e0424 100644 --- a/etcd.conf.yml.sample +++ b/etcd.conf.yml.sample @@ -138,7 +138,7 @@ debug: false log-package-levels: # Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd. -log-output: default +log-output: [default] # Force to create a new one member cluster. force-new-cluster: false From bf8601676eeaba382fe67c1fe33da62d040f52f9 Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 13:31:25 -0700 Subject: [PATCH 11/12] Documentation/upgrades: highlight YAML change Signed-off-by: Gyuho Lee --- Documentation/upgrades/upgrade_3_4.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Documentation/upgrades/upgrade_3_4.md b/Documentation/upgrades/upgrade_3_4.md index 054a0c036a4..27cfed3dfd5 100644 --- a/Documentation/upgrades/upgrade_3_4.md +++ b/Documentation/upgrades/upgrade_3_4.md @@ -89,6 +89,16 @@ cfg := &embed.Config{Debug: false} +cfg.LogOutput = []string{"stderr"} ``` +#### Change in `etcd --config-file` + +Now that `log-output` accepts multiple writers, etcd configuration YAML file `log-output` field must be changed to `[]string` type as below: + +```diff + # Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd. +-log-output: default ++log-output: [default] +``` + ### Server upgrade checklists #### Upgrade requirements From 6fec93fe42ccf5f50fd92f9be67e66899f1b011b Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Tue, 17 Apr 2018 13:34:07 -0700 Subject: [PATCH 12/12] CHANGELOG-3.4: highlight YAML log-output change Signed-off-by: Gyuho Lee --- CHANGELOG-3.4.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG-3.4.md b/CHANGELOG-3.4.md index b1e83be2f98..ebb4ef69d98 100644 --- a/CHANGELOG-3.4.md +++ b/CHANGELOG-3.4.md @@ -72,6 +72,8 @@ See [code changes](https://github.com/coreos/etcd/compare/v3.3.0...v3.4.0) and [ - Remove [`embed.Config.SetupLogging`](https://github.com/coreos/etcd/pull/9572). - Now logger is set up automatically based on [`embed.Config.Logger`, `embed.Config.LogOutput`, `embed.Config.Debug` fields](https://github.com/coreos/etcd/pull/9572). - Change [`embed.Config.LogOutput` type from `string` to `[]string`](https://github.com/coreos/etcd/pull/9579) to support multiple log outputs. + - Now that `log-output` accepts multiple writers, etcd configuration YAML file `log-output` field must be changed to `[]string` type. + - Previously, `etcd.config.yaml` can have `log-output: default` field, now must be `log-output: [default]`. - Remove [`pkg/cors` package](https://github.com/coreos/etcd/pull/9490). - Move `"github.com/coreos/etcd/snap"` to [`"github.com/coreos/etcd/raftsnap"`](https://github.com/coreos/etcd/pull/9211). - Move `"github.com/coreos/etcd/etcdserver/auth"` to [`"github.com/coreos/etcd/etcdserver/v2auth"`](https://github.com/coreos/etcd/pull/9275).