From ed2d7d64cd49e41023cebdd8f762aaf341e0cd81 Mon Sep 17 00:00:00 2001 From: Bjorn Tipling Date: Tue, 31 Dec 2013 09:10:02 -0800 Subject: [PATCH 1/9] Trimsplit Wasn't using separator, more efficient. --- server/util.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/util.go b/server/util.go index d124a1fc0..80a7ca4dc 100644 --- a/server/util.go +++ b/server/util.go @@ -37,10 +37,9 @@ func redirect(hostname string, w http.ResponseWriter, req *http.Request) { // slice of the substrings between the separator with all leading and trailing // white space removed, as defined by Unicode. func trimsplit(s, sep string) []string { - raw := strings.Split(s, ",") - trimmed := make([]string, 0) - for _, r := range raw { - trimmed = append(trimmed, strings.TrimSpace(r)) + trimmed := strings.Split(s, sep) + for i, r := range trimmed { + trimmed[i] = strings.TrimSpace(r) } return trimmed } From f46fdbf078d3a0131836592d2a30a4548e82220b Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 1 Jan 2014 19:50:07 +0800 Subject: [PATCH 2/9] feat(node_extern.go) add prevNode field --- server/v2/tests/delete_handler_test.go | 8 ++-- store/event.go | 5 ++- store/node.go | 6 +-- store/node_extern.go | 2 +- store/store.go | 6 +++ store/store_test.go | 52 ++++++++++++++++++++++++++ 6 files changed, 69 insertions(+), 10 deletions(-) diff --git a/server/v2/tests/delete_handler_test.go b/server/v2/tests/delete_handler_test.go index d5e1c8206..a7dd6e687 100644 --- a/server/v2/tests/delete_handler_test.go +++ b/server/v2/tests/delete_handler_test.go @@ -26,7 +26,7 @@ func TestV2DeleteKey(t *testing.T) { assert.Equal(t, resp.StatusCode, http.StatusOK) body := tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo/bar","modifiedIndex":3,"createdIndex":2}}`, "") + assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo/bar","modifiedIndex":3,"createdIndex":2},"prevNode":{"key":"/foo/bar","value":"XXX","modifiedIndex":2,"createdIndex":2}}`, "") }) } @@ -48,7 +48,7 @@ func TestV2DeleteEmptyDirectory(t *testing.T) { assert.Equal(t, resp.StatusCode, http.StatusOK) body := tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2}}`, "") + assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2},"prevNode":{"key":"/foo","dir":true,"modifiedIndex":2,"createdIndex":2}}`, "") }) } @@ -70,7 +70,7 @@ func TestV2DeleteNonEmptyDirectory(t *testing.T) { assert.Equal(t, resp.StatusCode, http.StatusOK) body := tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2}}`, "") + assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2},"prevNode":{"key":"/foo","dir":true,"modifiedIndex":2,"createdIndex":2}}`, "") }) } @@ -87,7 +87,7 @@ func TestV2DeleteDirectoryRecursiveImpliesDir(t *testing.T) { assert.Equal(t, resp.StatusCode, http.StatusOK) body := tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2}}`, "") + assert.Equal(t, string(body), `{"action":"delete","node":{"key":"/foo","dir":true,"modifiedIndex":3,"createdIndex":2},"prevNode":{"key":"/foo","dir":true,"modifiedIndex":2,"createdIndex":2}}`, "") }) } diff --git a/store/event.go b/store/event.go index 00885af80..5674b132c 100644 --- a/store/event.go +++ b/store/event.go @@ -12,8 +12,9 @@ const ( ) type Event struct { - Action string `json:"action"` - Node *NodeExtern `json:"node,omitempty"` + Action string `json:"action"` + Node *NodeExtern `json:"node,omitempty"` + PrevNode *NodeExtern `json:"prevNode,omitempty"` } func newEvent(action string, key string, modifiedIndex, createdIndex uint64) *Event { diff --git a/store/node.go b/store/node.go index 71c0a64d7..e17fcf204 100644 --- a/store/node.go +++ b/store/node.go @@ -231,9 +231,9 @@ func (n *node) Remove(dir, recursive bool, callback func(path string)) *etcdErr. return nil } -func (n *node) Repr(recurisive, sorted bool) NodeExtern { +func (n *node) Repr(recurisive, sorted bool) *NodeExtern { if n.IsDir() { - node := NodeExtern{ + node := &NodeExtern{ Key: n.Path, Dir: true, ModifiedIndex: n.ModifiedIndex, @@ -272,7 +272,7 @@ func (n *node) Repr(recurisive, sorted bool) NodeExtern { return node } - node := NodeExtern{ + node := &NodeExtern{ Key: n.Path, Value: n.Value, ModifiedIndex: n.ModifiedIndex, diff --git a/store/node_extern.go b/store/node_extern.go index 514d5c8cf..727d16c93 100644 --- a/store/node_extern.go +++ b/store/node_extern.go @@ -20,7 +20,7 @@ type NodeExtern struct { CreatedIndex uint64 `json:"createdIndex,omitempty"` } -type NodeExterns []NodeExtern +type NodeExterns []*NodeExtern // interfaces for sorting func (ns NodeExterns) Len() int { diff --git a/store/store.go b/store/store.go index 08d585056..23168d18c 100644 --- a/store/store.go +++ b/store/store.go @@ -225,6 +225,7 @@ func (s *store) CompareAndSwap(nodePath string, prevValue string, prevIndex uint s.CurrentIndex++ e := newEvent(CompareAndSwap, nodePath, s.CurrentIndex, n.CreatedIndex) + e.PrevNode = n.Repr(false, false) eNode := e.Node eNode.PrevValue = n.Value @@ -267,6 +268,7 @@ func (s *store) Delete(nodePath string, dir, recursive bool) (*Event, error) { nextIndex := s.CurrentIndex + 1 e := newEvent(Delete, nodePath, nextIndex, n.CreatedIndex) + e.PrevNode = n.Repr(false, false) eNode := e.Node if n.IsDir() { @@ -326,6 +328,7 @@ func (s *store) CompareAndDelete(nodePath string, prevValue string, prevIndex ui s.CurrentIndex++ e := newEvent(CompareAndDelete, nodePath, s.CurrentIndex, n.CreatedIndex) + e.PrevNode = n.Repr(false, false) callback := func(path string) { // notify function // notify the watchers with deleted set true @@ -412,6 +415,7 @@ func (s *store) Update(nodePath string, newValue string, expireTime time.Time) ( } e := newEvent(Update, nodePath, nextIndex, n.CreatedIndex) + e.PrevNode = n.Repr(false, false) eNode := e.Node if n.IsDir() && len(newValue) != 0 { @@ -482,6 +486,7 @@ func (s *store) internalCreate(nodePath string, dir bool, value string, unique, if n.IsDir() { return nil, etcdErr.NewError(etcdErr.EcodeNotFile, nodePath, currIndex) } + e.PrevNode = n.Repr(false, false) eNode.PrevValue, _ = n.Read() n.Remove(false, false, nil) @@ -557,6 +562,7 @@ func (s *store) DeleteExpiredKeys(cutoff time.Time) { s.CurrentIndex++ e := newEvent(Expire, node.Path, s.CurrentIndex, node.CreatedIndex) + e.PrevNode = node.Repr(false, false) callback := func(path string) { // notify function // notify the watchers with deleted set true diff --git a/store/store_test.go b/store/store_test.go index b29fea627..65f29fffc 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -112,6 +112,11 @@ func TestSet(t *testing.T) { assert.Nil(t, e.Node.Expiration, "") assert.Equal(t, e.Node.TTL, 0, "") assert.Equal(t, e.Node.ModifiedIndex, uint64(2), "") + // check prevNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "", "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") // Set /dir as a directory e, err = s.Set("/dir", true, "", Permanent) @@ -199,6 +204,12 @@ func TestStoreUpdateValue(t *testing.T) { assert.Equal(t, e.Node.Value, "baz", "") assert.Equal(t, e.Node.TTL, 0, "") assert.Equal(t, e.Node.ModifiedIndex, uint64(2), "") + // check prevNode + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") + assert.Equal(t, e.PrevNode.TTL, 0, "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") + e, _ = s.Get("/foo", false, false) assert.Equal(t, e.Node.Value, "baz", "") @@ -212,6 +223,12 @@ func TestStoreUpdateValue(t *testing.T) { assert.Equal(t, e.Node.Value, "", "") assert.Equal(t, e.Node.TTL, 0, "") assert.Equal(t, e.Node.ModifiedIndex, uint64(3), "") + // check prevNode + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "baz", "") + assert.Equal(t, e.PrevNode.TTL, 0, "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(2), "") + e, _ = s.Get("/foo", false, false) assert.Equal(t, e.Node.Value, "", "") } @@ -278,6 +295,10 @@ func TestStoreDeleteValue(t *testing.T) { e, err := s.Delete("/foo", false, false) assert.Nil(t, err, "") assert.Equal(t, e.Action, "delete", "") + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") } // Ensure that the store can delete a directory if recursive is specified. @@ -290,6 +311,10 @@ func TestStoreDeleteDiretory(t *testing.T) { e, err := s.Delete("/foo", true, false) assert.Nil(t, err, "") assert.Equal(t, e.Action, "delete", "") + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Dir, true, "") // create directory /foo and directory /foo/bar s.Create("/foo/bar", true, "", false, Permanent) @@ -346,6 +371,13 @@ func TestStoreCompareAndDeletePrevValue(t *testing.T) { assert.Nil(t, err, "") assert.Equal(t, e.Action, "compareAndDelete", "") assert.Equal(t, e.Node.Key, "/foo", "") + + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") + assert.Equal(t, e.PrevNode.CreatedIndex, uint64(1), "") } func TestStoreCompareAndDeletePrevValueFailsIfNotMatch(t *testing.T) { @@ -366,6 +398,12 @@ func TestStoreCompareAndDeletePrevIndex(t *testing.T) { e, err := s.CompareAndDelete("/foo", "", 1) assert.Nil(t, err, "") assert.Equal(t, e.Action, "compareAndDelete", "") + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") + assert.Equal(t, e.PrevNode.CreatedIndex, uint64(1), "") } func TestStoreCompareAndDeletePrevIndexFailsIfNotMatch(t *testing.T) { @@ -400,6 +438,13 @@ func TestStoreCompareAndSwapPrevValue(t *testing.T) { assert.Equal(t, e.Action, "compareAndSwap", "") assert.Equal(t, e.Node.PrevValue, "bar", "") assert.Equal(t, e.Node.Value, "baz", "") + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") + assert.Equal(t, e.PrevNode.CreatedIndex, uint64(1), "") + e, _ = s.Get("/foo", false, false) assert.Equal(t, e.Node.Value, "baz", "") } @@ -426,6 +471,13 @@ func TestStoreCompareAndSwapPrevIndex(t *testing.T) { assert.Equal(t, e.Action, "compareAndSwap", "") assert.Equal(t, e.Node.PrevValue, "bar", "") assert.Equal(t, e.Node.Value, "baz", "") + // check pervNode + assert.NotNil(t, e.PrevNode, "") + assert.Equal(t, e.PrevNode.Key, "/foo", "") + assert.Equal(t, e.PrevNode.Value, "bar", "") + assert.Equal(t, e.PrevNode.ModifiedIndex, uint64(1), "") + assert.Equal(t, e.PrevNode.CreatedIndex, uint64(1), "") + e, _ = s.Get("/foo", false, false) assert.Equal(t, e.Node.Value, "baz", "") } From 189b98c03fb3769d2db41edcf43fab01d3086e2e Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 1 Jan 2014 20:01:29 +0800 Subject: [PATCH 3/9] refactor(node_extern.go) remove unused prevValue field --- store/event.go | 4 ++-- store/node_extern.go | 1 - store/store.go | 6 ------ store/store_test.go | 9 --------- 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/store/event.go b/store/event.go index 5674b132c..cd7e0815d 100644 --- a/store/event.go +++ b/store/event.go @@ -35,7 +35,7 @@ func (e *Event) IsCreated() bool { return true } - if e.Action == Set && e.Node.PrevValue == "" { + if e.Action == Set && e.PrevNode == nil { return true } @@ -53,7 +53,7 @@ func (event *Event) Response(currentIndex uint64) interface{} { Action: event.Action, Key: event.Node.Key, Value: event.Node.Value, - PrevValue: event.Node.PrevValue, + PrevValue: event.PrevNode.Value, Index: event.Node.ModifiedIndex, TTL: event.Node.TTL, Expiration: event.Node.Expiration, diff --git a/store/node_extern.go b/store/node_extern.go index 727d16c93..1466ea16a 100644 --- a/store/node_extern.go +++ b/store/node_extern.go @@ -10,7 +10,6 @@ import ( // TTL is time to live in second type NodeExtern struct { Key string `json:"key, omitempty"` - PrevValue string `json:"-"` Value string `json:"value,omitempty"` Dir bool `json:"dir,omitempty"` Expiration *time.Time `json:"expiration,omitempty"` diff --git a/store/store.go b/store/store.go index 23168d18c..0709551ce 100644 --- a/store/store.go +++ b/store/store.go @@ -228,8 +228,6 @@ func (s *store) CompareAndSwap(nodePath string, prevValue string, prevIndex uint e.PrevNode = n.Repr(false, false) eNode := e.Node - eNode.PrevValue = n.Value - // if test succeed, write the value n.Write(value, s.CurrentIndex) n.UpdateTTL(expireTime) @@ -273,8 +271,6 @@ func (s *store) Delete(nodePath string, dir, recursive bool) (*Event, error) { if n.IsDir() { eNode.Dir = true - } else { - eNode.PrevValue = n.Value } callback := func(path string) { // notify function @@ -424,7 +420,6 @@ func (s *store) Update(nodePath string, newValue string, expireTime time.Time) ( return nil, etcdErr.NewError(etcdErr.EcodeNotFile, nodePath, currIndex) } - eNode.PrevValue = n.Value n.Write(newValue, nextIndex) eNode.Value = newValue @@ -487,7 +482,6 @@ func (s *store) internalCreate(nodePath string, dir bool, value string, unique, return nil, etcdErr.NewError(etcdErr.EcodeNotFile, nodePath, currIndex) } e.PrevNode = n.Repr(false, false) - eNode.PrevValue, _ = n.Read() n.Remove(false, false, nil) } else { diff --git a/store/store_test.go b/store/store_test.go index 65f29fffc..6a068018d 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -93,7 +93,6 @@ func TestSet(t *testing.T) { assert.Equal(t, e.Action, "set", "") assert.Equal(t, e.Node.Key, "/foo", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "", "") assert.Equal(t, e.Node.Value, "", "") assert.Nil(t, e.Node.Nodes, "") assert.Nil(t, e.Node.Expiration, "") @@ -106,7 +105,6 @@ func TestSet(t *testing.T) { assert.Equal(t, e.Action, "set", "") assert.Equal(t, e.Node.Key, "/foo", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "", "") assert.Equal(t, e.Node.Value, "bar", "") assert.Nil(t, e.Node.Nodes, "") assert.Nil(t, e.Node.Expiration, "") @@ -124,7 +122,6 @@ func TestSet(t *testing.T) { assert.Equal(t, e.Action, "set", "") assert.Equal(t, e.Node.Key, "/dir", "") assert.True(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "", "") assert.Equal(t, e.Node.Value, "", "") assert.Nil(t, e.Node.Nodes, "") assert.Nil(t, e.Node.Expiration, "") @@ -141,7 +138,6 @@ func TestStoreCreateValue(t *testing.T) { assert.Equal(t, e.Action, "create", "") assert.Equal(t, e.Node.Key, "/foo", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "", "") assert.Equal(t, e.Node.Value, "bar", "") assert.Nil(t, e.Node.Nodes, "") assert.Nil(t, e.Node.Expiration, "") @@ -154,7 +150,6 @@ func TestStoreCreateValue(t *testing.T) { assert.Equal(t, e.Action, "create", "") assert.Equal(t, e.Node.Key, "/empty", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "", "") assert.Equal(t, e.Node.Value, "", "") assert.Nil(t, e.Node.Nodes, "") assert.Nil(t, e.Node.Expiration, "") @@ -200,7 +195,6 @@ func TestStoreUpdateValue(t *testing.T) { assert.Equal(t, e.Action, "update", "") assert.Equal(t, e.Node.Key, "/foo", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "bar", "") assert.Equal(t, e.Node.Value, "baz", "") assert.Equal(t, e.Node.TTL, 0, "") assert.Equal(t, e.Node.ModifiedIndex, uint64(2), "") @@ -219,7 +213,6 @@ func TestStoreUpdateValue(t *testing.T) { assert.Equal(t, e.Action, "update", "") assert.Equal(t, e.Node.Key, "/foo", "") assert.False(t, e.Node.Dir, "") - assert.Equal(t, e.Node.PrevValue, "baz", "") assert.Equal(t, e.Node.Value, "", "") assert.Equal(t, e.Node.TTL, 0, "") assert.Equal(t, e.Node.ModifiedIndex, uint64(3), "") @@ -436,7 +429,6 @@ func TestStoreCompareAndSwapPrevValue(t *testing.T) { e, err := s.CompareAndSwap("/foo", "bar", 0, "baz", Permanent) assert.Nil(t, err, "") assert.Equal(t, e.Action, "compareAndSwap", "") - assert.Equal(t, e.Node.PrevValue, "bar", "") assert.Equal(t, e.Node.Value, "baz", "") // check pervNode assert.NotNil(t, e.PrevNode, "") @@ -469,7 +461,6 @@ func TestStoreCompareAndSwapPrevIndex(t *testing.T) { e, err := s.CompareAndSwap("/foo", "", 1, "baz", Permanent) assert.Nil(t, err, "") assert.Equal(t, e.Action, "compareAndSwap", "") - assert.Equal(t, e.Node.PrevValue, "bar", "") assert.Equal(t, e.Node.Value, "baz", "") // check pervNode assert.NotNil(t, e.PrevNode, "") From 5a4c41be37d9c888bd926279cc85c03ea8c0d573 Mon Sep 17 00:00:00 2001 From: Bjorn Tipling Date: Wed, 1 Jan 2014 13:44:04 -0800 Subject: [PATCH 4/9] Don't copy strings. --- server/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/util.go b/server/util.go index 80a7ca4dc..729b64f65 100644 --- a/server/util.go +++ b/server/util.go @@ -38,8 +38,8 @@ func redirect(hostname string, w http.ResponseWriter, req *http.Request) { // white space removed, as defined by Unicode. func trimsplit(s, sep string) []string { trimmed := strings.Split(s, sep) - for i, r := range trimmed { - trimmed[i] = strings.TrimSpace(r) + for i := range trimmed { + trimmed[i] = strings.TrimSpace(trimmed[i]) } return trimmed } From 04ad7a91dd1f8076d87197ac17f210bcb7b3361f Mon Sep 17 00:00:00 2001 From: rwindelz Date: Wed, 1 Jan 2014 21:16:40 -0800 Subject: [PATCH 5/9] fix (scripts/release-version.ps1): fix windows build fix reflects changes made in commit https://github.com/coreos/etcd/commit/7670c85d70f87d1749d6a49a202c5067a55d2748 --- scripts/release-version.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/release-version.ps1 b/scripts/release-version.ps1 index 544028440..2f5c24dc4 100644 --- a/scripts/release-version.ps1 +++ b/scripts/release-version.ps1 @@ -2,6 +2,6 @@ $VER=(git describe --tags HEAD) @" -package main -const releaseVersion = "$VER" +package server +const ReleaseVersion = "$VER" "@ \ No newline at end of file From 45b4d6d194223dcdb6e772910aa2d3f16187441f Mon Sep 17 00:00:00 2001 From: rwindelz Date: Wed, 1 Jan 2014 22:23:07 -0800 Subject: [PATCH 6/9] fix(build.ps1): not required to be admin to run build in windows mklink /D in windows requires elevated privilege (Runas Administrator), '/J' to create a directory junction point runs with user privilege use an explicit fully qualified path for junction target --- build.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index fb8a386ce..5e022d25f 100644 --- a/build.ps1 +++ b/build.ps1 @@ -4,6 +4,7 @@ $env:GOPATH=$pwd.Path $SRC_DIR="$env:GOPATH/src" $ETCD_DIR="$SRC_DIR/$ETCD_PACKAGE" $env:ETCD_DIR="$SRC_DIR/$ETCD_PACKAGE" +$env:ETCD_TARGET=$pwd.Path $ETCD_BASE=(Split-Path $ETCD_DIR -Parent) if(-not(test-path $ETCD_DIR)){ @@ -11,7 +12,7 @@ if(-not(test-path $ETCD_DIR)){ } if(-not(test-path $ETCD_DIR )){ - cmd /c 'mklink /D "%ETCD_DIR%" ..\..\..\' + cmd /c 'mklink /J "%ETCD_DIR%" %ETCD_TARGET%' } foreach($i in (ls third_party/*)){ From af3240fa18b2b434be4a9f300f81e816ffd7ff4d Mon Sep 17 00:00:00 2001 From: Andy Bakun Date: Thu, 2 Jan 2014 04:30:38 -0600 Subject: [PATCH 7/9] docs(server/config.go): minor formatting changes When -version or -help are given, don't warn about having to derive the data directory name. Print warnings about deprecated options on separate lines so the log isn't screwy. --- server/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/config.go b/server/config.go index 75585e860..0f27b8674 100644 --- a/server/config.go +++ b/server/config.go @@ -277,7 +277,7 @@ func (c *Config) LoadFlags(arguments []string) error { // Print deprecation warnings on STDERR. f.Visit(func(f *flag.Flag) { if len(newFlagNameLookup[f.Name]) > 0 { - fmt.Fprintf(os.Stderr, "[deprecated] use -%s, not -%s", newFlagNameLookup[f.Name], f.Name) + fmt.Fprintf(os.Stderr, "[deprecated] use -%s, not -%s\n", newFlagNameLookup[f.Name], f.Name) } }) @@ -416,7 +416,7 @@ func (c *Config) Sanitize() error { c.NameFromHostname() } - if c.DataDir == "" && c.Name != "" { + if c.DataDir == "" && c.Name != "" && !c.ShowVersion && !c.ShowHelp { c.DataDirFromName() } From 5b105ed1566fab5bbb30ece3623c21439cfa9bf4 Mon Sep 17 00:00:00 2001 From: Andy Bakun Date: Thu, 2 Jan 2014 11:11:27 -0600 Subject: [PATCH 8/9] fix deprecated option tests --- server/config_test.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/server/config_test.go b/server/config_test.go index 002996983..2cab7d610 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -532,7 +532,7 @@ func TestConfigDeprecatedAddrFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Addr, "127.0.0.1:4002") }) - assert.Equal(t, stderr, "[deprecated] use -addr, not -c") + assert.Equal(t, stderr, "[deprecated] use -addr, not -c\n") } func TestConfigDeprecatedBindAddrFlag(t *testing.T) { @@ -542,7 +542,7 @@ func TestConfigDeprecatedBindAddrFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.BindAddr, "127.0.0.1:4003", "") }) - assert.Equal(t, stderr, "[deprecated] use -bind-addr, not -cl", "") + assert.Equal(t, stderr, "[deprecated] use -bind-addr, not -cl\n", "") } func TestConfigDeprecatedCAFileFlag(t *testing.T) { @@ -552,7 +552,7 @@ func TestConfigDeprecatedCAFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.CAFile, "/tmp/file.ca", "") }) - assert.Equal(t, stderr, "[deprecated] use -ca-file, not -clientCAFile", "") + assert.Equal(t, stderr, "[deprecated] use -ca-file, not -clientCAFile\n", "") } func TestConfigDeprecatedCertFileFlag(t *testing.T) { @@ -562,7 +562,7 @@ func TestConfigDeprecatedCertFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.CertFile, "/tmp/file.cert", "") }) - assert.Equal(t, stderr, "[deprecated] use -cert-file, not -clientCert", "") + assert.Equal(t, stderr, "[deprecated] use -cert-file, not -clientCert\n", "") } func TestConfigDeprecatedKeyFileFlag(t *testing.T) { @@ -572,7 +572,7 @@ func TestConfigDeprecatedKeyFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.KeyFile, "/tmp/file.key", "") }) - assert.Equal(t, stderr, "[deprecated] use -key-file, not -clientKey", "") + assert.Equal(t, stderr, "[deprecated] use -key-file, not -clientKey\n", "") } func TestConfigDeprecatedPeersFlag(t *testing.T) { @@ -582,7 +582,7 @@ func TestConfigDeprecatedPeersFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peers, []string{"coreos.com:4001", "coreos.com:4002"}, "") }) - assert.Equal(t, stderr, "[deprecated] use -peers, not -C", "") + assert.Equal(t, stderr, "[deprecated] use -peers, not -C\n", "") } func TestConfigDeprecatedPeersFileFlag(t *testing.T) { @@ -592,7 +592,7 @@ func TestConfigDeprecatedPeersFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.PeersFile, "/tmp/machines", "") }) - assert.Equal(t, stderr, "[deprecated] use -peers-file, not -CF", "") + assert.Equal(t, stderr, "[deprecated] use -peers-file, not -CF\n", "") } func TestConfigDeprecatedMaxClusterSizeFlag(t *testing.T) { @@ -602,7 +602,7 @@ func TestConfigDeprecatedMaxClusterSizeFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.MaxClusterSize, 5, "") }) - assert.Equal(t, stderr, "[deprecated] use -max-cluster-size, not -maxsize", "") + assert.Equal(t, stderr, "[deprecated] use -max-cluster-size, not -maxsize\n", "") } func TestConfigDeprecatedMaxResultBufferFlag(t *testing.T) { @@ -612,7 +612,7 @@ func TestConfigDeprecatedMaxResultBufferFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.MaxResultBuffer, 512, "") }) - assert.Equal(t, stderr, "[deprecated] use -max-result-buffer, not -m", "") + assert.Equal(t, stderr, "[deprecated] use -max-result-buffer, not -m\n", "") } func TestConfigDeprecatedMaxRetryAttemptsFlag(t *testing.T) { @@ -622,7 +622,7 @@ func TestConfigDeprecatedMaxRetryAttemptsFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.MaxRetryAttempts, 10, "") }) - assert.Equal(t, stderr, "[deprecated] use -max-retry-attempts, not -r", "") + assert.Equal(t, stderr, "[deprecated] use -max-retry-attempts, not -r\n", "") } func TestConfigDeprecatedNameFlag(t *testing.T) { @@ -632,7 +632,7 @@ func TestConfigDeprecatedNameFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Name, "test-name", "") }) - assert.Equal(t, stderr, "[deprecated] use -name, not -n", "") + assert.Equal(t, stderr, "[deprecated] use -name, not -n\n", "") } func TestConfigDeprecatedPeerAddrFlag(t *testing.T) { @@ -642,7 +642,7 @@ func TestConfigDeprecatedPeerAddrFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peer.Addr, "localhost:7002", "") }) - assert.Equal(t, stderr, "[deprecated] use -peer-addr, not -s", "") + assert.Equal(t, stderr, "[deprecated] use -peer-addr, not -s\n", "") } func TestConfigDeprecatedPeerBindAddrFlag(t *testing.T) { @@ -652,7 +652,7 @@ func TestConfigDeprecatedPeerBindAddrFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peer.BindAddr, "127.0.0.1:4003", "") }) - assert.Equal(t, stderr, "[deprecated] use -peer-bind-addr, not -sl", "") + assert.Equal(t, stderr, "[deprecated] use -peer-bind-addr, not -sl\n", "") } func TestConfigDeprecatedPeerCAFileFlag(t *testing.T) { @@ -662,7 +662,7 @@ func TestConfigDeprecatedPeerCAFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peer.CAFile, "/tmp/peer/file.ca", "") }) - assert.Equal(t, stderr, "[deprecated] use -peer-ca-file, not -serverCAFile", "") + assert.Equal(t, stderr, "[deprecated] use -peer-ca-file, not -serverCAFile\n", "") } func TestConfigDeprecatedPeerCertFileFlag(t *testing.T) { @@ -672,7 +672,7 @@ func TestConfigDeprecatedPeerCertFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peer.CertFile, "/tmp/peer/file.cert", "") }) - assert.Equal(t, stderr, "[deprecated] use -peer-cert-file, not -serverCert", "") + assert.Equal(t, stderr, "[deprecated] use -peer-cert-file, not -serverCert\n", "") } func TestConfigDeprecatedPeerKeyFileFlag(t *testing.T) { @@ -682,7 +682,7 @@ func TestConfigDeprecatedPeerKeyFileFlag(t *testing.T) { assert.NoError(t, err) assert.Equal(t, c.Peer.KeyFile, "/tmp/peer/file.key", "") }) - assert.Equal(t, stderr, "[deprecated] use -peer-key-file, not -serverKey", "") + assert.Equal(t, stderr, "[deprecated] use -peer-key-file, not -serverKey\n", "") } //-------------------------------------- From c17ad07bdb0f1c15c25683a0f648e6fe22755762 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Thu, 2 Jan 2014 11:32:46 -0800 Subject: [PATCH 9/9] chore(README): Expand README with more info about indexes --- README.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2f525a27a..22bde6678 100644 --- a/README.md +++ b/README.md @@ -94,21 +94,27 @@ curl -L http://127.0.0.1:4001/v2/keys/message -X PUT -d value="Hello world" } ``` -This response contains four fields. -We will introduce three more fields as we try more commands. +The response object contains several attributes: -1. The action of the request; we set the value via a `PUT` request, thus the action is `set`. +1. `action`: the action of the request that was just made. +The request attempted to modify `node.value` via a `PUT` HTTP request, thus the value of action is `set`. -2. The key of the request; we set `/message` to `Hello world`, so the key field is `/message`. -We use a file system like structure to represent the key-value pairs so each key starts with `/`. +2. `node.key`: the HTTP path the to which the request was made. +We set `/message` to `Hello world`, so the key field is `/message`. +Etcd uses a file-system-like structure to represent the key-value pairs, therefore all keys start with `/`. -3. The current value of the key; we set the value to`Hello world`. +3. `node.value`: the value of the key after resolving the request. +In this case, a successful request was made that attempted to change the node's value to `Hello world`. -4. Modified Index is a unique, monotonically incrementing index created for each change to etcd. -Requests that change the index include `set`, `delete`, `update`, `create` and `compareAndSwap`. -Since the `get` and `watch` commands do not change state in the store, they do not change the index. +4. `node.createdIndex`: an index is a unique, monotonically-incrementing integer created for each change to etcd. +This specific index reflects at which point in the etcd state machine a given key was created. You may notice that in this example the index is `2` even though it is the first request you sent to the server. -This is because there are internal commands that also change the state like adding and syncing servers. +This is because there are internal commands that also change the state behind the scenes like adding and syncing servers. + +5. `node.modifiedIndex`: like `node.createdIndex`, this attribute is also an etcd index. +Actions that cause the value to change include `set`, `delete`, `update`, `create` and `compareAndSwap`. +Since the `get` and `watch` commands do not change state in the store, they do not change the value of `node.modifiedIndex`. + ### Response Headers