聊聊dbsync的jobs
序
本文主要研究一下dbsync的jobs
Job
//Job represents db sync job
type Job struct {
ID string
Error string
Status string
Progress Progress
Items []*Transferable
Chunked bool
mutex *sync.Mutex
StartTime time.Time
EndTime *time.Time
}
//NewJob creates a new job
func NewJob(id string) *Job {
return &Job{
ID: id,
StartTime: time.Now(),
mutex: &sync.Mutex{},
Items: make([]*Transferable, 0),
}
}
Job方法定义了ID、Error、Status、Progress、Items、Chunked、mutex、StartTime、EndTime
Update
//Update updates job progress
func (j *Job) Update() {
if len(j.Items) == 0 {
return
}
sourceCount := 0
destCount := 0
transferred := 0
for i := range j.Items {
if j.Items[i].Status == nil {
continue
}
sourceCount += j.Items[i].Source.Count()
destCount += j.Items[i].Dest.Count()
transferred += int(atomic.LoadUint32(&j.Items[i].Transferred))
}
j.Progress.Transferred = transferred
j.Progress.SourceCount = sourceCount
j.Progress.DestCount = destCount
if sourceCount > 0 {
j.Progress.Pct = transferred / sourceCount
}
}
Update方法遍历Items,统计transferred、sourceCount、destCount
Done
//Done flag job as done
func (j *Job) Done(now time.Time) {
if j.Status != shared.StatusError {
j.Status = shared.StatusDone
}
j.EndTime = &now
}
Done方法更新Status和EndTime
Add
//Add add transferable
func (j *Job) Add(transferable *Transferable) {
j.mutex.Lock()
defer j.mutex.Unlock()
j.Items = append(j.Items, transferable)
}
Add方法往transferable添加Items
IsRunning
//IsRunning returns true if jos has running status
func (j *Job) IsRunning() bool {
return j.Status == shared.StatusRunning || j.EndTime == nil
}
IsRunning方法通过status和EndTime来判断是否是running
Service
//Service represents a job service
type Service interface {
//List lists all active or recently active jobs
List(request *ListRequest) *ListResponse
//Create creates a new job
Create(ID string) *core.Job
//Get returns a job for supplied ID or nil
Get(ID string) *core.Job
}
type service struct {
registry *registry
}
//New create a job service
func New() Service {
return &service{
registry: newRegistry(),
}
}
Service接口定义了List、Create、Get
Get
//Get returns job by ID or nil
func (s *service) Get(ID string) *core.Job {
jobs := s.registry.list()
for i := range jobs {
if jobs[i].ID == ID {
jobs[i].Update()
return jobs[i]
}
}
return nil
}
Get方法先执行registry.list(),然后遍历list找到ID对应的job,然后执行Update
List
//List lists all jobs
func (s *service) List(request *ListRequest) *ListResponse {
jobs := s.registry.list()
if len(request.IDs) == 0 {
return &ListResponse{
Jobs: jobs,
}
}
var requestedIDs = make(map[string]bool)
for i := range request.IDs {
requestedIDs[request.IDs[i]] = true
}
var filtered = make([]*core.Job, 0)
for i := range jobs {
if _, has := requestedIDs[jobs[i].ID]; !has {
continue
}
jobs[i].Update()
filtered = append(filtered, jobs[i])
}
return &ListResponse{
Jobs: filtered,
}
}
List方法先执行registry.list(),之后根据requestedIDs找出对应的job,执行Update,最后返回
Create
//Create creates a new job
func (s *service) Create(ID string) *core.Job {
job := core.NewJob(ID)
s.registry.add(job)
return job
}
Create方法通过core.NewJob(ID)创建job,然后执行registry.add(job)
小结
dbsync的Schedulable定义了URL、ID、*contract.Sync、Schedule、Status、status属性,它提供了Clone、Done、IsRunning、ScheduleNexRun、Init、Validate方法。
doc
code-craft
spring boot , docker and so on 欢迎关注微信公众号: geek_luandun
推荐阅读
2022年终总结
最近两年开始陷入颓废中,博客也写的越来越少了。究其原因,主要还是陷入了职业倦怠期,最近一次跳槽感觉颇为失败,但是碍于给的薪资高,为了五斗米折腰,又加上最近行情不好,想要往外跳也跳不了,就这样子一直...
codecraft阅读 687
SegmentFault 思否正式开源问答社区软件 Answer
作为国内领先的新一代技术问答社区,SegmentFault 思否团队在社区建设上有着多年积累。Answer 不仅拥有搭建问答平台(Q&A Platform)的基础功能,还在产品设计上融入了开发团队对社区发展的思考,并将其经验产品...
SegmentFault思否赞 29阅读 4.2k评论 14
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。
机器铃砍菜刀赞 21阅读 54.6k评论 1
年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。
去去1002赞 14阅读 11k评论 2
年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...
去去1002赞 13阅读 11.1k评论 4
【已结束】SegmentFault 思否技术征文丨浅谈 Go 语言框架
亲爱的开发者们:我们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢迎大家来参与分享~征文时间11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前发布中奖名单参与条件新老思否作者均可参加征文...
SegmentFault思否赞 11阅读 4.6k评论 11
【Go微服务】开发gRPC总共分三步
之前我也有写过RPC相关的文章:《 Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?》,详细介绍了RPC是什么,使用边界在哪里?并且用Go和php举例,实现了跨语言调用。不了解RPC的同学建议先读这篇文...
王中阳Go赞 8阅读 3.6k评论 6
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。