2014-06-06 10:57:18 +04:00
|
|
|
package server
|
|
|
|
|
2014-06-08 12:43:59 +04:00
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"github.com/siddontang/go-log/log"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
)
|
|
|
|
|
|
|
|
type masterInfo struct {
|
|
|
|
Addr string `json:"addr"`
|
|
|
|
LogFile string `json:"log_name"`
|
|
|
|
LogPos int64 `json:"log_pos"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) getMasterInfoName() string {
|
|
|
|
return path.Join(app.cfg.DataDir, "master.info")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) loadMasterInfo() error {
|
|
|
|
data, err := ioutil.ReadFile(app.getMasterInfoName())
|
|
|
|
if err != nil {
|
|
|
|
if os.IsNotExist(err) {
|
|
|
|
return nil
|
|
|
|
} else {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = json.Unmarshal(data, &app.master); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) saveMasterInfo() error {
|
|
|
|
bakName := path.Join(app.cfg.DataDir, "master.info.bak")
|
|
|
|
|
|
|
|
data, err := json.Marshal(&app.master)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var fd *os.File
|
|
|
|
fd, err = os.OpenFile(bakName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err = fd.Write(data); err != nil {
|
|
|
|
fd.Close()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
fd.Close()
|
|
|
|
return os.Rename(bakName, app.getMasterInfoName())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) slaveof(masterAddr string) error {
|
|
|
|
if len(masterAddr) == 0 {
|
|
|
|
//stop replication
|
|
|
|
} else {
|
|
|
|
}
|
|
|
|
|
2014-06-06 10:57:18 +04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) runReplication() {
|
2014-06-08 12:43:59 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (app *App) startReplication(masterAddr string) error {
|
|
|
|
if err := app.loadMasterInfo(); err != nil {
|
|
|
|
log.Error("load master.info error %s, use fullsync", err.Error())
|
|
|
|
app.master = masterInfo{masterAddr, "", 0}
|
|
|
|
} else if app.master.Addr != masterAddr {
|
|
|
|
if err := app.ldb.FlushAll(); err != nil {
|
|
|
|
log.Error("replication flush old data error %s", err.Error())
|
|
|
|
return err
|
|
|
|
}
|
2014-06-06 10:57:18 +04:00
|
|
|
|
2014-06-08 12:43:59 +04:00
|
|
|
app.master = masterInfo{masterAddr, "", 0}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2014-06-06 10:57:18 +04:00
|
|
|
}
|