|
@@ -17,6 +17,7 @@ package grpcproxy
|
|
|
import (
|
|
import (
|
|
|
"github.com/coreos/etcd/clientv3"
|
|
"github.com/coreos/etcd/clientv3"
|
|
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
|
|
|
|
+ "github.com/coreos/etcd/mvcc"
|
|
|
"github.com/coreos/etcd/mvcc/mvccpb"
|
|
"github.com/coreos/etcd/mvcc/mvccpb"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -27,7 +28,8 @@ type watchRange struct {
|
|
|
type watcher struct {
|
|
type watcher struct {
|
|
|
id int64
|
|
id int64
|
|
|
wr watchRange
|
|
wr watchRange
|
|
|
- // TODO: support filter
|
|
|
|
|
|
|
+
|
|
|
|
|
+ filters []mvcc.FilterFunc
|
|
|
progress bool
|
|
progress bool
|
|
|
ch chan<- *pb.WatchResponse
|
|
ch chan<- *pb.WatchResponse
|
|
|
}
|
|
}
|
|
@@ -39,11 +41,32 @@ func (w *watcher) send(wr clientv3.WatchResponse) {
|
|
|
|
|
|
|
|
// todo: filter out the events that this watcher already seen.
|
|
// todo: filter out the events that this watcher already seen.
|
|
|
|
|
|
|
|
- evs := wr.Events
|
|
|
|
|
- events := make([]*mvccpb.Event, len(evs))
|
|
|
|
|
- for i := range evs {
|
|
|
|
|
- events[i] = (*mvccpb.Event)(evs[i])
|
|
|
|
|
|
|
+ events := make([]*mvccpb.Event, 0, len(wr.Events))
|
|
|
|
|
+
|
|
|
|
|
+ for i := range wr.Events {
|
|
|
|
|
+ filtered := false
|
|
|
|
|
+
|
|
|
|
|
+ ev := (*mvccpb.Event)(wr.Events[i])
|
|
|
|
|
+
|
|
|
|
|
+ if len(w.filters) != 0 {
|
|
|
|
|
+ for _, filter := range w.filters {
|
|
|
|
|
+ if filter(*ev) {
|
|
|
|
|
+ filtered = true
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if !filtered {
|
|
|
|
|
+ events = append(events, ev)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // all events are filtered out?
|
|
|
|
|
+ if !wr.IsProgressNotify() && len(events) == 0 {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
pbwr := &pb.WatchResponse{
|
|
pbwr := &pb.WatchResponse{
|
|
|
Header: &wr.Header,
|
|
Header: &wr.Header,
|
|
|
WatchId: w.id,
|
|
WatchId: w.id,
|