26.glog
PR #221
Use glog for logging
使用glog,可以打印error,后面会添加日志级别
glog.Infof("Starting to listen on %s:%d", address, port)
glog.Errorf("Error syncing http: %#v", err)
glog.V(1).Infof("Setting up a watch for configuration changes in etcd for %s", key)
PR #252
Rename cloudcfg to kubecfg [终于改名字了]
PR #233
switch to built in golang FileServer [使用go自带的文件服务器]
func makeFileHandler(prefix, base string) http.Handler {
return http.StripPrefix(prefix, http.FileServer(http.Dir(base)))
}
func NewProxyServer(filebase, host string, auth *client.AuthInfo) *ProxyServer {
server := &ProxyServer{
Host: host,
Auth: auth,
Client: client.New(host, auth),
}
http.Handle("/api/", server)
http.Handle("/static/", makeFileHandler("/static/", filebase))
return server
}
PR #249
Give api server operation tracking ability [给操作添加追踪功能]
// Operation represents an ongoing action which the server is performing.
type Operation struct {
ID string
result interface{}
awaiting <-chan interface{}
finished *time.Time
lock sync.Mutex
notify chan bool
}
// Operations tracks all the ongoing operations.
type Operations struct {
// Access only using functions from atomic.
lastID int64
// 'lock' guards the ops map.
lock sync.Mutex
ops map[string]*Operation
}
func (ops *Operations) Get(id string) *Operation {
ops.lock.Lock()
defer ops.lock.Unlock()
return ops.ops[id]
}
我们使用 Operations 来记录系统中目前的请求操作状态,操作是否执行完毕,是否超时,是否正在执行中。同时,我们正式让异步操作生效,将耗时操作放到MakeAsync中,如下图:
对于 operation.go 的详细代码解释
用于在Kubernetes API服务器中管理和追踪正在进行的操作。以下是这段代码的详细解释:
Operation 结构代表服务器正在执行的一个操作。它包含了操作的ID、结果、等待通道、完成时间、同步锁和通知通道等成员。
Operations 结构用于跟踪所有正在进行的操作。它包含了最后一个操作的ID、同步锁和一个由操作ID到操作实例的映射。
NewOperations 函数用于创建一个新的操作跟踪器。这个函数创建一个新的操作跟踪器实例,并启动一个后台协程,用于每隔一段时间(例如5分钟)清理过期的操作。
NewOperation 方法用于添加一个新的操作。它使用原子操作增加最后一个操作的ID,创建一个新的操作实例,并启动两个后台协程,分别用于等待操作完成和将新操作插入到操作映射中。
insert 方法用于将一个新的操作插入到操作映射中。这个方法会在插入操作前后加锁,以确保并发安全。
List 方法用于列出所有操作的ID。这个方法也会在操作前后加锁,以确保并发安全。
Get 方法用于获取指定ID的操作。这个方法也会在操作前后加锁,以确保并发安全。
expire 方法用于清理过期的操作。这个方法会遍历所有操作,检查它们是否已经完成并且完成时间已经超过了最大年龄,如果是的话,就将它们从操作映射中移除。
wait 方法用于等待一个操作完成。这个方法会在一个操作完成后设置其完成时间,并发送一个通知信号。
WaitFor 方法用于等待一个操作完成或者超时。这个方法会等待一个通知信号或者超时信号,以确定一个操作是否已经完成。
expired 方法用于检查一个操作是否已经完成并且完成时间早于指定时间。
StatusOrResult 方法用于获取一个操作的状态信息或者结果。如果一个操作已经完成,它会返回操作的结果和一个表示已经完成的布尔值;否则,它会返回操作的状态信息和一个表示尚未完成的布尔值