跳到主要内容

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 方法用于获取一个操作的状态信息或者结果。如果一个操作已经完成,它会返回操作的结果和一个表示已经完成的布尔值;否则,它会返回操作的状态信息和一个表示尚未完成的布尔值