66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
|
package etcdint
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"time"
|
||
|
|
||
|
"github.com/sdstack/storage/cluster"
|
||
|
|
||
|
"github.com/coreos/etcd/embed"
|
||
|
"github.com/coreos/etcd/wal"
|
||
|
"github.com/mitchellh/mapstructure"
|
||
|
)
|
||
|
|
||
|
type config struct {
|
||
|
WalSize int64 `mapstructure:"wal_size"`
|
||
|
Store string `mapstructure:"store"`
|
||
|
}
|
||
|
|
||
|
// Internal strect holds data used by internal cluster engine
|
||
|
type ClusterEtcdint struct {
|
||
|
etcdsrv *embed.Etcd
|
||
|
etcdcfg *embed.Config
|
||
|
cfg *config
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
cluster.RegisterCluster("etcdint", &ClusterEtcdint{})
|
||
|
}
|
||
|
|
||
|
func (c *ClusterEtcdint) Configure(data interface{}) error {
|
||
|
var err error
|
||
|
|
||
|
c.etcdcfg = embed.NewConfig()
|
||
|
err = mapstructure.Decode(data, &c.cfg)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
c.etcdcfg.Dir = c.cfg.Store
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Start internal cluster engine
|
||
|
func (c *ClusterEtcdint) Start() error {
|
||
|
wal.SegmentSizeBytes = c.cfg.WalSize
|
||
|
e, err := embed.StartEtcd(c.etcdcfg)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
select {
|
||
|
case <-e.Server.ReadyNotify():
|
||
|
c.etcdsrv = e
|
||
|
break
|
||
|
case <-time.After(60 * time.Second):
|
||
|
e.Server.Stop() // trigger a shutdown
|
||
|
return errors.New("Server took too long to start!")
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Stop internal cluster engin
|
||
|
func (c *ClusterEtcdint) Stop() error {
|
||
|
c.etcdsrv.Server.Stop()
|
||
|
return nil
|
||
|
}
|