mirror of
https://github.com/status-im/consul.git
synced 2025-01-22 03:29:43 +00:00
Changing how state store is opened to allow shared connections
This commit is contained in:
parent
fd831ade43
commit
b7beda2a63
@ -5,8 +5,13 @@ import (
|
||||
"fmt"
|
||||
"github.com/hashicorp/consul/rpc"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
// nextDBIndex is used to generate a new ID
|
||||
// using sync/atomic to ensure it is safe
|
||||
var nextDBIndex uint32 = 0
|
||||
|
||||
type namedQuery uint8
|
||||
|
||||
const (
|
||||
@ -37,8 +42,12 @@ type StateStore struct {
|
||||
|
||||
// NewStateStore is used to create a new state store
|
||||
func NewStateStore() (*StateStore, error) {
|
||||
// Get the DB ID
|
||||
id := atomic.AddUint32(&nextDBIndex, 1)
|
||||
path := fmt.Sprintf("file:StateStore-%d?mode=memory&cache=shared", id)
|
||||
|
||||
// Open the db
|
||||
db, err := sql.Open("sqlite3", ":memory:")
|
||||
db, err := sql.Open("sqlite3", path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open db: %v", err)
|
||||
}
|
||||
@ -161,11 +170,14 @@ func (s *StateStore) GetNode(name string) (bool, string) {
|
||||
// the node name and address
|
||||
func (s *StateStore) Nodes() []string {
|
||||
stmt := s.prepared[queryNodes]
|
||||
rows, err := stmt.Query()
|
||||
return parseNodes(stmt.Query())
|
||||
}
|
||||
|
||||
// parseNodes parses the result of a queryNodes statement
|
||||
func parseNodes(rows *sql.Rows, err error) []string {
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("Failed to get nodes: %v", err))
|
||||
}
|
||||
|
||||
data := make([]string, 0, 32)
|
||||
var name, address string
|
||||
for rows.Next() {
|
||||
@ -186,7 +198,11 @@ func (s *StateStore) EnsureService(name, service, tag string, port int) error {
|
||||
// NodeServices is used to return all the services of a given node
|
||||
func (s *StateStore) NodeServices(name string) rpc.NodeServices {
|
||||
stmt := s.prepared[queryNodeServices]
|
||||
rows, err := stmt.Query(name)
|
||||
return parseNodeServices(stmt.Query(name))
|
||||
}
|
||||
|
||||
// parseNodeServices is used to parse the results of a queryNodeServices
|
||||
func parseNodeServices(rows *sql.Rows, err error) rpc.NodeServices {
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("Failed to get node services: %v", err))
|
||||
}
|
||||
@ -200,7 +216,6 @@ func (s *StateStore) NodeServices(name string) rpc.NodeServices {
|
||||
}
|
||||
services[service] = entry
|
||||
}
|
||||
|
||||
return services
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user