FIX: Check mount before map image
This commit is contained in:
parent
ba1773ef58
commit
f84c3194af
36
rbmd/http.go
36
rbmd/http.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
|
@ -175,30 +176,49 @@ func (wr Writer) WriteStatusWs(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
c, err := wr.Upgrader.Upgrade(w, r, nil)
|
c, err := wr.Upgrader.Upgrade(w, r, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[Ws ERROR] Upgrade: ", err)
|
log.Error("[Ws] Upgrade: ", err.Error())
|
||||||
defer c.Close()
|
c.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
mt, _, err := c.ReadMessage()
|
mt, _, err := c.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[Ws ERROR] Read error: ", err)
|
log.Error("[Ws] Read error: ", err.Error())
|
||||||
// break
|
// break
|
||||||
defer c.Close()
|
c.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// go func(c *websocket.Conn, mt int) {
|
// Write first state message after upgrade
|
||||||
|
err = c.WriteMessage(mt, wr.z.GetState())
|
||||||
|
if err != nil {
|
||||||
|
log.Error("[Ws] Write err: ", err.Error())
|
||||||
|
c.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add watcher to cluster log
|
||||||
|
// logPath := strings.Join([]string{wr.z.Path, "log", "quorum"}, "/")
|
||||||
|
// log.Info(logPath)
|
||||||
|
// _, _, ch, err := wr.z.Conn.ChildrenW(logPath)
|
||||||
|
// if err != nil {
|
||||||
|
// log.Error("Cant add watcher", err.Error())
|
||||||
|
// c.Close()
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
// log.Info("Run sockets loop")
|
||||||
|
// st := <-ch
|
||||||
|
// log.Info("got zk event ", st.Server)
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
err = c.WriteMessage(mt, wr.z.GetState())
|
err = c.WriteMessage(mt, wr.z.GetState())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[Ws ERROR] Write err: ", err)
|
log.Error("[Ws] Write err: ", err.Error())
|
||||||
defer c.Close()
|
defer c.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
time.Sleep(time.Duration(1) * time.Second)
|
|
||||||
}
|
}
|
||||||
// }(c, mt)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//ServeWebSockets start websockets server
|
//ServeWebSockets start websockets server
|
||||||
|
|
|
@ -235,8 +235,7 @@ func (z ZooNode) DestroyNode(fqdn string) ([]string, string) {
|
||||||
return childrens, strings.Join(message, "")
|
return childrens, strings.Join(message, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
//CheckMounts ...
|
// CheckMounts on down node
|
||||||
// Check mounts on down node
|
|
||||||
func CheckMounts(nodeStat []byte) (bool, []string) {
|
func CheckMounts(nodeStat []byte) (bool, []string) {
|
||||||
var node Node
|
var node Node
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (z ZooNode) RequestWatch(fqdn string) {
|
||||||
|
|
||||||
if z.GetQuorumHealth() != "alive." && child != "resolve" {
|
if z.GetQuorumHealth() != "alive." && child != "resolve" {
|
||||||
z.RMR(p)
|
z.RMR(p)
|
||||||
z.Answer(fqdn, child, []byte(""), "FAIL: cluster not alive")
|
z.Answer(fqdn, child, []byte(""), "FAIL: cluster not alive.")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,21 +49,21 @@ func (z ZooNode) RequestWatch(fqdn string) {
|
||||||
m, err := z.CheckMounted(r)
|
m, err := z.CheckMounted(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
z.RMR(p)
|
z.RMR(p)
|
||||||
z.Answer(fqdn, child, []byte(""), "FAIL")
|
z.Answer(fqdn, child, []byte(err.Error()), "FAIL")
|
||||||
log.Print("[ERROR] Mapping error: ", err.Error())
|
log.Error("[ERROR] Mapping error: ", err.Error())
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if !m {
|
if !m {
|
||||||
z.RMR(p)
|
z.RMR(p)
|
||||||
z.Answer(fqdn, child, []byte("Already mounted"), "FAIL")
|
z.Answer(fqdn, child, []byte("Already mounted"), "FAIL")
|
||||||
log.Print("[ERROR] Mapping error: ", err.Error())
|
log.Error("[ERROR] Mapping error: Already mounted")
|
||||||
break
|
return
|
||||||
}
|
}
|
||||||
std, err := r.MapDevice()
|
std, err := r.MapDevice()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
z.RMR(p)
|
z.RMR(p)
|
||||||
z.Answer(fqdn, child, std, "FAIL")
|
z.Answer(fqdn, child, std, "FAIL")
|
||||||
log.Print("[ERROR] Mapping error: ", string(std), err.Error())
|
log.Error("[ERROR] Mapping error: ", string(std), err.Error())
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
err = r.MountFS(string(std))
|
err = r.MountFS(string(std))
|
||||||
|
@ -168,15 +168,15 @@ func (z ZooNode) Answer(fqdn string, req string, stderr []byte, t string) {
|
||||||
answer := MountState{t, string(stderr)}
|
answer := MountState{t, string(stderr)}
|
||||||
answerJSON, err := json.Marshal(answer)
|
answerJSON, err := json.Marshal(answer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[ERROR] ", err)
|
log.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = z.Conn.Create(answerPath, answerJSON, 0, zk.WorldACL(zk.PermAll))
|
_, err = z.Conn.Create(answerPath, answerJSON, 0, zk.WorldACL(zk.PermAll))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[zk ERROR] ", err)
|
log.Error("[zk] ", err.Error())
|
||||||
_, err := z.Conn.Set(answerPath, answerJSON, -1)
|
_, err := z.Conn.Set(answerPath, answerJSON, -1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[zk ERROR] ", err)
|
log.Error("[zk] ", err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,11 +223,11 @@ func (z ZooNode) UmountRequest(r RBDDevice) error {
|
||||||
//WatchAnswer watch for answer
|
//WatchAnswer watch for answer
|
||||||
func (z ZooNode) WatchAnswer(fqdn string, t string) MountState {
|
func (z ZooNode) WatchAnswer(fqdn string, t string) MountState {
|
||||||
answersPath := strings.Join([]string{z.Path, "cluster", fqdn, "answers"}, "/")
|
answersPath := strings.Join([]string{z.Path, "cluster", fqdn, "answers"}, "/")
|
||||||
log.Print("[DEBUG] ", answersPath)
|
log.Debug(answersPath)
|
||||||
_, _, ch, err := z.Conn.ChildrenW(answersPath)
|
_, _, ch, err := z.Conn.ChildrenW(answersPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print("[zk ERROR] 107 ", err)
|
log.Error("[zk] ", err.Error())
|
||||||
return MountState{"FAIL", "Zk error"}
|
return MountState{"FAIL", "Zk error " + err.Error()}
|
||||||
}
|
}
|
||||||
|
|
||||||
var ms MountState
|
var ms MountState
|
||||||
|
@ -280,8 +280,8 @@ func (z ZooNode) CheckMounted(r RBDDevice) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
statePath := strings.Join([]string{z.Path, "cluster", node, "state"}, "/")
|
|
||||||
var nodeState Node
|
var nodeState Node
|
||||||
|
statePath := strings.Join([]string{z.Path, "cluster", node, "state"}, "/")
|
||||||
|
|
||||||
state, _, err := z.Conn.Get(statePath)
|
state, _, err := z.Conn.Get(statePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -92,7 +92,10 @@ func GetRBDPool(device string) (string, string) {
|
||||||
log.Fatal("[ERROR] Read failure ", err)
|
log.Fatal("[ERROR] Read failure ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(pool), string(image)
|
p := strings.Trim(string(pool), "\n")
|
||||||
|
i := strings.Trim(string(image), "\n")
|
||||||
|
|
||||||
|
return p, i
|
||||||
}
|
}
|
||||||
|
|
||||||
//GetMyIPs Exclude 127.0.0.1
|
//GetMyIPs Exclude 127.0.0.1
|
||||||
|
@ -188,7 +191,7 @@ func (r RBDDevice) MapDevice() ([]byte, error) {
|
||||||
o := stdout.String()
|
o := stdout.String()
|
||||||
|
|
||||||
if strings.HasSuffix(o, "\n") {
|
if strings.HasSuffix(o, "\n") {
|
||||||
o = o[:len(o)-2]
|
o = o[:len(o)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
return []byte(o), nil
|
return []byte(o), nil
|
||||||
|
|
Loading…
Reference in New Issue
Block a user