Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nsqd: update and fix for latest go-options #738

Merged
merged 3 commits into from
Apr 15, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Godeps
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ github.com/bitly/go-hostpool 58b95b10d6ca26723a7f46017b348653b825a8d6
github.com/nsqio/go-nsq cef6982c1150617a77539847950ca63774f0e48c # v1.0.5
github.com/bitly/go-simplejson 18db6e68d8fd9cbf2e8ebe4c81a78b96fd9bf05a
github.com/bmizerany/perks/quantile 6cb9d9d729303ee2628580d9aec5db968da3a607
github.com/mreiferson/go-options 2cf7eb1fdd83e2bb3375fef6fdadb04c3ad564da
github.com/mreiferson/go-options 7ae3226d3e1fa6a0548f73089c72c96c141f3b95
github.com/mreiferson/go-snappystream 028eae7ab5c4c9e2d1cb4c4ca1e53259bbe7e504 # v0.2.3
github.com/bitly/timer_metrics afad1794bb13e2a094720aeb27c088aa64564895
github.com/blang/semver 9bf7bff48b0388cb75991e58c6df7d13e982f1f2
Expand Down
92 changes: 45 additions & 47 deletions apps/nsqd/nsqd.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,17 @@ func (t *tlsRequiredOption) Set(s string) error {
return err
}

func (t *tlsRequiredOption) Get() interface{} { return *t }
func (t *tlsRequiredOption) Get() interface{} { return int(*t) }

func (t *tlsRequiredOption) String() string {
return strconv.FormatInt(int64(*t), 10)
}

func (t *tlsRequiredOption) IsBoolFlag() bool { return true }

type tlsVersionOption uint16
type tlsMinVersionOption uint16

func (t *tlsVersionOption) Set(s string) error {
func (t *tlsMinVersionOption) Set(s string) error {
s = strings.ToLower(s)
switch s {
case "":
Expand All @@ -66,80 +66,77 @@ func (t *tlsVersionOption) Set(s string) error {
return nil
}

func (t *tlsVersionOption) Get() interface{} {
return *t
}
func (t *tlsMinVersionOption) Get() interface{} { return uint16(*t) }

func (t *tlsVersionOption) String() string {
func (t *tlsMinVersionOption) String() string {
return strconv.FormatInt(int64(*t), 10)
}

func nsqFlagset() *flag.FlagSet {
func nsqdFlagSet(opts *nsqd.Options) *flag.FlagSet {
flagSet := flag.NewFlagSet("nsqd", flag.ExitOnError)

// basic options
flagSet.String("config", "", "path to config file")
flagSet.Bool("version", false, "print version string")
flagSet.Bool("verbose", false, "enable verbose logging")
flagSet.Int64("worker-id", 0, "unique seed for message ID generation (int) in range [0,4096) (will default to a hash of hostname)")
flagSet.String("https-address", "", "<addr>:<port> to listen on for HTTPS clients")
flagSet.String("http-address", "0.0.0.0:4151", "<addr>:<port> to listen on for HTTP clients")
flagSet.String("tcp-address", "0.0.0.0:4150", "<addr>:<port> to listen on for TCP clients")
flagSet.String("config", "", "path to config file")
flagSet.Int64("worker-id", opts.ID, "unique seed for message ID generation (int) in range [0,4096) (will default to a hash of hostname)")

flagSet.String("https-address", opts.HTTPSAddress, "<addr>:<port> to listen on for HTTPS clients")
flagSet.String("http-address", opts.HTTPAddress, "<addr>:<port> to listen on for HTTP clients")
flagSet.String("tcp-address", opts.TCPAddress, "<addr>:<port> to listen on for TCP clients")
authHTTPAddresses := app.StringArray{}
flagSet.Var(&authHTTPAddresses, "auth-http-address", "<addr>:<port> to query auth server (may be given multiple times)")

flagSet.String("broadcast-address", "", "address that will be registered with lookupd (defaults to the OS hostname)")
flagSet.String("broadcast-address", opts.BroadcastAddress, "address that will be registered with lookupd (defaults to the OS hostname)")
lookupdTCPAddrs := app.StringArray{}
flagSet.Var(&lookupdTCPAddrs, "lookupd-tcp-address", "lookupd TCP address (may be given multiple times)")

// diskqueue options
flagSet.String("data-path", "", "path to store disk-backed messages")
flagSet.Int64("mem-queue-size", 10000, "number of messages to keep in memory (per topic/channel)")
flagSet.Int64("max-bytes-per-file", 104857600, "number of bytes per diskqueue file before rolling")
flagSet.Int64("sync-every", 2500, "number of messages per diskqueue fsync")
flagSet.Duration("sync-timeout", 2*time.Second, "duration of time per diskqueue fsync")
flagSet.String("data-path", opts.DataPath, "path to store disk-backed messages")
flagSet.Int64("mem-queue-size", opts.MemQueueSize, "number of messages to keep in memory (per topic/channel)")
flagSet.Int64("max-bytes-per-file", opts.MaxBytesPerFile, "number of bytes per diskqueue file before rolling")
flagSet.Int64("sync-every", opts.SyncEvery, "number of messages per diskqueue fsync")
flagSet.Duration("sync-timeout", opts.SyncTimeout, "duration of time per diskqueue fsync")

// msg and command options
flagSet.String("msg-timeout", "60s", "duration to wait before auto-requeing a message")
flagSet.Duration("max-msg-timeout", 15*time.Minute, "maximum duration before a message will timeout")
flagSet.Int64("max-msg-size", 1024768, "maximum size of a single message in bytes")
flagSet.Duration("max-req-timeout", 1*time.Hour, "maximum requeuing timeout for a message")
flagSet.String("msg-timeout", opts.MsgTimeout.String(), "duration to wait before auto-requeing a message")
flagSet.Duration("max-msg-timeout", opts.MaxMsgTimeout, "maximum duration before a message will timeout")
flagSet.Int64("max-msg-size", opts.MaxMsgSize, "maximum size of a single message in bytes")
flagSet.Duration("max-req-timeout", opts.MaxReqTimeout, "maximum requeuing timeout for a message")
// remove, deprecated
flagSet.Int64("max-message-size", 1024768, "(deprecated use --max-msg-size) maximum size of a single message in bytes")
flagSet.Int64("max-body-size", 5*1024768, "maximum size of a single command body")
flagSet.Int64("max-message-size", opts.MaxMsgSize, "(deprecated use --max-msg-size) maximum size of a single message in bytes")
flagSet.Int64("max-body-size", opts.MaxBodySize, "maximum size of a single command body")

// client overridable configuration options
flagSet.Duration("max-heartbeat-interval", 60*time.Second, "maximum client configurable duration of time between client heartbeats")
flagSet.Int64("max-rdy-count", 2500, "maximum RDY count for a client")
flagSet.Int64("max-output-buffer-size", 64*1024, "maximum client configurable size (in bytes) for a client output buffer")
flagSet.Duration("max-output-buffer-timeout", 1*time.Second, "maximum client configurable duration of time between flushing to a client")
flagSet.Duration("max-heartbeat-interval", opts.MaxHeartbeatInterval, "maximum client configurable duration of time between client heartbeats")
flagSet.Int64("max-rdy-count", opts.MaxRdyCount, "maximum RDY count for a client")
flagSet.Int64("max-output-buffer-size", opts.MaxOutputBufferSize, "maximum client configurable size (in bytes) for a client output buffer")
flagSet.Duration("max-output-buffer-timeout", opts.MaxOutputBufferTimeout, "maximum client configurable duration of time between flushing to a client")

// statsd integration options
flagSet.String("statsd-address", "", "UDP <addr>:<port> of a statsd daemon for pushing stats")
flagSet.String("statsd-interval", "60s", "duration between pushing to statsd")
flagSet.Bool("statsd-mem-stats", true, "toggle sending memory and GC stats to statsd")
flagSet.String("statsd-prefix", "nsq.%s", "prefix used for keys sent to statsd (%s for host replacement)")
flagSet.String("statsd-address", opts.StatsdAddress, "UDP <addr>:<port> of a statsd daemon for pushing stats")
flagSet.String("statsd-interval", opts.StatsdInterval.String(), "duration between pushing to statsd")
flagSet.Bool("statsd-mem-stats", opts.StatsdMemStats, "toggle sending memory and GC stats to statsd")
flagSet.String("statsd-prefix", opts.StatsdPrefix, "prefix used for keys sent to statsd (%s for host replacement)")

// End to end percentile flags
e2eProcessingLatencyPercentiles := app.FloatArray{}
flagSet.Var(&e2eProcessingLatencyPercentiles, "e2e-processing-latency-percentile", "message processing time percentiles (as float (0, 1.0]) to track (can be specified multiple times or comma separated '1.0,0.99,0.95', default none)")
flagSet.Duration("e2e-processing-latency-window-time", 10*time.Minute, "calculate end to end latency quantiles for this duration of time (ie: 60s would only show quantile calculations from the past 60 seconds)")
flagSet.Duration("e2e-processing-latency-window-time", opts.E2EProcessingLatencyWindowTime, "calculate end to end latency quantiles for this duration of time (ie: 60s would only show quantile calculations from the past 60 seconds)")

// TLS config
flagSet.String("tls-cert", "", "path to certificate file")
flagSet.String("tls-key", "", "path to key file")
flagSet.String("tls-client-auth-policy", "", "client certificate auth policy ('require' or 'require-verify')")
flagSet.String("tls-root-ca-file", "", "path to certificate authority file")
var tlsRequired tlsRequiredOption
var tlsMinVersion tlsVersionOption
flagSet.String("tls-cert", opts.TLSCert, "path to certificate file")
flagSet.String("tls-key", opts.TLSKey, "path to key file")
flagSet.String("tls-client-auth-policy", opts.TLSClientAuthPolicy, "client certificate auth policy ('require' or 'require-verify')")
flagSet.String("tls-root-ca-file", opts.TLSRootCAFile, "path to certificate authority file")
tlsRequired := tlsRequiredOption(opts.TLSRequired)
tlsMinVersion := tlsMinVersionOption(opts.TLSMinVersion)
flagSet.Var(&tlsRequired, "tls-required", "require TLS for client connections (true, false, tcp-https)")
flagSet.Var(&tlsMinVersion, "tls-min-version", "minimum SSL/TLS version acceptable ('ssl3.0', 'tls1.0', 'tls1.1', or 'tls1.2')")

// compression
flagSet.Bool("deflate", true, "enable deflate feature negotiation (client compression)")
flagSet.Int("max-deflate-level", 6, "max deflate compression level a client can negotiate (> values == > nsqd CPU usage)")
flagSet.Bool("snappy", true, "enable snappy feature negotiation (client compression)")
flagSet.Bool("deflate", opts.DeflateEnabled, "enable deflate feature negotiation (client compression)")
flagSet.Int("max-deflate-level", opts.MaxDeflateLevel, "max deflate compression level a client can negotiate (> values == > nsqd CPU usage)")
flagSet.Bool("snappy", opts.SnappyEnabled, "enable snappy feature negotiation (client compression)")

return flagSet
}
Expand All @@ -159,7 +156,7 @@ func (cfg config) Validate() {
}
}
if v, exists := cfg["tls_min_version"]; exists {
var t tlsVersionOption
var t tlsMinVersionOption
err := t.Set(fmt.Sprintf("%v", v))
if err == nil {
newVal := fmt.Sprintf("%v", t.Get())
Expand Down Expand Up @@ -194,7 +191,9 @@ func (p *program) Init(env svc.Environment) error {
}

func (p *program) Start() error {
flagSet := nsqFlagset()
opts := nsqd.NewOptions()

flagSet := nsqdFlagSet(opts)
flagSet.Parse(os.Args[1:])

rand.Seed(time.Now().UTC().UnixNano())
Expand All @@ -214,7 +213,6 @@ func (p *program) Start() error {
}
cfg.Validate()

opts := nsqd.NewOptions()
options.Resolve(opts, flagSet, cfg)
nsqd := nsqd.New(opts)

Expand Down
5 changes: 3 additions & 2 deletions apps/nsqd/nsqd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import (
)

func TestConfigFlagParsing(t *testing.T) {
flagSet := nsqFlagset()
opts := nsqd.NewOptions()

flagSet := nsqdFlagSet(opts)
flagSet.Parse([]string{})

var cfg config
Expand All @@ -22,7 +24,6 @@ func TestConfigFlagParsing(t *testing.T) {
toml.DecodeReader(f, &cfg)
cfg.Validate()

opts := nsqd.NewOptions()
options.Resolve(opts, flagSet, cfg)
nsqd.New(opts)

Expand Down
2 changes: 1 addition & 1 deletion nsqd/test/cert.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash
# call this script with an email address (valid or not).
# like:
# ./makecert.sh [email protected]
# ./cert.sh [email protected]
# Found: https://gist.github.com/ncw/9253562#file-makecert-sh

if [ "$1" == "" ]; then
Expand Down
28 changes: 14 additions & 14 deletions nsqd/test/certs/ca.key
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AE885C3519745DDD
DEK-Info: DES-EDE3-CBC,659DE7672771D6C3

15dfD2SBkWxJJR9hlUdL0CSqNy7VTf599NDsfkJRQQejrz3AZwIMTVNLlTGCqE+V
VCI2+euusp3gCn8f6slWIiMTwEUxXzeS6QWkZyY0Tmd5CDAKYTV/UxozVzYCO1uL
oupbT3/tLQXvF6wSst4YKzJtDJM2u3Ua5Xu/Mhun3y8TlejRz8S2e55JPP/fzjEH
xBZoP1VPQuiQKjNx6IewaRXw4vodRJWhgZEuZG28U9RIKcx9yZsOsKrYf/kRxT79
H6nRLRo/XDj9jutEZ58YBQkIVy88NIW11AmG7y1TBJiX3qawmgYC8yMvHhLkn9QD
pV6JPbN4z+UmwEK5JTUrmYHzuJKLVsqwe8Xqd3qFebTI9GpJDvESDuOhGjm8YDvx
cLbHO1re98FxRVZg/LmErGpflHsSpJEvOgyo1Oq/K6EZYPbpO/SgrHp19nspXKg4
yL2dDBoJaiTsxIs4RZtOP+SGDiuvnP/+ZhGzOMI6+WRAeudnp+0ImneNWNqAeswg
nB9reHTJmqZBYfi+ML38WtHlQ3EEQFKgQsESA+47Zgaft+oLpjW0BxaDJapFbv8D
8ODBBLoq6d/uEXBa+5tGWwYhdpXJzwDDuubbq0BRN8P3Jsk0SpiLUH7IRoYOMly5
XGcv9FoV66mQKrH3wpIKwhx00bhM5OXuFKt+JAtLYCPxlJePsWTj6RIQzxRNNUXV
6EpowgV451BB+aBP54prwM5UELhN2PxMohbzhxzuOQnTUZkFBpRMXb38PDoMsHNg
90dpm25XGvhD+EZQ4mfBO2Xax+7unqovei5n9YHoAVE=
dOStQddwNzG7ynP6yvGchILIZRce1EWRKyTobdeTyrpoUlmQSw6+Z42Wx5Dye5gg
b6HdZSoimv8jjyFk0f3sPqYeuyeAOzcL3biXE+gN6aozwbm5TBB1zPuk4sC6dm38
2L5VUiJSpTdbYNA8fVS9xj8gNY2OS5zMYcVbnOpPrXwi76225BE3mjlpRFhm05Sb
vcrQPwbBXqQHk/vUQkaPFeT0337GQRVu7SU4ei2xXE7Dr2Zm+bVqzUs3KdbW3s+M
iCN8PauJa/5bMX2AQvDybNiH1hxiKLMfd6DQUPn53zJCCJShSt1G/XkJVHFWIK77
l2l+Wwiykc4Y9FFc+t5pzFmWhS6So1/krZ9eawXq5YSAalPb83DevTHVPwzb52oI
EPihfnP/RDOFuzq4AHWRTwx7yVX1IDsaPBXXpIXJ68/1fB9g1YDOXoeJi8thB3Jz
AKYiU+jlwdnfRlPOrEKN0Moeq8wRjC1a4GwDSaiUQFyHTsMwJ3MeZs5GuUCYaDev
AI+3jig9xJNYdRgD6MdvOFtzZo7fxgEdVWni5ZRFAiuHEpZ2jppl+VjV33enUbmj
d/UIZcMaACLv6EzmlplL+rjW7HnRsCDHU7etDR8y+Uegk9xi4FxidxxvZzDrkUEx
X97wE71mQeoWlYLPsPA+cU414jzqdwNH4JV/gTM6O7WBGp+HaANnVwdT+vH+vH/j
ygIpDPX/ETdgM9b2EXEsWVJ9KVSrUH1QxWlDGQLR8JJLrOrWMEXvuBNw3ae712v+
W2mnVmCqQ1VO8X5Q0K8vvo8xZLJ+3/B6MpGNLI/unNhVMUtCyZ4f0A==
-----END RSA PRIVATE KEY-----
24 changes: 12 additions & 12 deletions nsqd/test/certs/ca.pem
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDnDCCAwWgAwIBAgIJANg7HLn2pi6hMA0GCSqGSIb3DQEBBQUAMIGRMQswCQYD
MIIDnDCCAwWgAwIBAgIJAOZaaR2t9jFiMA0GCSqGSIb3DQEBBQUAMIGRMQswCQYD
VQQGEwJERTEMMAoGA1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMO
UmFuZG9tIENvbXBhbnkxCzAJBgNVBAsTAklUMRcwFQYDVQQDEw53d3cucmFuZG9t
LmNvbTElMCMGCSqGSIb3DQEJARYWS3J5cHRvS2luZ3NAcmFuZG9tLmNvbTAeFw0x
NTA0MTMxNzI1MTdaFw0xNjA0MTIxNzI1MTdaMIGRMQswCQYDVQQGEwJERTEMMAoG
NjA0MTUxNTU2NTdaFw0xNzA0MTUxNTU2NTdaMIGRMQswCQYDVQQGEwJERTEMMAoG
A1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMOUmFuZG9tIENvbXBh
bnkxCzAJBgNVBAsTAklUMRcwFQYDVQQDEw53d3cucmFuZG9tLmNvbTElMCMGCSqG
SIb3DQEJARYWS3J5cHRvS2luZ3NAcmFuZG9tLmNvbTCBnzANBgkqhkiG9w0BAQEF
AAOBjQAwgYkCgYEAyZdYaKNt+3F7PTi3+hDfMxtxb2+seDCM9EgqLpUsvzCYa445
/4WFrlQbGSn+3ynGsP1ggoB2D2peR+1DOLcU3+SLzSsegdtM0lEfOjhdaGfb0cg9
wUGhC+dKVWT2BRQCt7njS3+/rkSYTUFHbnapo/2ag5xfjsJmAuuXdAoSbWMCAwEA
AaOB+TCB9jAdBgNVHQ4EFgQU4MUUj4TibmiCYe9sOx4HW9TOOt8wgcYGA1UdIwSB
vjCBu4AU4MUUj4TibmiCYe9sOx4HW9TOOt+hgZekgZQwgZExCzAJBgNVBAYTAkRF
AAOBjQAwgYkCgYEAy5GT6xVaIuYAdFrgp6Vcs9BcLtiFztHf5lLsUSXKw8Y/9PJW
1dU7yDa4HfoeWGgQV5URFauUzKKKWVUWBUqlF+p1+pV3Gbqr9gxiFgNieLJqabHJ
v02QEblLJHM7rdy6H5Xe2lIcNDokwsbJzTPEUZSmQDkMvDiIpKjZ46DmVQcCAwEA
AaOB+TCB9jAdBgNVHQ4EFgQUtaq6IWu7GGnIlMb0szE+oTETTxwwgcYGA1UdIwSB
vjCBu4AUtaq6IWu7GGnIlMb0szE+oTETTxyhgZekgZQwgZExCzAJBgNVBAYTAkRF
MQwwCgYDVQQIEwNOUlcxDjAMBgNVBAcTBUVhcnRoMRcwFQYDVQQKEw5SYW5kb20g
Q29tcGFueTELMAkGA1UECxMCSVQxFzAVBgNVBAMTDnd3dy5yYW5kb20uY29tMSUw
IwYJKoZIhvcNAQkBFhZLcnlwdG9LaW5nc0ByYW5kb20uY29tggkA2DscufamLqEw
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCTa5K8K+ZTSTIoEy+FyfxL
PEezAZX8iZAyvo6ZuL4kNSXhSDIyqb+tbINL/FHJ0UIhhRHxd1Hov6k/X2b/fYO8
o4hZ8pwNjF80YFkdlW0QyWaB2UC5xX4z7AwrjwEejN8WKYiZtSCTeuM64dCvowLr
Uibi7AO1eCouM9wPwSK6Ow==
IwYJKoZIhvcNAQkBFhZLcnlwdG9LaW5nc0ByYW5kb20uY29tggkA5lppHa32MWIw
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBo/EoOKvrQS1Ad1Oj6os+v
8FEBJPS/24feAmx7FurAHgRCW4LOgK9ImJSfF9BwVpuT//w8mDOUQrYdx8cyLE/L
bytS0PM0U+P0tuo6Gm4pIFCu4aL/Q/RxYhzg75G1v4dtS2swdk2Y2od91DlTenJb
W14CSH47cx6fhK50ZZDOWQ==
-----END CERTIFICATE-----
50 changes: 25 additions & 25 deletions nsqd/test/certs/client.key
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Loading