consul: reduce the scope of various transactions

This commit is contained in:
Armon Dadgar 2014-02-04 19:01:32 -08:00
parent 7326a74e65
commit 3897a23db2

View File

@ -240,7 +240,8 @@ func (s *StateStore) Nodes() (uint64, structs.Nodes) {
// EnsureService is used to ensure a given node exposes a service // EnsureService is used to ensure a given node exposes a service
func (s *StateStore) EnsureService(index uint64, node string, ns *structs.NodeService) error { func (s *StateStore) EnsureService(index uint64, node string, ns *structs.NodeService) error {
tx, err := s.tables.StartTxn(false) tables := MDBTables{s.nodeTable, s.serviceTable}
tx, err := tables.StartTxn(false)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
@ -277,23 +278,24 @@ func (s *StateStore) EnsureService(index uint64, node string, ns *structs.NodeSe
// NodeServices is used to return all the services of a given node // NodeServices is used to return all the services of a given node
func (s *StateStore) NodeServices(name string) (uint64, *structs.NodeServices) { func (s *StateStore) NodeServices(name string) (uint64, *structs.NodeServices) {
tx, err := s.tables.StartTxn(true) tables := MDBTables{s.nodeTable, s.serviceTable}
tx, err := tables.StartTxn(true)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
defer tx.Abort() defer tx.Abort()
return s.parseNodeServices(tx, name) return s.parseNodeServices(tables, tx, name)
} }
// parseNodeServices is used to get the services belonging to a // parseNodeServices is used to get the services belonging to a
// node, using a given txn // node, using a given txn
func (s *StateStore) parseNodeServices(tx *MDBTxn, name string) (uint64, *structs.NodeServices) { func (s *StateStore) parseNodeServices(tables MDBTables, tx *MDBTxn, name string) (uint64, *structs.NodeServices) {
ns := &structs.NodeServices{ ns := &structs.NodeServices{
Services: make(map[string]*structs.NodeService), Services: make(map[string]*structs.NodeService),
} }
// Get the maximum index // Get the maximum index
index, err := s.tables.LastIndexTxn(tx) index, err := tables.LastIndexTxn(tx)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to get last index: %v", err)) panic(fmt.Errorf("Failed to get last index: %v", err))
} }
@ -333,7 +335,8 @@ func (s *StateStore) parseNodeServices(tx *MDBTxn, name string) (uint64, *struct
// DeleteNodeService is used to delete a node service // DeleteNodeService is used to delete a node service
func (s *StateStore) DeleteNodeService(index uint64, node, id string) error { func (s *StateStore) DeleteNodeService(index uint64, node, id string) error {
tx, err := s.tables.StartTxn(false) tables := MDBTables{s.serviceTable, s.checkTable}
tx, err := tables.StartTxn(false)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
@ -360,7 +363,8 @@ func (s *StateStore) DeleteNodeService(index uint64, node, id string) error {
// DeleteNode is used to delete a node and all it's services // DeleteNode is used to delete a node and all it's services
func (s *StateStore) DeleteNode(index uint64, node string) error { func (s *StateStore) DeleteNode(index uint64, node string) error {
tx, err := s.tables.StartTxn(false) tables := MDBTables{s.nodeTable, s.serviceTable, s.checkTable}
tx, err := tables.StartTxn(false)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
@ -416,13 +420,14 @@ func (s *StateStore) Services() (uint64, map[string][]string) {
// ServiceNodes returns the nodes associated with a given service // ServiceNodes returns the nodes associated with a given service
func (s *StateStore) ServiceNodes(service string) (uint64, structs.ServiceNodes) { func (s *StateStore) ServiceNodes(service string) (uint64, structs.ServiceNodes) {
tx, err := s.tables.StartTxn(true) tables := MDBTables{s.nodeTable, s.serviceTable}
tx, err := tables.StartTxn(true)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
defer tx.Abort() defer tx.Abort()
idx, err := s.tables.LastIndexTxn(tx) idx, err := tables.LastIndexTxn(tx)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to get last index: %v", err)) panic(fmt.Errorf("Failed to get last index: %v", err))
} }
@ -433,13 +438,14 @@ func (s *StateStore) ServiceNodes(service string) (uint64, structs.ServiceNodes)
// ServiceTagNodes returns the nodes associated with a given service matching a tag // ServiceTagNodes returns the nodes associated with a given service matching a tag
func (s *StateStore) ServiceTagNodes(service, tag string) (uint64, structs.ServiceNodes) { func (s *StateStore) ServiceTagNodes(service, tag string) (uint64, structs.ServiceNodes) {
tx, err := s.tables.StartTxn(true) tables := MDBTables{s.nodeTable, s.serviceTable}
tx, err := tables.StartTxn(true)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
defer tx.Abort() defer tx.Abort()
idx, err := s.tables.LastIndexTxn(tx) idx, err := tables.LastIndexTxn(tx)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to get last index: %v", err)) panic(fmt.Errorf("Failed to get last index: %v", err))
} }
@ -479,7 +485,8 @@ func (s *StateStore) EnsureCheck(index uint64, check *structs.HealthCheck) error
} }
// Start the txn // Start the txn
tx, err := s.tables.StartTxn(false) tables := MDBTables{s.nodeTable, s.serviceTable, s.checkTable}
tx, err := tables.StartTxn(false)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
@ -569,13 +576,14 @@ func parseHealthChecks(idx uint64, res []interface{}, err error) (uint64, struct
// CheckServiceNodes returns the nodes associated with a given service, along // CheckServiceNodes returns the nodes associated with a given service, along
// with any associated check // with any associated check
func (s *StateStore) CheckServiceNodes(service string) (uint64, structs.CheckServiceNodes) { func (s *StateStore) CheckServiceNodes(service string) (uint64, structs.CheckServiceNodes) {
tx, err := s.tables.StartTxn(true) tables := MDBTables{s.nodeTable, s.serviceTable, s.checkTable}
tx, err := tables.StartTxn(true)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
defer tx.Abort() defer tx.Abort()
idx, err := s.tables.LastIndexTxn(tx) idx, err := tables.LastIndexTxn(tx)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to get last index: %v", err)) panic(fmt.Errorf("Failed to get last index: %v", err))
} }
@ -587,13 +595,14 @@ func (s *StateStore) CheckServiceNodes(service string) (uint64, structs.CheckSer
// CheckServiceNodes returns the nodes associated with a given service, along // CheckServiceNodes returns the nodes associated with a given service, along
// with any associated checks // with any associated checks
func (s *StateStore) CheckServiceTagNodes(service, tag string) (uint64, structs.CheckServiceNodes) { func (s *StateStore) CheckServiceTagNodes(service, tag string) (uint64, structs.CheckServiceNodes) {
tx, err := s.tables.StartTxn(true) tables := MDBTables{s.nodeTable, s.serviceTable, s.checkTable}
tx, err := tables.StartTxn(true)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to start txn: %v", err)) panic(fmt.Errorf("Failed to start txn: %v", err))
} }
defer tx.Abort() defer tx.Abort()
idx, err := s.tables.LastIndexTxn(tx) idx, err := tables.LastIndexTxn(tx)
if err != nil { if err != nil {
panic(fmt.Errorf("Failed to get last index: %v", err)) panic(fmt.Errorf("Failed to get last index: %v", err))
} }
@ -686,7 +695,7 @@ func (s *StateSnapshot) Nodes() structs.Nodes {
// NodeServices is used to return all the services of a given node // NodeServices is used to return all the services of a given node
func (s *StateSnapshot) NodeServices(name string) *structs.NodeServices { func (s *StateSnapshot) NodeServices(name string) *structs.NodeServices {
_, res := s.store.parseNodeServices(s.tx, name) _, res := s.store.parseNodeServices(s.store.tables, s.tx, name)
return res return res
} }