kubernetes源码之watch包streamwatcher.go阅读理解五
来源:互联网 发布:linux的mkdir命令 编辑:程序博客网 时间:2024/05/22 02:03
这是watcher包中最后一个文件了
streamwatcher.go先看数据结构
type Decoder interface { Decode() (action EventType, object runtime.Object, err error) Close()}type StreamWatcher struct { sync.Mutex source Decoder result chan Event stopped bool}
再看看方法
StreamWatcher 有两 ResultChan()个stop()方法,实现Interfacefunc (sw *StreamWatcher) ResultChan() <-chan Event { return sw.result}// Stop implements Interface.func (sw *StreamWatcher) Stop() { // Call Close() exactly once by locking and setting a flag. sw.Lock() defer sw.Unlock() if !sw.stopped { sw.stopped = true sw.source.Close() }}实例化一个StreamWatcher并且有一个goroutinefunc NewStreamWatcher(d Decoder) *StreamWatcher { sw := &StreamWatcher{ source: d, // It's easy for a consumer to add buffering via an extra // goroutine/channel, but impossible for them to remove it, // so nonbuffered is better. result: make(chan Event), } go sw.receive() return sw}func (sw *StreamWatcher) stopping() bool { sw.Lock() defer sw.Unlock() return sw.stopped}// receive reads result from the decoder in a loop and sends down the result channel.receive方法循环读取decoder的结果,然后发送到结果通道。receive方法从decoder中使用Decode方法获取(action EventType, object runtime.Object, err error)func (sw *StreamWatcher) receive() { defer close(sw.result) defer sw.Stop() defer utilruntime.HandleCrash() for { action, obj, err := sw.source.Decode() if err != nil { // Ignore expected error. if sw.stopping() { return } switch err { case io.EOF: // watch closed normally case io.ErrUnexpectedEOF: glog.V(1).Infof("Unexpected EOF during watch stream event decoding: %v", err) default: msg := "Unable to decode an event from the watch stream: %v" if net.IsProbableEOF(err) { glog.V(5).Infof(msg, err) } else { glog.Errorf(msg, err) } } return } sw.result <- Event{ Type: action, Object: obj, } }}
总结
说白了就是从Decoder读取数据然后发送给resulttype StreamWatcher struct { sync.Mutex source Decoder result chan Event stopped bool
拓展,看看使用了NewStreamWatcher的文件
k8s.io\client-go\rest\request.go 中694行使用了这个函数 回头在仔细阅读以下这个文件return watch.NewStreamWatcher(restclientwatch.NewDecoder(decoder, r.serializers.Decoder)), nil
阅读全文
0 0
- kubernetes源码之watch包streamwatcher.go阅读理解五
- kubernetes源码之watch包watch.go阅读理解一
- kubernetes源码之watch包mux.go阅读理解二
- kubernetes源码之watch包filter.go阅读理解三
- kubernetes源码之watch包until.go阅读理解四
- kubernetes源码阅读之apiserver
- kubernetes源码阅读之整体架构分析
- kubernetes源码阅读之kubelet启动
- kubernetes源码阅读之controller manager启动
- kubernetes源码阅读之kubelet(二)
- nsq源码阅读 nsqlookupd源码五 http.go http_server.go
- kubernetes watch的使用源码
- kubernetes源码阅读之kubelet pod之来源
- kubernetes源码阅读之controller-manager(二)
- kubernetes源码阅读之controller-manager(三)
- [Kubernetes] Kubernetes 源码编译 RPM 安装包
- kubernetes client-go包使用示例
- spring源码阅读(五)之ApplicationContext
- 剑指offer——10.矩形覆盖
- 数据结构之线性表
- 批处理
- vm安装centos6.4
- 自动化Build的方法如下所示
- kubernetes源码之watch包streamwatcher.go阅读理解五
- Hibernate(十)检索
- js打开新窗口并写入内容
- elasticsearch内存分配设置详解
- 2017 Multi-University Training Contest 1 solutions 1011 KazaQ's Socks
- pure abstract class(什么是纯抽象类?)
- jq获取布尔值
- Java设计模式--简单工厂模式【Simple Factory Pattern】
- 什么是页表和页目录