volume_manager.go
- package manager
- import (
- "net/http"
- "github.com/030io/whalefs/manager/volume"
- "os"
- "io/ioutil"
- "strings"
- "strconv"
- "fmt"
- "time"
- "github.com/030io/whalefs/master/api"
- "github.com/030io/whalefs/master"
- "github.com/030io/whalefs/utils/disk"
- )
- var (
- MaxDiskUsedPercent uint = 99
- HeartbeatDuration time.Duration = time.Second * 5
- ReadOnly bool = false
- DefaultExpires = time.Minute * 30
- )
- type VolumeManager struct {
- DataDir string
- Volumes map[uint64]*volume.Volume
- AdminPort int
- AdminHost string
- PublicPort int
- PublicHost string
- AdminServer *http.ServeMux
- PublicServer *http.ServeMux
- Machine string
- DataCenter string
- MasterHost string
- MasterPort int
- }
- func NewVolumeManager(dir string) (*VolumeManager, error) {
- f, err := os.OpenFile(dir, os.O_RDWR, 0)
- if os.IsNotExist(err) {
- panic(err)
- } else if os.IsPermission(err) {
- ReadOnly = true
- }
- f.Close()
- vm := new(VolumeManager)
- vm.DataDir = dir
- fileInfos, err := ioutil.ReadDir(dir)
- if err != nil {
- panic(err)
- }
- vm.Volumes = make(map[uint64]*volume.Volume)
- for _, fi := range fileInfos {
- fileName := fi.Name()
- if strings.HasSuffix(fileName, ".data") {
- vid, err := strconv.ParseUint(fileName[:len(fileName) - 5], 10, 64)
- if err != nil {
- panic(err)
- }
- vm.Volumes[vid], err = volume.NewVolume(dir, vid)
- if err != nil {
- panic(err)
- }
- }
- }
- vm.AdminPort = 7800
- vm.AdminHost = "localhost"
- vm.PublicPort = 7900
- vm.PublicHost = "localhost"
- vm.AdminServer = http.NewServeMux()
- vm.PublicServer = http.NewServeMux()
- vm.PublicServer.HandleFunc("/", vm.publicEntry)
- vm.AdminServer.HandleFunc("/", vm.adminEntry)
- vm.MasterHost = "localhost"
- vm.MasterPort = 8888
- return vm, nil
- }
- func (vm *VolumeManager)Start() {
- go vm.Heartbeat()
- go func() {
- err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", vm.AdminPort), vm.AdminServer)
- if err != nil {
- panic(err)
- }
- }()
- err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", vm.PublicPort), vm.PublicServer)
- if err != nil {
- panic(err)
- }
- }
- func (vm *VolumeManager)Stop() {
- for _, v := range vm.Volumes {
- v.Close()
- }
- }
- func (vm *VolumeManager)Heartbeat() {
- tick := time.NewTicker(HeartbeatDuration)
- defer tick.Stop()
- for {
- vms := new(master.VolumeManagerStatus)
- vms.AdminHost = vm.AdminHost
- vms.AdminPort = vm.AdminPort
- vms.PublicHost = vm.PublicHost
- vms.PublicPort = vm.PublicPort
- vms.Machine = vm.Machine
- vms.DataCenter = vm.Machine
- vms.VStatusList = make([]*master.VolumeStatus, 0, len(vm.Volumes))
- diskUsage, _ := disk.DiskUsage(vm.DataDir)
- vms.DiskSize = diskUsage.Size
- vms.DiskUsed = diskUsage.Used
- vms.DiskFree = diskUsage.Free
- vms.MaxDiskUsed = diskUsage.Size / 100 * uint64(MaxDiskUsedPercent)
- vms.VolumeMaxSize = volume.MaxVolumeSize
- diskUsedPercent := uint(float64(diskUsage.Used) / float64(diskUsage.Size) * 100)
- if ReadOnly || diskUsedPercent >= MaxDiskUsedPercent {
- //禁止所有volume再进行truncate
- volume.MaxVolumeSize = 0
- vms.CanCreateVolume = false
- } else {
- vms.CanCreateVolume = true
- }
- for vid, v := range vm.Volumes {
- vs := new(master.VolumeStatus)
- vs.Id = vid
- vs.DataFileSize = v.GetDatafileSize()
- vs.Writable = !ReadOnly && v.WriteAble
- vs.MaxFreeSpace = v.GetMaxFreeSpace()
- vms.VStatusList = append(vms.VStatusList, vs)
- }
- api.Heartbeat(vm.MasterHost, vm.MasterPort, vms)
- <-tick.C
- }
- }
volume_manager.go的更多相关文章
- Kubeadm安装Kubernetes环境
Kubeadm方式号称一键安装部署,很多人也试过并且顺利成功,可到了我这里因为折腾系统问题,倒腾出不少的坑出来. kubeadm好处是自动配置了必要的服务,以及缺省配置了安全的认证,etcd,apis ...
- 基于openstack stable queens版本阅读解析
基于openstack stable queens版本阅读解析 基于 centos7.5 的linux系统 架构 如下所示,为cinder的官方架构说明: 这里写图片描述 各个组件介绍如下: - DB ...
- cinder-volume服务上报自己的状态给cinder-scheduler的rpc通信代码分析
以juno版本为基础,主要从消息的生产者-消费者模型及rpc client/server模型来分析cinder-volume是如何跟cinder-scheduler服务进行rpc通信的 1.cinde ...
- kubelet之volume manager源码分析
kubernetes ceph-csi分析目录导航 基于tag v1.17.4 https://github.com/kubernetes/kubernetes/releases/tag/v1.17. ...
随机推荐
- Java内部类与外部类
错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...
- javascript原始值和对象引用
一句话来说:原始值是不可变的,而对象引用是可变的. js中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着本质的区别.原始值是不可更改的,任何方法都无法更改一 ...
- ruby中printf "%x"%-4为何会打印开头..
先看一下ruby中printf "%x" % -4的返回结果: irb(main):134:0> printf "%x\n" % -4 ..fc 前面的. ...
- ASP.NET Core 2.0 : 九.从Windows发布到CentOS的跨平台部署
本文聊一下如何在Windows上用VS开发并发布, 然后将其部署到CentOS上.对于我们一些常在Windows上逛的来说,CentOS用起来还真有些麻烦.MSDN官方有篇文章大概讲了一下(链接),按 ...
- JavaScript中对象数组 作业 题目如下
var BaiduUsers = [], WechatUsers = []; var User = function(id, name, phone, gender, age, salary) { t ...
- Application "org.eclipse.ui.ide.workbench" could not be found in the registry.问题的解决
今天升级Eclipse,升级完Restart,碰到启动不了让看日志,日志里主要错误信息即是Application "org.eclipse.ui.ide.workbench" co ...
- sqlite db数据的导出
sqlite的db数据一般是filename.db的格式,用普通文本编辑器打开是乱码,用sqlite名令操作比较麻烦,有时版本格式问题还会起阻扰,有一个GUI工具可以对sqlite db格式数据进行管 ...
- POSTGRESQL 并发控制
http://meidayhxp.blog.163.com/blog/static/117608156201210243837491/ 这个内容是官方Doc中的一章,具体是那一版的,还未确认. 第九章 ...
- Page.ClientScript.RegisterStartupScript用法小结
使用类型.键.脚本文本和指示是否添加脚本标记的布尔值向 Page 对象注册启动脚本. 参数 type 要注册的启动脚本的类型. key 要注册的启动脚本的键. script 要注册的启动脚本文本. a ...
- invalid bound statement (not found)
invalid bound statement (not found) mybatis 错误: 一般是Mapepr.xml文件中文nameapce没有和mapper接口发生映射,导致mybatis绑定 ...