featurebase/core/etcd.go
2013-12-10 14:26:59 -06:00

166 lines
4.6 KiB
Go

package core
import (
"github.com/coreos/go-etcd/etcd"
"encoding/gob"
"pilosa/db"
"github.com/davecgh/go-spew/spew"
"github.com/nu7hatch/gouuid"
"strconv"
"log"
)
func (service *Service) SetupEtcd() {
gob.Register(db.Location{})
service.Etcd = etcd.NewClient(nil)
//service.NodeMapMutex.Lock()
//defer service.NodeMapMutex.Unlock()
//service.NodeMap = db.NodeMap{}
//nodes, err := service.Etcd.Get("nodes", false)
//if err != nil {
// log.Fatal(err)
//}
//for _, node := range nodes.Kvs {
// nodestring := strings.Split(node.Key, "/")[2]
// location, err := db.NewLocation(nodestring)
// if err != nil {
// log.Fatal(err)
// }
// routerlocation, err := db.NewLocation(node.Value)
// if err != nil {
// log.Fatal(err)
// }
// service.NodeMap[*location] = *routerlocation
//}
//log.Println(service.NodeMap)
}
//func (service *Service) WatchEtcd() {
// var receiver = make(chan *etcd.Response)
// var stop chan bool
// go func () {
// _, err := service.Etcd.Watch("nodes/", 0, receiver, stop)
// if err != nil {
// log.Fatal(err)
// }
// }()
//
// exit, done := service.GetExitChannels()
//
// for {
// select {
// case response := <-receiver:
// switch response.Action {
// case "SET":
// nodestring := strings.Split(response.Key, "/")[2]
// node, err := db.NewLocation(nodestring)
// if err != nil {
// log.Fatal(err)
// }
// router, err := db.NewLocation(response.Value)
// if err != nil {
// log.Fatal(err)
// }
// service.NodeMapMutex.Lock()
// service.NodeMap[*node] = *router
// service.NodeMapMutex.Unlock()
// case "DELETE":
// nodestring := strings.Split(response.Key, "/")[2]
// node, err := db.NewLocation(nodestring)
// if err != nil {
// log.Fatal(err)
// }
// service.NodeMapMutex.Lock()
// delete(service.NodeMap, *node)
// service.NodeMapMutex.Unlock()
// default:
// log.Println("unhandled etcd message", response)
// }
// //log.Println(response.Action, response.Key, response.Value)
// log.Println(service.NodeMap)
// case <-exit:
// log.Println("cleaning up watchetcd service thing.")
// time.Sleep(time.Second/2)
// log.Println("done!")
// done <- 1
// }
// }
//}
func (service *Service) MetaWatcher() {
namespace := "/pilosa/0"
log.Println(namespace + "/db")
resp, err := service.Etcd.Get(namespace + "/db", false, true)
if err != nil {
log.Fatal(err)
}
cluster := db.NewCluster()
for _, database_ref := range resp.Node.Nodes {
database_name := database_ref.Key[len(namespace)+4:]
database := cluster.AddDatabase(database_name)
for _, database_attr_ref := range database_ref.Nodes {
key := database_attr_ref.Key[len(database_ref.Key)+1:]
if key == "frame" {
for _, frame_ref := range database_attr_ref.Nodes {
frame_name := frame_ref.Key[len(database_attr_ref.Key)+1:]
frame := database.AddFrame(frame_name)
for _, frame_attr_ref := range frame_ref.Nodes {
key = frame_attr_ref.Key[len(frame_ref.Key)+1:]
if key == "slice" {
for _, slice_ref := range frame_attr_ref.Nodes {
slice_name := slice_ref.Key[len(frame_attr_ref.Key)+1:]
slice_id, err := strconv.Atoi(slice_name)
if err != nil {
log.Fatal(err)
}
slice := database.AddSlice(slice_id)
for _, slice_attr_ref := range slice_ref.Nodes {
key = slice_attr_ref.Key[len(slice_ref.Key)+1:]
if key == "fragment" {
for _, fragment_ref := range slice_attr_ref.Nodes {
/*
fragment_name := fragment_ref.Key[len(slice_attr_ref.Key)+1:]
fragment_id, err := strconv.Atoi(fragment_name)
if err != nil {
log.Fatal(err)
}
*/
for _, fragment_attr_ref := range fragment_ref.Nodes {
key = fragment_attr_ref.Key[len(fragment_ref.Key)+1:]
if key == "node" {
uuid, err := uuid.ParseHex(fragment_attr_ref.Value)
if err != nil {
log.Fatal(err)
}
process := uuid
database.AddFragment(frame, slice, process)
}
}
}
}
}
}
}
}
}
}
}
}
database, _ := cluster.GetDatabase("main")
spew.Dump(database)
database.OldGetFragment(db.Bitmap{1200, "general"}, 1)
receiver := make(chan *etcd.Response)
stop := make(chan bool)
go func() {
_, _ = service.Etcd.Watch(namespace + "/db", 0, true, receiver, stop)
}()
go func() {
for x := range receiver {
spew.Dump(x)
}
}()
}