2014-12-06 01:02:30 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strconv"
|
2014-12-16 07:03:09 +00:00
|
|
|
"strings"
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
"github.com/influxdb/influxdb"
|
|
|
|
"github.com/influxdb/influxdb/messaging"
|
|
|
|
)
|
|
|
|
|
|
|
|
// execRun runs the "run" command.
|
|
|
|
func execRun(args []string) {
|
|
|
|
// Parse command flags.
|
|
|
|
fs := flag.NewFlagSet("", flag.ExitOnError)
|
|
|
|
var (
|
2014-12-16 07:03:09 +00:00
|
|
|
configPath = fs.String("config", configDefaultPath, "")
|
|
|
|
pidPath = fs.String("pidfile", "", "")
|
|
|
|
hostname = fs.String("hostname", "", "")
|
|
|
|
seedServers = fs.String("seed-servers", "", "")
|
2014-12-06 01:02:30 +00:00
|
|
|
)
|
|
|
|
fs.Usage = printRunUsage
|
|
|
|
fs.Parse(args)
|
|
|
|
|
|
|
|
// Write pid file.
|
|
|
|
if *pidPath != "" {
|
|
|
|
pid := strconv.Itoa(os.Getpid())
|
|
|
|
if err := ioutil.WriteFile(*pidPath, []byte(pid), 0644); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse configuration.
|
|
|
|
config, err := ParseConfigFile(*configPath)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("config: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Override config properties.
|
|
|
|
if *hostname != "" {
|
|
|
|
config.Hostname = *hostname
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO(benbjohnson): Start admin server.
|
|
|
|
|
|
|
|
log.Print(logo)
|
|
|
|
if config.BindAddress == "" {
|
|
|
|
log.Printf("Starting Influx Server %s...", version)
|
|
|
|
} else {
|
|
|
|
log.Printf("Starting Influx Server %s bound to %s...", version, config.BindAddress)
|
|
|
|
}
|
|
|
|
|
2014-12-11 21:46:14 +00:00
|
|
|
// Start up the node.
|
|
|
|
var brokerHandler *messaging.Handler
|
|
|
|
var serverHandler *influxdb.Handler
|
2014-12-16 03:35:26 +00:00
|
|
|
var brokerDirExists bool
|
|
|
|
var storageDirExists bool
|
2014-12-11 21:46:14 +00:00
|
|
|
|
2014-12-16 03:35:26 +00:00
|
|
|
if _, err := os.Stat(config.Raft.Dir); err == nil {
|
|
|
|
brokerDirExists = true
|
|
|
|
}
|
|
|
|
if _, err := os.Stat(config.Storage.Dir); err == nil {
|
|
|
|
storageDirExists = true
|
|
|
|
}
|
|
|
|
|
|
|
|
if !brokerDirExists && !storageDirExists {
|
|
|
|
// Node is completely new, so create the minimum needed, which
|
|
|
|
// is a storage directory.
|
|
|
|
if err := os.MkdirAll(config.Storage.Dir, 0744); err != nil {
|
|
|
|
log.Fatal(err)
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|
2014-12-16 05:55:57 +00:00
|
|
|
storageDirExists = true
|
2014-12-16 03:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// If the Broker directory exists, open a Broker on this node.
|
|
|
|
if brokerDirExists {
|
|
|
|
b := messaging.NewBroker()
|
|
|
|
if err := b.Open(config.Raft.Dir); err != nil {
|
|
|
|
log.Fatalf("failed to open Broker", err.Error())
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|
2014-12-16 03:35:26 +00:00
|
|
|
brokerHandler = messaging.NewHandler(b)
|
|
|
|
}
|
2014-12-11 21:46:14 +00:00
|
|
|
|
2014-12-16 03:35:26 +00:00
|
|
|
// If the storage directory exists, open a Data node.
|
|
|
|
if storageDirExists {
|
|
|
|
var client influxdb.MessagingClient
|
|
|
|
var server *influxdb.Server
|
2014-12-16 21:24:21 +00:00
|
|
|
|
|
|
|
clientFilePath := filepath.Join(config.Storage.Dir, messagingClientFile)
|
|
|
|
|
|
|
|
if _, err := os.Stat(clientFilePath); err == nil {
|
2014-12-16 07:03:09 +00:00
|
|
|
var brokerURLs []*url.URL
|
|
|
|
for _, s := range strings.Split(*seedServers, ",") {
|
|
|
|
u, err := url.Parse(s)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("seed server", err)
|
|
|
|
}
|
|
|
|
brokerURLs = append(brokerURLs, u)
|
|
|
|
}
|
|
|
|
|
2014-12-06 01:02:30 +00:00
|
|
|
c := messaging.NewClient("XXX-CHANGEME-XXX")
|
2014-12-16 21:24:21 +00:00
|
|
|
if err := c.Open(clientFilePath, brokerURLs); err != nil {
|
2014-12-06 01:02:30 +00:00
|
|
|
log.Fatalf("Error opening Messaging Client: %s", err.Error())
|
|
|
|
}
|
|
|
|
defer c.Close()
|
|
|
|
client = c
|
|
|
|
log.Printf("Cluster messaging client created")
|
2014-12-16 21:24:21 +00:00
|
|
|
} else {
|
|
|
|
client = messaging.NewLoopbackClient()
|
|
|
|
log.Printf("Local messaging client created")
|
2014-12-16 03:35:26 +00:00
|
|
|
}
|
2014-12-06 01:02:30 +00:00
|
|
|
|
2014-12-16 03:35:26 +00:00
|
|
|
server = influxdb.NewServer(client)
|
|
|
|
err = server.Open(config.Storage.Dir)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to open data Server", err.Error())
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|
2014-12-16 03:35:26 +00:00
|
|
|
serverHandler = influxdb.NewHandler(server)
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: startProfiler()
|
|
|
|
// TODO: -reset-root
|
|
|
|
|
2014-12-16 06:05:01 +00:00
|
|
|
// Start up HTTP server(s)
|
|
|
|
if config.ApiHTTPListenAddr() != config.RaftListenAddr() {
|
|
|
|
if serverHandler != nil {
|
|
|
|
func() { log.Fatal(http.ListenAndServe(config.ApiHTTPListenAddr(), serverHandler)) }()
|
|
|
|
}
|
|
|
|
if brokerHandler != nil {
|
|
|
|
func() { log.Fatal(http.ListenAndServe(config.RaftListenAddr(), brokerHandler)) }()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
h := NewHandler(brokerHandler, serverHandler)
|
|
|
|
func() { log.Fatal(http.ListenAndServe(config.ApiHTTPListenAddr(), h)) }()
|
|
|
|
}
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
// Wait indefinitely.
|
|
|
|
<-(chan struct{})(nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func printRunUsage() {
|
2014-12-11 21:49:42 +00:00
|
|
|
log.Printf(`usage: run [flags]
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
run starts the node with any existing cluster configuration. If no cluster configuration is
|
2014-12-16 07:03:09 +00:00
|
|
|
found, then the node runs in "local" mode. "Local" mode is a single-node mode that does not
|
|
|
|
use Distributed Consensus, but is otherwise fully-functional.
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
-config <path>
|
2014-12-11 21:49:42 +00:00
|
|
|
Set the path to the configuration file. Defaults to %s.
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
-hostname <name>
|
|
|
|
Override the hostname, the 'hostname' configuration option will be overridden.
|
|
|
|
|
2014-12-16 07:03:09 +00:00
|
|
|
-seedservers <servers>
|
|
|
|
If joining a cluster, overrides any previously configured or discovered
|
|
|
|
Data node seed servers.
|
|
|
|
|
2014-12-06 01:02:30 +00:00
|
|
|
-pidfile <path>
|
|
|
|
Write process ID to a file.
|
2014-12-16 07:03:09 +00:00
|
|
|
`, configDefaultPath)
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|