store: set readonly to pre-defined namespaces

This commit is contained in:
Yicheng Qin 2015-02-04 16:47:08 -08:00
parent f13c7872d5
commit 3ac0298bd0
2 changed files with 20 additions and 15 deletions

View File

@ -25,6 +25,7 @@ import (
"github.com/coreos/etcd/Godeps/_workspace/src/github.com/jonboulle/clockwork"
etcdErr "github.com/coreos/etcd/error"
"github.com/coreos/etcd/pkg/types"
)
// The default version to set when the store is first initialized.
@ -68,6 +69,7 @@ type store struct {
ttlKeyHeap *ttlKeyHeap // need to recovery manually
worldLock sync.RWMutex // stop the world lock
clock clockwork.Clock
readonlySet types.Set
}
// The given namespaces will be created as initial directories in the returned store.
@ -87,6 +89,7 @@ func newStore(namespaces ...string) *store {
s.Stats = newStats()
s.WatcherHub = newWatchHub(1000)
s.ttlKeyHeap = newTtlKeyHeap()
s.readonlySet = types.NewUnsafeSet(append(namespaces, "/")...)
return s
}
@ -207,7 +210,7 @@ func (s *store) CompareAndSwap(nodePath string, prevValue string, prevIndex uint
nodePath = path.Clean(path.Join("/", nodePath))
// we do not allow the user to change "/"
if nodePath == "/" {
if s.readonlySet.Contains(nodePath) {
return nil, etcdErr.NewError(etcdErr.EcodeRootROnly, "/", s.CurrentIndex)
}
@ -262,7 +265,7 @@ func (s *store) Delete(nodePath string, dir, recursive bool) (*Event, error) {
nodePath = path.Clean(path.Join("/", nodePath))
// we do not allow the user to change "/"
if nodePath == "/" {
if s.readonlySet.Contains(nodePath) {
return nil, etcdErr.NewError(etcdErr.EcodeRootROnly, "/", s.CurrentIndex)
}
@ -405,7 +408,7 @@ func (s *store) Update(nodePath string, newValue string, expireTime time.Time) (
nodePath = path.Clean(path.Join("/", nodePath))
// we do not allow the user to change "/"
if nodePath == "/" {
if s.readonlySet.Contains(nodePath) {
return nil, etcdErr.NewError(etcdErr.EcodeRootROnly, "/", s.CurrentIndex)
}
@ -465,7 +468,7 @@ func (s *store) internalCreate(nodePath string, dir bool, value string, unique,
nodePath = path.Clean(path.Join("/", nodePath))
// we do not allow the user to change "/"
if nodePath == "/" {
if s.readonlySet.Contains(nodePath) {
return nil, etcdErr.NewError(etcdErr.EcodeRootROnly, "/", currIndex)
}

View File

@ -442,22 +442,24 @@ func TestStoreDeleteDiretoryFailsIfNonRecursiveAndDir(t *testing.T) {
}
func TestRootRdOnly(t *testing.T) {
s := newStore()
s := newStore("/0")
_, err := s.Set("/", true, "", Permanent)
assert.NotNil(t, err, "")
for _, tt := range []string{"/", "/0"} {
_, err := s.Set(tt, true, "", Permanent)
assert.NotNil(t, err, "")
_, err = s.Delete("/", true, true)
assert.NotNil(t, err, "")
_, err = s.Delete(tt, true, true)
assert.NotNil(t, err, "")
_, err = s.Create("/", true, "", false, Permanent)
assert.NotNil(t, err, "")
_, err = s.Create(tt, true, "", false, Permanent)
assert.NotNil(t, err, "")
_, err = s.Update("/", "", Permanent)
assert.NotNil(t, err, "")
_, err = s.Update(tt, "", Permanent)
assert.NotNil(t, err, "")
_, err = s.CompareAndSwap("/", "", 0, "", Permanent)
assert.NotNil(t, err, "")
_, err = s.CompareAndSwap(tt, "", 0, "", Permanent)
assert.NotNil(t, err, "")
}
}
func TestStoreCompareAndDeletePrevValue(t *testing.T) {