|
@ -10,7 +10,42 @@ import ( |
|
|
"strings" |
|
|
"strings" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
func SubscribeMetaEvents(mc *MetaCache, selfSignature int32, client filer_pb.FilerClient, dir string, lastTsNs int64) error { |
|
|
|
|
|
|
|
|
type MetadataFollower struct { |
|
|
|
|
|
PathPrefixToWatch string |
|
|
|
|
|
ProcessEventFn func(resp *filer_pb.SubscribeMetadataResponse) error |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func mergeProceesors(mainProcessor func(resp *filer_pb.SubscribeMetadataResponse) error, followers ...*MetadataFollower) func(resp *filer_pb.SubscribeMetadataResponse) error { |
|
|
|
|
|
return func(resp *filer_pb.SubscribeMetadataResponse) error { |
|
|
|
|
|
|
|
|
|
|
|
// build the full path
|
|
|
|
|
|
entry := resp.EventNotification.NewEntry |
|
|
|
|
|
if entry == nil { |
|
|
|
|
|
entry = resp.EventNotification.OldEntry |
|
|
|
|
|
} |
|
|
|
|
|
dir := resp.Directory |
|
|
|
|
|
if resp.EventNotification.NewParentPath != "" { |
|
|
|
|
|
dir = resp.EventNotification.NewParentPath |
|
|
|
|
|
} |
|
|
|
|
|
fp := util.NewFullPath(dir, entry.Name) |
|
|
|
|
|
|
|
|
|
|
|
for _, follower := range followers { |
|
|
|
|
|
if strings.HasPrefix(string(fp), follower.PathPrefixToWatch) { |
|
|
|
|
|
if err := follower.ProcessEventFn(resp); err != nil { |
|
|
|
|
|
return err |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return mainProcessor(resp) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func SubscribeMetaEvents(mc *MetaCache, selfSignature int32, client filer_pb.FilerClient, dir string, lastTsNs int64, followers ...*MetadataFollower) error { |
|
|
|
|
|
|
|
|
|
|
|
var prefixes []string |
|
|
|
|
|
for _, follower := range followers { |
|
|
|
|
|
prefixes = append(prefixes, follower.PathPrefixToWatch) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
processEventFn := func(resp *filer_pb.SubscribeMetadataResponse) error { |
|
|
processEventFn := func(resp *filer_pb.SubscribeMetadataResponse) error { |
|
|
message := resp.EventNotification |
|
|
message := resp.EventNotification |
|
@ -69,7 +104,7 @@ func SubscribeMetaEvents(mc *MetaCache, selfSignature int32, client filer_pb.Fil |
|
|
ClientEpoch: 1, |
|
|
ClientEpoch: 1, |
|
|
SelfSignature: selfSignature, |
|
|
SelfSignature: selfSignature, |
|
|
PathPrefix: prefix, |
|
|
PathPrefix: prefix, |
|
|
AdditionalPathPrefixes: nil, |
|
|
|
|
|
|
|
|
AdditionalPathPrefixes: prefixes, |
|
|
DirectoriesToWatch: nil, |
|
|
DirectoriesToWatch: nil, |
|
|
StartTsNs: lastTsNs, |
|
|
StartTsNs: lastTsNs, |
|
|
StopTsNs: 0, |
|
|
StopTsNs: 0, |
|
@ -77,7 +112,7 @@ func SubscribeMetaEvents(mc *MetaCache, selfSignature int32, client filer_pb.Fil |
|
|
} |
|
|
} |
|
|
util.RetryUntil("followMetaUpdates", func() error { |
|
|
util.RetryUntil("followMetaUpdates", func() error { |
|
|
metadataFollowOption.ClientEpoch++ |
|
|
metadataFollowOption.ClientEpoch++ |
|
|
return pb.WithFilerClientFollowMetadata(client, metadataFollowOption, processEventFn) |
|
|
|
|
|
|
|
|
return pb.WithFilerClientFollowMetadata(client, metadataFollowOption, mergeProceesors(processEventFn, followers...)) |
|
|
}, func(err error) bool { |
|
|
}, func(err error) bool { |
|
|
glog.Errorf("follow metadata updates: %v", err) |
|
|
glog.Errorf("follow metadata updates: %v", err) |
|
|
return true |
|
|
return true |
|
|