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. ...
随机推荐
- break和continue的简单介绍
1.break break 用于完全结束一个循环,跳出循环体!不管是哪种循环,如果在程序中遇到Break,系统将完全结束该循环,开始执行循环之后的代码: public class TestBreak ...
- oracle 查看表的索引信息
1.select * from user_indexes where table_name='PAMSODT0P02' 2.select * from user_ind_columns where ...
- SQL SERVER 锁资源问题
1204: cannot obtain a LOCK resource 在sql server 锁资源的限制基本是自动优化调整.如果调整过参数,可能在系统大批量查询的时候出现以上错误,或者是 alwa ...
- cannot import name '_imaging' 与No module named PIL解决方法
今天学习廖雪峰的python 第三方模块pillow一章. 直接使用from PIL import Image 会报"No module named PIL",显然这是没有安装pi ...
- HTML元素的专用传参数据属性
把参数直接放到事件定义里面,类似下面这样,也是可以,但是这样不够Nice. <a href="javascript:void(0)" onclick="clickh ...
- (七):C++分布式实时应用框架 2.0
C++分布式实时应用框架 2.0 技术交流合作QQ群:436466587 欢迎讨论交流 上一篇:(六):大型项目容器化改造 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同 ...
- 微软黑科技强力注入,.NET C#全面支持人工智能
微软黑科技强力注入,.NET C#全面支持人工智能,AI编程领域开始C#.Py--百花齐放 就像武侠小说中,一个普通人突然得到绝世高手的几十年内力注入,招式还没学,一身内力有点方 Introducin ...
- VueJs(12)---vue-router(导航守卫,路由元信息)
vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...
- SpringCloud实战-Eureka
熟悉微服务架构或Dubbo框架的都知道,微服务中最核心.最基础的组件就是注册中心了.下面利用Spring Cloud Eureka实现服务注册中心.并注册一个简单的服务提供者. 首先先创建一个spir ...
- Linnux入门之简介
一.Linux简介 Minix(教授实验) -> Linux(大三学生Linus)企鹅作为吉祥物 linux主要分为内核版本和发行版本 linux 内核版本 :官网下载:https://www. ...