FIX: Check mount before map image

This commit is contained in:
Denis Zheleztsov 2017-09-04 14:38:19 +03:00
parent ba1773ef58
commit f84c3194af
4 changed files with 47 additions and 25 deletions

View File

@ -4,6 +4,7 @@ import (
"encoding/json"
"net/http"
"strings"
"time"
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)
if err != nil {
log.Print("[Ws ERROR] Upgrade: ", err)
defer c.Close()
log.Error("[Ws] Upgrade: ", err.Error())
c.Close()
return
}
mt, _, err := c.ReadMessage()
if err != nil {
log.Print("[Ws ERROR] Read error: ", err)
log.Error("[Ws] Read error: ", err.Error())
// break
defer c.Close()
c.Close()
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 {
// 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())
if err != nil {
log.Print("[Ws ERROR] Write err: ", err)
log.Error("[Ws] Write err: ", err.Error())
defer c.Close()
return
}
time.Sleep(time.Duration(1) * time.Second)
}
// }(c, mt)
}
//ServeWebSockets start websockets server

View File

@ -235,8 +235,7 @@ func (z ZooNode) DestroyNode(fqdn string) ([]string, string) {
return childrens, strings.Join(message, "")
}
//CheckMounts ...
// Check mounts on down node
// CheckMounts on down node
func CheckMounts(nodeStat []byte) (bool, []string) {
var node Node

View File

@ -40,7 +40,7 @@ func (z ZooNode) RequestWatch(fqdn string) {
if z.GetQuorumHealth() != "alive." && child != "resolve" {
z.RMR(p)
z.Answer(fqdn, child, []byte(""), "FAIL: cluster not alive")
z.Answer(fqdn, child, []byte(""), "FAIL: cluster not alive.")
break
}
@ -49,21 +49,21 @@ func (z ZooNode) RequestWatch(fqdn string) {
m, err := z.CheckMounted(r)
if err != nil {
z.RMR(p)
z.Answer(fqdn, child, []byte(""), "FAIL")
log.Print("[ERROR] Mapping error: ", err.Error())
z.Answer(fqdn, child, []byte(err.Error()), "FAIL")
log.Error("[ERROR] Mapping error: ", err.Error())
break
}
if !m {
z.RMR(p)
z.Answer(fqdn, child, []byte("Already mounted"), "FAIL")
log.Print("[ERROR] Mapping error: ", err.Error())
break
log.Error("[ERROR] Mapping error: Already mounted")
return
}
std, err := r.MapDevice()
if err != nil {
z.RMR(p)
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
}
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)}
answerJSON, err := json.Marshal(answer)
if err != nil {
log.Print("[ERROR] ", err)
log.Error(err.Error())
}
_, err = z.Conn.Create(answerPath, answerJSON, 0, zk.WorldACL(zk.PermAll))
if err != nil {
log.Print("[zk ERROR] ", err)
log.Error("[zk] ", err.Error())
_, err := z.Conn.Set(answerPath, answerJSON, -1)
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
func (z ZooNode) WatchAnswer(fqdn string, t string) MountState {
answersPath := strings.Join([]string{z.Path, "cluster", fqdn, "answers"}, "/")
log.Print("[DEBUG] ", answersPath)
log.Debug(answersPath)
_, _, ch, err := z.Conn.ChildrenW(answersPath)
if err != nil {
log.Print("[zk ERROR] 107 ", err)
return MountState{"FAIL", "Zk error"}
log.Error("[zk] ", err.Error())
return MountState{"FAIL", "Zk error " + err.Error()}
}
var ms MountState
@ -280,8 +280,8 @@ func (z ZooNode) CheckMounted(r RBDDevice) (bool, error) {
}
for _, node := range nodes {
statePath := strings.Join([]string{z.Path, "cluster", node, "state"}, "/")
var nodeState Node
statePath := strings.Join([]string{z.Path, "cluster", node, "state"}, "/")
state, _, err := z.Conn.Get(statePath)
if err != nil {

View File

@ -92,7 +92,10 @@ func GetRBDPool(device string) (string, string) {
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
@ -188,7 +191,7 @@ func (r RBDDevice) MapDevice() ([]byte, error) {
o := stdout.String()
if strings.HasSuffix(o, "\n") {
o = o[:len(o)-2]
o = o[:len(o)-1]
}
return []byte(o), nil