1. package manager

  1. import (
  1.     "net/http"
  1.     "github.com/030io/whalefs/manager/volume"
  1.     "os"
  1.     "io/ioutil"
  1.     "strings"
  1.     "strconv"
  1.     "fmt"
  1.     "time"
  1.     "github.com/030io/whalefs/master/api"
  1.     "github.com/030io/whalefs/master"
  1.     "github.com/030io/whalefs/utils/disk"
  1. )

  1. var (
  1.     MaxDiskUsedPercent uint = 99
  1.     HeartbeatDuration time.Duration = time.Second * 5
  1.     ReadOnly bool = false
  1.     DefaultExpires = time.Minute * 30
  1. )

  1. type VolumeManager struct {
  1.     DataDir string
  1.     Volumes map[uint64]*volume.Volume
  1.     AdminPort int
  1.     AdminHost string
  1.     PublicPort int
  1.     PublicHost string
  1.     AdminServer *http.ServeMux
  1.     PublicServer *http.ServeMux
  1.     Machine string
  1.     DataCenter string
  1.     MasterHost string
  1.     MasterPort int
  1. }

  1. func NewVolumeManager(dir string) (*VolumeManager, error) {
  1.     f, err := os.OpenFile(dir, os.O_RDWR, 0)
  1.     if os.IsNotExist(err) {
  1.         panic(err)
  1.     } else if os.IsPermission(err) {
  1.         ReadOnly = true
  1.     }
  1.     f.Close()
  1.     vm := new(VolumeManager)
  1.     vm.DataDir = dir
  1.     fileInfos, err := ioutil.ReadDir(dir)
  1.     if err != nil {
  1.         panic(err)
  1.     }
  1.     vm.Volumes = make(map[uint64]*volume.Volume)
  1.     for _, fi := range fileInfos {
  1.         fileName := fi.Name()
  1.         if strings.HasSuffix(fileName, ".data") {
  1.             vid, err := strconv.ParseUint(fileName[:len(fileName) - 5], 10, 64)
  1.             if err != nil {
  1.                 panic(err)
  1.             }
  1.             vm.Volumes[vid], err = volume.NewVolume(dir, vid)
  1.             if err != nil {
  1.                 panic(err)
  1.             }
  1.         }
  1.     }
  1.     vm.AdminPort = 7800
  1.     vm.AdminHost = "localhost"
  1.     vm.PublicPort = 7900
  1.     vm.PublicHost = "localhost"
  1.     vm.AdminServer = http.NewServeMux()
  1.     vm.PublicServer = http.NewServeMux()
  1.     vm.PublicServer.HandleFunc("/", vm.publicEntry)
  1.     vm.AdminServer.HandleFunc("/", vm.adminEntry)
  1.     vm.MasterHost = "localhost"
  1.     vm.MasterPort = 8888
  1.     return vm, nil
  1. }

  1. func (vm *VolumeManager)Start() {
  1.     go vm.Heartbeat()

  1.     go func() {
  1.         err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", vm.AdminPort), vm.AdminServer)
  1.         if err != nil {
  1.             panic(err)
  1.         }
  1.     }()

  1.     err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", vm.PublicPort), vm.PublicServer)
  1.     if err != nil {
  1.         panic(err)
  1.     }
  1. }

  1. func (vm *VolumeManager)Stop() {
  1.     for _, v := range vm.Volumes {
  1.         v.Close()
  1.     }
  1. }

  1. func (vm *VolumeManager)Heartbeat() {
  1.     tick := time.NewTicker(HeartbeatDuration)
  1.     defer tick.Stop()
  1.     for {
  1.         vms := new(master.VolumeManagerStatus)
  1.         vms.AdminHost = vm.AdminHost
  1.         vms.AdminPort = vm.AdminPort
  1.         vms.PublicHost = vm.PublicHost
  1.         vms.PublicPort = vm.PublicPort
  1.         vms.Machine = vm.Machine
  1.         vms.DataCenter = vm.Machine
  1.         vms.VStatusList = make([]*master.VolumeStatus, 0, len(vm.Volumes))

  1.         diskUsage, _ := disk.DiskUsage(vm.DataDir)
  1.         vms.DiskSize = diskUsage.Size
  1.         vms.DiskUsed = diskUsage.Used
  1.         vms.DiskFree = diskUsage.Free
  1.         vms.MaxDiskUsed = diskUsage.Size / 100 * uint64(MaxDiskUsedPercent)
  1.         vms.VolumeMaxSize = volume.MaxVolumeSize

  1.         diskUsedPercent := uint(float64(diskUsage.Used) / float64(diskUsage.Size) * 100)
  1.         if ReadOnly || diskUsedPercent >= MaxDiskUsedPercent {
  1.             //禁止所有volume再进行truncate
  1.             volume.MaxVolumeSize = 0
  1.             vms.CanCreateVolume = false
  1.         } else {
  1.             vms.CanCreateVolume = true
  1.         }

  1.         for vid, v := range vm.Volumes {
  1.             vs := new(master.VolumeStatus)
  1.             vs.Id = vid
  1.             vs.DataFileSize = v.GetDatafileSize()
  1.             vs.Writable = !ReadOnly && v.WriteAble
  1.             vs.MaxFreeSpace = v.GetMaxFreeSpace()
  1.             vms.VStatusList = append(vms.VStatusList, vs)
  1.         }

  1.         api.Heartbeat(vm.MasterHost, vm.MasterPort, vms)
  1.         <-tick.C
  1.     }
  1. }

volume_manager.go的更多相关文章

  1. Kubeadm安装Kubernetes环境

    Kubeadm方式号称一键安装部署,很多人也试过并且顺利成功,可到了我这里因为折腾系统问题,倒腾出不少的坑出来. kubeadm好处是自动配置了必要的服务,以及缺省配置了安全的认证,etcd,apis ...

  2. 基于openstack stable queens版本阅读解析

    基于openstack stable queens版本阅读解析 基于 centos7.5 的linux系统 架构 如下所示,为cinder的官方架构说明: 这里写图片描述 各个组件介绍如下: - DB ...

  3. cinder-volume服务上报自己的状态给cinder-scheduler的rpc通信代码分析

    以juno版本为基础,主要从消息的生产者-消费者模型及rpc client/server模型来分析cinder-volume是如何跟cinder-scheduler服务进行rpc通信的 1.cinde ...

  4. kubelet之volume manager源码分析

    kubernetes ceph-csi分析目录导航 基于tag v1.17.4 https://github.com/kubernetes/kubernetes/releases/tag/v1.17. ...

随机推荐

  1. Emmet之html语法

    一.简写语法 Emmet 用和 CSS 选择器相似的语法来描述元素的嵌套层级关系和属性,实现 HTML/XML/CSS 等代码的智能自动补全. 其通过文件名后缀识别文件类型,从而使用对应的自动补全语法 ...

  2. Linux 库函数与系统调用的关系与区别

    上周总结了<C 标准库的基础 IO>,其实这些功能函数通过「系统调用」也能实现相应功能.这次文章并不是要详细介绍各系统调用接口的使用方法,而是要深入理解「库函数」与「系统」调用之间的关系和 ...

  3. SpringBoot使用Maven插件打包部署

    [问题] 之前一直用SpringBoot做一些小项目,想打包部署在环境上,总是少依赖包jar.百度下可以通过Spring Boot Maven plugin插件,把Maven配置的依赖包都打到项目包里 ...

  4. Android集成ffmpeg

    1.ffmpeg官网文档地址:https://trac.ffmpeg.org/wiki/CompilationGuide/Android 2.上面页面资源列表里面第一项 https://github. ...

  5. 今年暑假不AC - HZNU寒假集训

    今年暑假不AC "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" "@#$%^&a ...

  6. 0基础一分钟入门Python

    这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python ...

  7. java中split分割"."的问题

    今天使用split分割"."的时候居然失败了,经过百度发现原来要加转义字符才行. 正确的写法: String test="1.2.3"; String[] s1 ...

  8. 从零开始的H5生活

    作为一个新手,要从头学习Html编程语言,需要从最基础的开始.有耐心慢慢来,很容易就看懂了.我所使用的编程软件是Hbuilder. 1.Html文档结构 包括head和body两部分 <!DOC ...

  9. windows下virtualenv中安装MySQL-python

    先在正常的环境下安装 MySQL-python-1.2.3.win-amd64-py2.7.exe (用everything搜索一下就出来) 然后到 C:\Python27\Lib\site-pack ...

  10. 云计算一:VMware workstation的安装和使用教程

    VMware workstation的安装和使用教程 一.VMware 安装 1.从网上找到VMware的安装包以及要安装的映像文件,下载到本地,然后备份一份存储到百度云盘. 链接:http://pa ...