etcdserver/api/v2store/store.go
func (s *store) Delete(nodePath string, dir, recursive bool) (*Event, error) {
	var err *v2error.Error

	s.worldLock.Lock()
	defer s.worldLock.Unlock()

	defer func() {
		if err == nil {
			s.Stats.Inc(DeleteSuccess)
			reportWriteSuccess(Delete)
			return
		}

		s.Stats.Inc(DeleteFail)
		reportWriteFailure(Delete)
	}()

	nodePath = path.Clean(path.Join("/", nodePath))
	// we do not allow the user to change "/"
	if s.readonlySet.Contains(nodePath) {
		return nil, v2error.NewError(v2error.EcodeRootROnly, "/", s.CurrentIndex)
	}

	// recursive implies dir
	if recursive {
		dir = true
	}

	n, err := s.internalGet(nodePath)
	if err != nil { // if the node does not exist, return error
		return nil, err
	}

	nextIndex := s.CurrentIndex + 1
	e := newEvent(Delete, nodePath, nextIndex, n.CreatedIndex)
	e.EtcdIndex = nextIndex
	e.PrevNode = n.Repr(false, false, s.clock)
	eNode := e.Node

	if n.IsDir() {
		eNode.Dir = true
	}

	callback := func(path string) { // notify function
		// notify the watchers with deleted set true
		s.WatcherHub.notifyWatchers(e, path, true)
	}

	err = n.Remove(dir, recursive, callback)
	if err != nil {
		return nil, err
	}

	// update etcd index
	s.CurrentIndex++

	s.WatcherHub.notify(e)

	return e, nil
}
func (s *store) Delete(nodePath string, dir, recursive bool) (*Event, error) {
	var err *v2error.Error

	s.worldLock.Lock()
	defer s.worldLock.Unlock()

	defer func() {
		if err == nil {
			s.Stats.Inc(DeleteSuccess)
			reportWriteSuccess(Delete)
			return
		}

		s.Stats.Inc(DeleteFail)
		reportWriteFailure(Delete)
	}()

	nodePath = path.Clean(path.Join("/", nodePath))
	// we do not allow the user to change "/"
	if s.readonlySet.Contains(nodePath) {
		return nil, v2error.NewError(v2error.EcodeRootROnly, "/", s.CurrentIndex)
	}

	// recursive implies dir
	if recursive {
		dir = true
	}

	n, err := s.internalGet(nodePath)
	if err != nil { // if the node does not exist, return error
		return nil, err
	}

	nextIndex := s.CurrentIndex + 1
	e := newEvent(Delete, nodePath, nextIndex, n.CreatedIndex)
	e.EtcdIndex = nextIndex
	e.PrevNode = n.Repr(false, false, s.clock)
	eNode := e.Node

	if n.IsDir() {
		eNode.Dir = true
	}

	callback := func(path string) { // notify function
		// notify the watchers with deleted set true
		s.WatcherHub.notifyWatchers(e, path, true)
	}

	err = n.Remove(dir, recursive, callback)
	if err != nil {
		return nil, err
	}

	// update etcd index
	s.CurrentIndex++

	s.WatcherHub.notify(e)

	return e, nil
}
func ( s * store ) Delete ( nodePath string , dir , recursive bool ) ( * Event , error ) { var err * v2error . Error s . worldLock . Lock ( ) defer s . worldLock . Unlock ( ) defer func ( ) { if err == nil { s . Stats . Inc ( DeleteSuccess ) reportWriteSuccess ( Delete ) return } s . Stats . Inc ( DeleteFail ) reportWriteFailure ( Delete ) } ( ) nodePath = path . Clean ( path . Join ( " " , nodePath ) ) // we do not allow the user to change "/" if s . readonlySet . Contains ( nodePath ) { return nil , v2error . NewError ( v2error . EcodeRootROnly , " " , s . CurrentIndex ) } // recursive implies dir if recursive { dir = true } n , err := s . internalGet ( nodePath ) if err != nil { // if the node does not exist, return error return nil , err } nextIndex := s . CurrentIndex + 1 e := newEvent ( Delete , nodePath , nextIndex , n . CreatedIndex ) e . EtcdIndex = nextIndex e . PrevNode = n . Repr ( false , false , s . clock ) eNode := e . Node if n . IsDir ( ) { eNode . Dir = true } callback := func ( path string ) { // notify function // notify the watchers with deleted set true s . WatcherHub . notifyWatchers ( e , path , true ) } err = n . Remove ( dir , recursive , callback ) if err != nil { return nil , err } // update etcd index s . CurrentIndex ++ s . WatcherHub . notify ( e ) return e , nil }
// Delete deletes the node at the given path.
// If the node is a directory, recursive must be true to delete it.
Delete deletes the node at the given path . If the node is a directory recursive must be true to delete it .