mirror of https://github.com/ledisdb/ledisdb.git
adjust config, add some replication fund
This commit is contained in:
parent
778f8f4a2b
commit
8fab454223
|
@ -12,12 +12,11 @@ import (
|
||||||
type Config struct {
|
type Config struct {
|
||||||
DataDir string `json:"data_dir"`
|
DataDir string `json:"data_dir"`
|
||||||
|
|
||||||
//data_db path is data_dir/data
|
|
||||||
//if you not set leveldb path, use data_dir/data
|
//if you not set leveldb path, use data_dir/data
|
||||||
DataDB leveldb.Config `json:"data_db"`
|
DataDB leveldb.Config `json:"data_db"`
|
||||||
|
|
||||||
//binlog path is data_dir/binlog
|
UseBinLog bool `json:"use_bin_log"`
|
||||||
//you muse set binlog name to enable binlog
|
|
||||||
//if you not set bin log path, use data_dir/bin_log
|
//if you not set bin log path, use data_dir/bin_log
|
||||||
BinLog replication.BinLogConfig `json:"bin_log"`
|
BinLog replication.BinLogConfig `json:"bin_log"`
|
||||||
}
|
}
|
||||||
|
@ -78,7 +77,7 @@ func OpenWithConfig(cfg *Config) (*Ledis, error) {
|
||||||
|
|
||||||
l.ldb = ldb
|
l.ldb = ldb
|
||||||
|
|
||||||
if len(cfg.BinLog.Name) > 0 {
|
if cfg.UseBinLog {
|
||||||
if len(cfg.BinLog.Path) == 0 {
|
if len(cfg.BinLog.Path) == 0 {
|
||||||
cfg.BinLog.Path = path.Join(cfg.DataDir, "bin_log")
|
cfg.BinLog.Path = path.Join(cfg.DataDir, "bin_log")
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,7 @@ func TestReplication(t *testing.T) {
|
||||||
master, err = Open([]byte(`
|
master, err = Open([]byte(`
|
||||||
{
|
{
|
||||||
"data_dir" : "/tmp/test_repl/master",
|
"data_dir" : "/tmp/test_repl/master",
|
||||||
"bin_log": {
|
"use_bin_log" : true
|
||||||
"name" : "ledis"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
`))
|
`))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -40,7 +38,7 @@ func TestReplication(t *testing.T) {
|
||||||
db.Set([]byte("b"), []byte("2"))
|
db.Set([]byte("b"), []byte("2"))
|
||||||
db.Set([]byte("c"), []byte("3"))
|
db.Set([]byte("c"), []byte("3"))
|
||||||
|
|
||||||
relayLog := "/tmp/test_repl/master/binlog/ledis-bin.0000001"
|
relayLog := "/tmp/test_repl/master/bin_log/ledis-bin.0000001"
|
||||||
|
|
||||||
var offset int64
|
var offset int64
|
||||||
offset, err = slave.RepliateRelayLog(relayLog, 0)
|
offset, err = slave.RepliateRelayLog(relayLog, 0)
|
||||||
|
|
|
@ -52,7 +52,7 @@ func newLog(handler logHandler, cfg *LogConfig) (*Log, error) {
|
||||||
l.handler = handler
|
l.handler = handler
|
||||||
|
|
||||||
if len(l.cfg.Name) == 0 {
|
if len(l.cfg.Name) == 0 {
|
||||||
return nil, fmt.Errorf("you must set log name first")
|
l.cfg.Name = "ledis"
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(cfg.Path, os.ModePerm); err != nil {
|
if err := os.MkdirAll(cfg.Path, os.ModePerm); err != nil {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package server
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/siddontang/ledisdb/ledis"
|
"github.com/siddontang/ledisdb/ledis"
|
||||||
|
"github.com/siddontang/ledisdb/replication"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -15,6 +16,12 @@ type App struct {
|
||||||
ldb *ledis.Ledis
|
ldb *ledis.Ledis
|
||||||
|
|
||||||
closed bool
|
closed bool
|
||||||
|
|
||||||
|
slaveMode bool
|
||||||
|
|
||||||
|
relayLog *replication.Log
|
||||||
|
|
||||||
|
quit chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewApp(cfg *Config) (*App, error) {
|
func NewApp(cfg *Config) (*App, error) {
|
||||||
|
@ -28,6 +35,8 @@ func NewApp(cfg *Config) (*App, error) {
|
||||||
|
|
||||||
app := new(App)
|
app := new(App)
|
||||||
|
|
||||||
|
app.quit = make(chan struct{})
|
||||||
|
|
||||||
app.closed = false
|
app.closed = false
|
||||||
|
|
||||||
app.cfg = cfg
|
app.cfg = cfg
|
||||||
|
@ -44,8 +53,17 @@ func NewApp(cfg *Config) (*App, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
app.ldb, err = ledis.OpenWithConfig(&cfg.DB)
|
app.slaveMode = false
|
||||||
if err != nil {
|
|
||||||
|
if len(app.cfg.SlaveOf) > 0 {
|
||||||
|
app.slaveMode = true
|
||||||
|
|
||||||
|
if app.relayLog, err = replication.NewRelayLogWithConfig(&cfg.RelayLog); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if app.ldb, err = ledis.OpenWithConfig(&cfg.DB); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,20 +75,26 @@ func (app *App) Close() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.closed = true
|
||||||
|
|
||||||
|
close(app.quit)
|
||||||
|
|
||||||
app.listener.Close()
|
app.listener.Close()
|
||||||
|
|
||||||
app.ldb.Close()
|
app.ldb.Close()
|
||||||
|
|
||||||
app.closed = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) Run() {
|
func (app *App) Run() {
|
||||||
|
if app.slaveMode {
|
||||||
|
app.runReplication()
|
||||||
|
}
|
||||||
|
|
||||||
for !app.closed {
|
for !app.closed {
|
||||||
conn, err := app.listener.Accept()
|
conn, err := app.listener.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
newClient(conn, app.ldb)
|
newClient(conn, app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
var errReadRequest = errors.New("invalid request protocol")
|
var errReadRequest = errors.New("invalid request protocol")
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
|
app *App
|
||||||
ldb *ledis.Ledis
|
ldb *ledis.Ledis
|
||||||
|
|
||||||
db *ledis.DB
|
db *ledis.DB
|
||||||
|
@ -29,11 +30,13 @@ type client struct {
|
||||||
reqC chan error
|
reqC chan error
|
||||||
}
|
}
|
||||||
|
|
||||||
func newClient(c net.Conn, ldb *ledis.Ledis) {
|
func newClient(c net.Conn, app *App) {
|
||||||
co := new(client)
|
co := new(client)
|
||||||
co.ldb = ldb
|
|
||||||
|
co.app = app
|
||||||
|
co.ldb = app.ldb
|
||||||
//use default db
|
//use default db
|
||||||
co.db, _ = ldb.Select(0)
|
co.db, _ = app.ldb.Select(0)
|
||||||
co.c = c
|
co.c = c
|
||||||
|
|
||||||
co.rb = bufio.NewReaderSize(c, 256)
|
co.rb = bufio.NewReaderSize(c, 256)
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
func slaveofCommand(c *client) error {
|
||||||
|
if len(c.args) > 1 {
|
||||||
|
return ErrCmdParams
|
||||||
|
}
|
||||||
|
|
||||||
|
master := ""
|
||||||
|
if len(c.args) == 1 {
|
||||||
|
master = string(c.args[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := c.app.slaveof(master); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.writeStatus(OK)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -15,6 +15,10 @@ type Config struct {
|
||||||
//if you not set db path, use data_dir
|
//if you not set db path, use data_dir
|
||||||
DB ledis.Config `json:"db"`
|
DB ledis.Config `json:"db"`
|
||||||
|
|
||||||
|
//set slaveof to enable replication from master
|
||||||
|
//empty, no replication
|
||||||
|
SlaveOf string `json:"slaveof"`
|
||||||
|
|
||||||
//if you not set relay log path, use data_dir/realy_log
|
//if you not set relay log path, use data_dir/realy_log
|
||||||
RelayLog replication.RelayLogConfig `json:"relay_log"`
|
RelayLog replication.RelayLogConfig `json:"relay_log"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
func (app *App) slaveof(master string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) runReplication() {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue