@xiangli-cmu Can we change this block to be the error condition? It's strange to have the success path be in the middle of the function:

```go
  if !n.Compare(prevValue, prevIndex) {
    cause := fmt.Sprintf("[%v != %v] [%v != %v]", prevValue, n.Value, prevIndex, n.ModifiedIndex)
    s.Stats.Inc(CompareAndDeleteFail)
    return nil, etcdErr.NewError(etcdErr.EcodeTestFailed, cause, s.CurrentIndex)
  }
  
  // update etcd index
  s.CurrentIndex++

  e := newEvent(CompareAndDelete, nodePath, s.CurrentIndex, n.CreatedIndex)

  callback := func(path string) { // notify function
    // notify the watchers with deleted set true
    s.WatcherHub.notifyWatchers(e, path, true)
  }

  // delete a key-value pair, no error should happen
  n.Remove(false, false, callback)
  
  s.WatcherHub.notify(e)
  s.Stats.Inc(CompareAndDeleteSuccess)
  return e, nil
```