mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-15 16:51:03 +00:00
166 lines
4.6 KiB
Go
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)
|
|
}
|
|
}()
|
|
}
|