Handle return value from txn.Commit
This commit is contained in:
parent
50db8f409a
commit
78c76f0773
|
@ -202,7 +202,9 @@ func (c *FSM) Restore(old io.ReadCloser) error {
|
||||||
return fmt.Errorf("Unrecognized msg type %d", msg)
|
return fmt.Errorf("Unrecognized msg type %d", msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
restore.Commit()
|
if err := restore.Commit(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// External code might be calling State(), so we need to synchronize
|
// External code might be calling State(), so we need to synchronize
|
||||||
// here to make sure we swap in the new state store atomically.
|
// here to make sure we swap in the new state store atomically.
|
||||||
|
|
|
@ -310,8 +310,7 @@ func (s *Store) ACLBootstrap(idx, resetIndex uint64, token *structs.ACLToken, le
|
||||||
if err := tx.Insert("index", &IndexEntry{"acl-token-bootstrap", idx}); err != nil {
|
if err := tx.Insert("index", &IndexEntry{"acl-token-bootstrap", idx}); err != nil {
|
||||||
return fmt.Errorf("failed to mark ACL bootstrapping as complete: %v", err)
|
return fmt.Errorf("failed to mark ACL bootstrapping as complete: %v", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanBootstrapACLToken checks if bootstrapping is possible and returns the reset index
|
// CanBootstrapACLToken checks if bootstrapping is possible and returns the reset index
|
||||||
|
@ -636,8 +635,7 @@ func (s *Store) ACLTokenSet(idx uint64, token *structs.ACLToken, legacy bool) er
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ACLTokenBatchSet(idx uint64, tokens structs.ACLTokens, cas, allowMissingPolicyAndRoleIDs, prohibitUnprivileged bool) error {
|
func (s *Store) ACLTokenBatchSet(idx uint64, tokens structs.ACLTokens, cas, allowMissingPolicyAndRoleIDs, prohibitUnprivileged bool) error {
|
||||||
|
@ -650,8 +648,7 @@ func (s *Store) ACLTokenBatchSet(idx uint64, tokens structs.ACLTokens, cas, allo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// aclTokenSetTxn is the inner method used to insert an ACL token with the
|
// aclTokenSetTxn is the inner method used to insert an ACL token with the
|
||||||
|
@ -1030,8 +1027,7 @@ func (s *Store) ACLTokenBatchDelete(idx uint64, tokenIDs []string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclTokenDelete(idx uint64, value, index string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclTokenDelete(idx uint64, value, index string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1042,8 +1038,7 @@ func (s *Store) aclTokenDelete(idx uint64, value, index string, entMeta *structs
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclTokenDeleteTxn(tx *txnWrapper, idx uint64, value, index string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclTokenDeleteTxn(tx *txnWrapper, idx uint64, value, index string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1099,8 +1094,7 @@ func (s *Store) ACLPolicyBatchSet(idx uint64, policies structs.ACLPolicies) erro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ACLPolicySet(idx uint64, policy *structs.ACLPolicy) error {
|
func (s *Store) ACLPolicySet(idx uint64, policy *structs.ACLPolicy) error {
|
||||||
|
@ -1111,8 +1105,7 @@ func (s *Store) ACLPolicySet(idx uint64, policy *structs.ACLPolicy) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclPolicySetTxn(tx *txnWrapper, idx uint64, policy *structs.ACLPolicy) error {
|
func (s *Store) aclPolicySetTxn(tx *txnWrapper, idx uint64, policy *structs.ACLPolicy) error {
|
||||||
|
@ -1277,8 +1270,7 @@ func (s *Store) ACLPolicyBatchDelete(idx uint64, policyIDs []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclPolicyDelete(idx uint64, value string, fn aclPolicyGetFn, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclPolicyDelete(idx uint64, value string, fn aclPolicyGetFn, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1289,8 +1281,7 @@ func (s *Store) aclPolicyDelete(idx uint64, value string, fn aclPolicyGetFn, ent
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclPolicyDeleteTxn(tx *txnWrapper, idx uint64, value string, fn aclPolicyGetFn, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclPolicyDeleteTxn(tx *txnWrapper, idx uint64, value string, fn aclPolicyGetFn, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1323,8 +1314,7 @@ func (s *Store) ACLRoleBatchSet(idx uint64, roles structs.ACLRoles, allowMissing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ACLRoleSet(idx uint64, role *structs.ACLRole) error {
|
func (s *Store) ACLRoleSet(idx uint64, role *structs.ACLRole) error {
|
||||||
|
@ -1335,8 +1325,7 @@ func (s *Store) ACLRoleSet(idx uint64, role *structs.ACLRole) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclRoleSetTxn(tx *txnWrapper, idx uint64, role *structs.ACLRole, allowMissing bool) error {
|
func (s *Store) aclRoleSetTxn(tx *txnWrapper, idx uint64, role *structs.ACLRole, allowMissing bool) error {
|
||||||
|
@ -1518,8 +1507,7 @@ func (s *Store) ACLRoleBatchDelete(idx uint64, roleIDs []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclRoleDelete(idx uint64, value string, fn aclRoleGetFn, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclRoleDelete(idx uint64, value string, fn aclRoleGetFn, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1530,8 +1518,7 @@ func (s *Store) aclRoleDelete(idx uint64, value string, fn aclRoleGetFn, entMeta
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclRoleDeleteTxn(tx *txnWrapper, idx uint64, value string, fn aclRoleGetFn, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclRoleDeleteTxn(tx *txnWrapper, idx uint64, value string, fn aclRoleGetFn, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1560,8 +1547,7 @@ func (s *Store) ACLBindingRuleBatchSet(idx uint64, rules structs.ACLBindingRules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ACLBindingRuleSet(idx uint64, rule *structs.ACLBindingRule) error {
|
func (s *Store) ACLBindingRuleSet(idx uint64, rule *structs.ACLBindingRule) error {
|
||||||
|
@ -1571,8 +1557,7 @@ func (s *Store) ACLBindingRuleSet(idx uint64, rule *structs.ACLBindingRule) erro
|
||||||
if err := s.aclBindingRuleSetTxn(tx, idx, rule); err != nil {
|
if err := s.aclBindingRuleSetTxn(tx, idx, rule); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclBindingRuleSetTxn(tx *txnWrapper, idx uint64, rule *structs.ACLBindingRule) error {
|
func (s *Store) aclBindingRuleSetTxn(tx *txnWrapper, idx uint64, rule *structs.ACLBindingRule) error {
|
||||||
|
@ -1677,8 +1662,7 @@ func (s *Store) ACLBindingRuleBatchDelete(idx uint64, bindingRuleIDs []string) e
|
||||||
for _, bindingRuleID := range bindingRuleIDs {
|
for _, bindingRuleID := range bindingRuleIDs {
|
||||||
s.aclBindingRuleDeleteTxn(tx, idx, bindingRuleID, nil)
|
s.aclBindingRuleDeleteTxn(tx, idx, bindingRuleID, nil)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclBindingRuleDelete(idx uint64, id string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclBindingRuleDelete(idx uint64, id string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1689,8 +1673,7 @@ func (s *Store) aclBindingRuleDelete(idx uint64, id string, entMeta *structs.Ent
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclBindingRuleDeleteTxn(tx *txnWrapper, idx uint64, id string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclBindingRuleDeleteTxn(tx *txnWrapper, idx uint64, id string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1748,8 +1731,7 @@ func (s *Store) ACLAuthMethodBatchSet(idx uint64, methods structs.ACLAuthMethods
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ACLAuthMethodSet(idx uint64, method *structs.ACLAuthMethod) error {
|
func (s *Store) ACLAuthMethodSet(idx uint64, method *structs.ACLAuthMethod) error {
|
||||||
|
@ -1760,8 +1742,7 @@ func (s *Store) ACLAuthMethodSet(idx uint64, method *structs.ACLAuthMethod) erro
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclAuthMethodSetTxn(tx *txnWrapper, idx uint64, method *structs.ACLAuthMethod) error {
|
func (s *Store) aclAuthMethodSetTxn(tx *txnWrapper, idx uint64, method *structs.ACLAuthMethod) error {
|
||||||
|
@ -1865,8 +1846,7 @@ func (s *Store) ACLAuthMethodBatchDelete(idx uint64, names []string, entMeta *st
|
||||||
s.aclAuthMethodDeleteTxn(tx, idx, name, entMeta)
|
s.aclAuthMethodDeleteTxn(tx, idx, name, entMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclAuthMethodDelete(idx uint64, name string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclAuthMethodDelete(idx uint64, name string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -1877,8 +1857,7 @@ func (s *Store) aclAuthMethodDelete(idx uint64, name string, entMeta *structs.En
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) aclAuthMethodDeleteTxn(tx *txnWrapper, idx uint64, name string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) aclAuthMethodDeleteTxn(tx *txnWrapper, idx uint64, name string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
|
|
@ -81,8 +81,7 @@ func (s *Store) AutopilotSetConfig(idx uint64, config *autopilot.Config) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AutopilotCASConfig is used to try updating the Autopilot configuration with a
|
// AutopilotCASConfig is used to try updating the Autopilot configuration with a
|
||||||
|
@ -110,8 +109,8 @@ func (s *Store) AutopilotCASConfig(idx, cidx uint64, config *autopilot.Config) (
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) autopilotSetConfigTxn(idx uint64, tx *txnWrapper, config *autopilot.Config) error {
|
func (s *Store) autopilotSetConfigTxn(idx uint64, tx *txnWrapper, config *autopilot.Config) error {
|
||||||
|
|
|
@ -233,8 +233,7 @@ func (s *Store) EnsureRegistration(idx uint64, req *structs.RegisterRequest) err
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) ensureCheckIfNodeMatches(tx *txnWrapper, idx uint64, node string, check *structs.HealthCheck) error {
|
func (s *Store) ensureCheckIfNodeMatches(tx *txnWrapper, idx uint64, node string, check *structs.HealthCheck) error {
|
||||||
|
@ -324,8 +323,7 @@ func (s *Store) EnsureNode(idx uint64, node *structs.Node) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensureNoNodeWithSimilarNameTxn checks that no other node has conflict in its name
|
// ensureNoNodeWithSimilarNameTxn checks that no other node has conflict in its name
|
||||||
|
@ -599,8 +597,7 @@ func (s *Store) DeleteNode(idx uint64, nodeName string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteNodeCASTxn is used to try doing a node delete operation with a given
|
// deleteNodeCASTxn is used to try doing a node delete operation with a given
|
||||||
|
@ -733,8 +730,7 @@ func (s *Store) EnsureService(idx uint64, node string, svc *structs.NodeService)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var errCASCompareFailed = errors.New("compare-and-set: comparison failed")
|
var errCASCompareFailed = errors.New("compare-and-set: comparison failed")
|
||||||
|
@ -1403,8 +1399,7 @@ func (s *Store) DeleteService(idx uint64, nodeName, serviceID string, entMeta *s
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteServiceCASTxn is used to try doing a service delete operation with a given
|
// deleteServiceCASTxn is used to try doing a service delete operation with a given
|
||||||
|
@ -1541,8 +1536,7 @@ func (s *Store) EnsureCheck(idx uint64, hc *structs.HealthCheck) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateAllServiceIndexesOfNode updates the Raft index of all the services associated with this node
|
// updateAllServiceIndexesOfNode updates the Raft index of all the services associated with this node
|
||||||
|
@ -1879,8 +1873,7 @@ func (s *Store) DeleteCheck(idx uint64, node string, checkID types.CheckID, entM
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteCheckCASTxn is used to try doing a check delete operation with a given
|
// deleteCheckCASTxn is used to try doing a check delete operation with a given
|
||||||
|
|
|
@ -4385,7 +4385,7 @@ func TestStateStore_ensureServiceCASTxn(t *testing.T) {
|
||||||
tx := s.db.WriteTxnRestore()
|
tx := s.db.WriteTxnRestore()
|
||||||
err := s.ensureServiceCASTxn(tx, 3, "node1", &ns)
|
err := s.ensureServiceCASTxn(tx, 3, "node1", &ns)
|
||||||
require.Equal(t, err, errCASCompareFailed)
|
require.Equal(t, err, errCASCompareFailed)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
// ensure no update happened
|
// ensure no update happened
|
||||||
tx = s.db.Txn(false)
|
tx = s.db.Txn(false)
|
||||||
|
@ -4393,14 +4393,14 @@ func TestStateStore_ensureServiceCASTxn(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, nsRead)
|
require.NotNil(t, nsRead)
|
||||||
require.Equal(t, uint64(2), nsRead.ModifyIndex)
|
require.Equal(t, uint64(2), nsRead.ModifyIndex)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
ns.ModifyIndex = 99
|
ns.ModifyIndex = 99
|
||||||
// attempt to update with a non-matching index
|
// attempt to update with a non-matching index
|
||||||
tx = s.db.WriteTxnRestore()
|
tx = s.db.WriteTxnRestore()
|
||||||
err = s.ensureServiceCASTxn(tx, 4, "node1", &ns)
|
err = s.ensureServiceCASTxn(tx, 4, "node1", &ns)
|
||||||
require.Equal(t, err, errCASCompareFailed)
|
require.Equal(t, err, errCASCompareFailed)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
// ensure no update happened
|
// ensure no update happened
|
||||||
tx = s.db.Txn(false)
|
tx = s.db.Txn(false)
|
||||||
|
@ -4408,14 +4408,14 @@ func TestStateStore_ensureServiceCASTxn(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, nsRead)
|
require.NotNil(t, nsRead)
|
||||||
require.Equal(t, uint64(2), nsRead.ModifyIndex)
|
require.Equal(t, uint64(2), nsRead.ModifyIndex)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
ns.ModifyIndex = 2
|
ns.ModifyIndex = 2
|
||||||
// update with the matching modify index
|
// update with the matching modify index
|
||||||
tx = s.db.WriteTxnRestore()
|
tx = s.db.WriteTxnRestore()
|
||||||
err = s.ensureServiceCASTxn(tx, 7, "node1", &ns)
|
err = s.ensureServiceCASTxn(tx, 7, "node1", &ns)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
// ensure the update happened
|
// ensure the update happened
|
||||||
tx = s.db.Txn(false)
|
tx = s.db.Txn(false)
|
||||||
|
@ -4423,7 +4423,7 @@ func TestStateStore_ensureServiceCASTxn(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, nsRead)
|
require.NotNil(t, nsRead)
|
||||||
require.Equal(t, uint64(7), nsRead.ModifyIndex)
|
require.Equal(t, uint64(7), nsRead.ModifyIndex)
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStateStore_GatewayServices_Terminating(t *testing.T) {
|
func TestStateStore_GatewayServices_Terminating(t *testing.T) {
|
||||||
|
|
|
@ -174,8 +174,7 @@ func (s *Store) EnsureConfigEntry(idx uint64, conf structs.ConfigEntry, entMeta
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensureConfigEntryTxn upserts a config entry inside of a transaction.
|
// ensureConfigEntryTxn upserts a config entry inside of a transaction.
|
||||||
|
@ -246,8 +245,8 @@ func (s *Store) EnsureConfigEntryCAS(idx, cidx uint64, conf structs.ConfigEntry,
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) DeleteConfigEntry(idx uint64, kind, name string, entMeta *structs.EnterpriseMeta) error {
|
func (s *Store) DeleteConfigEntry(idx uint64, kind, name string, entMeta *structs.EnterpriseMeta) error {
|
||||||
|
@ -294,8 +293,7 @@ func (s *Store) DeleteConfigEntry(idx uint64, kind, name string, entMeta *struct
|
||||||
return fmt.Errorf("failed updating index: %s", err)
|
return fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) insertConfigEntryWithTxn(tx *txnWrapper, idx uint64, conf structs.ConfigEntry) error {
|
func (s *Store) insertConfigEntryWithTxn(tx *txnWrapper, idx uint64, conf structs.ConfigEntry) error {
|
||||||
|
|
|
@ -142,8 +142,7 @@ func (s *Store) CASetConfig(idx uint64, config *structs.CAConfiguration) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CACheckAndSetConfig is used to try updating the CA configuration with a
|
// CACheckAndSetConfig is used to try updating the CA configuration with a
|
||||||
|
@ -171,8 +170,8 @@ func (s *Store) CACheckAndSetConfig(idx, cidx uint64, config *structs.CAConfigur
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) caSetConfigTxn(idx uint64, tx *txnWrapper, config *structs.CAConfiguration) error {
|
func (s *Store) caSetConfigTxn(idx uint64, tx *txnWrapper, config *structs.CAConfiguration) error {
|
||||||
|
@ -336,8 +335,8 @@ func (s *Store) CARootSetCAS(idx, cidx uint64, rs []*structs.CARoot) (bool, erro
|
||||||
return false, fmt.Errorf("failed updating index: %s", err)
|
return false, fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CAProviderState is used to pull the built-in provider states from the snapshot.
|
// CAProviderState is used to pull the built-in provider states from the snapshot.
|
||||||
|
@ -417,9 +416,8 @@ func (s *Store) CASetProviderState(idx uint64, state *structs.CAConsulProviderSt
|
||||||
return false, fmt.Errorf("failed updating index: %s", err)
|
return false, fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
|
return err == nil, err
|
||||||
return true, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CADeleteProviderState is used to remove the built-in Consul CA provider
|
// CADeleteProviderState is used to remove the built-in Consul CA provider
|
||||||
|
@ -447,9 +445,7 @@ func (s *Store) CADeleteProviderState(idx uint64, id string) error {
|
||||||
return fmt.Errorf("failed updating index: %s", err)
|
return fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) CALeafSetIndex(idx uint64, index uint64) error {
|
func (s *Store) CALeafSetIndex(idx uint64, index uint64) error {
|
||||||
|
@ -504,7 +500,6 @@ func (s *Store) CAIncrementProviderSerialNumber(idx uint64) (uint64, error) {
|
||||||
return 0, fmt.Errorf("failed updating index: %s", err)
|
return 0, fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
|
return next, err
|
||||||
return next, nil
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,6 +167,5 @@ func (s *Store) CoordinateBatchUpdate(idx uint64, updates structs.Coordinates) e
|
||||||
return fmt.Errorf("failed updating index: %s", err)
|
return fmt.Errorf("failed updating index: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ func TestStateStore_Coordinate_Snapshot_Restore(t *testing.T) {
|
||||||
if err := tx.Insert("coordinates", badUpdate); err != nil {
|
if err := tx.Insert("coordinates", badUpdate); err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
// Snapshot the coordinates.
|
// Snapshot the coordinates.
|
||||||
snap := s.Snapshot()
|
snap := s.Snapshot()
|
||||||
|
|
|
@ -68,8 +68,7 @@ func (s *Store) FederationStateBatchSet(idx uint64, configs structs.FederationSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FederationStateSet is called to do an upsert of a given federation state.
|
// FederationStateSet is called to do an upsert of a given federation state.
|
||||||
|
@ -81,8 +80,7 @@ func (s *Store) FederationStateSet(idx uint64, config *structs.FederationState)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// federationStateSetTxn upserts a federation state inside of a transaction.
|
// federationStateSetTxn upserts a federation state inside of a transaction.
|
||||||
|
@ -191,8 +189,7 @@ func (s *Store) FederationStateDelete(idx uint64, datacenter string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) FederationStateBatchDelete(idx uint64, datacenters []string) error {
|
func (s *Store) FederationStateBatchDelete(idx uint64, datacenters []string) error {
|
||||||
|
@ -205,8 +202,7 @@ func (s *Store) FederationStateBatchDelete(idx uint64, datacenters []string) err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Store) federationStateDeleteTxn(tx *txnWrapper, idx uint64, datacenter string) error {
|
func (s *Store) federationStateDeleteTxn(tx *txnWrapper, idx uint64, datacenter string) error {
|
||||||
|
|
|
@ -3,6 +3,8 @@ package state
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGraveyard_Lifecycle(t *testing.T) {
|
func TestGraveyard_Lifecycle(t *testing.T) {
|
||||||
|
@ -29,7 +31,7 @@ func TestGraveyard_Lifecycle(t *testing.T) {
|
||||||
if err := g.InsertTxn(tx, "some/other/path", 9, nil); err != nil {
|
if err := g.InsertTxn(tx, "some/other/path", 9, nil); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Check some prefixes.
|
// Check some prefixes.
|
||||||
|
@ -68,7 +70,7 @@ func TestGraveyard_Lifecycle(t *testing.T) {
|
||||||
if err := g.ReapTxn(tx, 6); err != nil {
|
if err := g.ReapTxn(tx, 6); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Check prefixes to see that the reap took effect at the right index.
|
// Check prefixes to see that the reap took effect at the right index.
|
||||||
|
@ -142,7 +144,7 @@ func TestGraveyard_GC_Trigger(t *testing.T) {
|
||||||
if err := g.InsertTxn(tx, "foo/in/the/house", 2, nil); err != nil {
|
if err := g.InsertTxn(tx, "foo/in/the/house", 2, nil); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Make sure the GC got hinted.
|
// Make sure the GC got hinted.
|
||||||
|
@ -185,7 +187,7 @@ func TestGraveyard_Snapshot_Restore(t *testing.T) {
|
||||||
if err := g.InsertTxn(tx, "some/other/path", 9, nil); err != nil {
|
if err := g.InsertTxn(tx, "some/other/path", 9, nil); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Verify the index was set correctly.
|
// Verify the index was set correctly.
|
||||||
|
@ -240,7 +242,7 @@ func TestGraveyard_Snapshot_Restore(t *testing.T) {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Verify that the restore works.
|
// Verify that the restore works.
|
||||||
|
|
|
@ -164,8 +164,7 @@ func (s *Store) IntentionSet(idx uint64, ixn *structs.Intention) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// intentionSetTxn is the inner method used to insert an intention with
|
// intentionSetTxn is the inner method used to insert an intention with
|
||||||
|
@ -260,8 +259,7 @@ func (s *Store) IntentionDelete(idx uint64, id string) error {
|
||||||
return fmt.Errorf("failed intention delete: %s", err)
|
return fmt.Errorf("failed intention delete: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// intentionDeleteTxn is the inner method used to delete a intention
|
// intentionDeleteTxn is the inner method used to delete a intention
|
||||||
|
|
|
@ -96,8 +96,7 @@ func (s *Store) ReapTombstones(idx uint64, index uint64) error {
|
||||||
return fmt.Errorf("failed to reap kvs tombstones: %s", err)
|
return fmt.Errorf("failed to reap kvs tombstones: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// KVSSet is used to store a key/value pair.
|
// KVSSet is used to store a key/value pair.
|
||||||
|
@ -110,8 +109,7 @@ func (s *Store) KVSSet(idx uint64, entry *structs.DirEntry) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsSetTxn is used to insert or update a key/value pair in the state
|
// kvsSetTxn is used to insert or update a key/value pair in the state
|
||||||
|
@ -249,8 +247,7 @@ func (s *Store) KVSDelete(idx uint64, key string, entMeta *structs.EnterpriseMet
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsDeleteTxn is the inner method used to perform the actual deletion
|
// kvsDeleteTxn is the inner method used to perform the actual deletion
|
||||||
|
@ -286,8 +283,8 @@ func (s *Store) KVSDeleteCAS(idx, cidx uint64, key string, entMeta *structs.Ente
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsDeleteCASTxn is the inner method that does a CAS delete within an existing
|
// kvsDeleteCASTxn is the inner method that does a CAS delete within an existing
|
||||||
|
@ -327,8 +324,8 @@ func (s *Store) KVSSetCAS(idx uint64, entry *structs.DirEntry) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsSetCASTxn is the inner method used to do a CAS inside an existing
|
// kvsSetCASTxn is the inner method used to do a CAS inside an existing
|
||||||
|
@ -371,8 +368,7 @@ func (s *Store) KVSDeleteTree(idx uint64, prefix string, entMeta *structs.Enterp
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// KVSLockDelay returns the expiration time for any lock delay associated with
|
// KVSLockDelay returns the expiration time for any lock delay associated with
|
||||||
|
@ -392,8 +388,8 @@ func (s *Store) KVSLock(idx uint64, entry *structs.DirEntry) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsLockTxn is the inner method that does a lock inside an existing
|
// kvsLockTxn is the inner method that does a lock inside an existing
|
||||||
|
@ -458,8 +454,8 @@ func (s *Store) KVSUnlock(idx uint64, entry *structs.DirEntry) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err = tx.Commit()
|
||||||
return true, nil
|
return err == nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// kvsUnlockTxn is the inner method that does an unlock inside an existing
|
// kvsUnlockTxn is the inner method that does an unlock inside an existing
|
||||||
|
|
|
@ -85,11 +85,9 @@ type txnWrapper struct {
|
||||||
// Note that this function, unlike memdb.Txn, returns an error which must be checked
|
// Note that this function, unlike memdb.Txn, returns an error which must be checked
|
||||||
// by the caller. A non-nil error indicates that a commit failed and was not
|
// by the caller. A non-nil error indicates that a commit failed and was not
|
||||||
// applied.
|
// applied.
|
||||||
// TODO: currently none of the callers check error, should they all be changed?
|
|
||||||
func (tx *txnWrapper) Commit() error {
|
func (tx *txnWrapper) Commit() error {
|
||||||
// changes may be empty if this is a read-only or WriteTxnRestore transaction.
|
// changes may be empty if this is a read-only or WriteTxnRestore transaction.
|
||||||
//changes := tx.Txn.Changes()
|
// TODO: publish changes: changes := tx.Txn.Changes()
|
||||||
// TODO: publish changes
|
|
||||||
|
|
||||||
tx.Txn.Commit()
|
tx.Txn.Commit()
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -137,8 +137,7 @@ func (s *Store) PreparedQuerySet(idx uint64, query *structs.PreparedQuery) error
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// preparedQuerySetTxn is the inner method used to insert a prepared query with
|
// preparedQuerySetTxn is the inner method used to insert a prepared query with
|
||||||
|
@ -254,8 +253,7 @@ func (s *Store) PreparedQueryDelete(idx uint64, queryID string) error {
|
||||||
return fmt.Errorf("failed prepared query delete: %s", err)
|
return fmt.Errorf("failed prepared query delete: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// preparedQueryDeleteTxn is the inner method used to delete a prepared query
|
// preparedQueryDeleteTxn is the inner method used to delete a prepared query
|
||||||
|
|
|
@ -170,8 +170,7 @@ func (s *Store) SessionCreate(idx uint64, sess *structs.Session) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sessionCreateTxn is the inner method used for creating session entries in
|
// sessionCreateTxn is the inner method used for creating session entries in
|
||||||
|
@ -297,8 +296,7 @@ func (s *Store) SessionDestroy(idx uint64, sessionID string, entMeta *structs.En
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
return tx.Commit()
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteSessionTxn is the inner method, which is used to do the actual
|
// deleteSessionTxn is the inner method, which is used to do the actual
|
||||||
|
|
|
@ -221,8 +221,8 @@ func (s *Restore) Abort() {
|
||||||
|
|
||||||
// Commit commits the changes made by a restore. This or Abort should always be
|
// Commit commits the changes made by a restore. This or Abort should always be
|
||||||
// called.
|
// called.
|
||||||
func (s *Restore) Commit() {
|
func (s *Restore) Commit() error {
|
||||||
s.tx.Commit()
|
return s.tx.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
// AbandonCh returns a channel you can wait on to know if the state store was
|
// AbandonCh returns a channel you can wait on to know if the state store was
|
||||||
|
|
|
@ -300,7 +300,7 @@ func TestStateStore_indexUpdateMaxTxn(t *testing.T) {
|
||||||
if err := indexUpdateMaxTxn(tx, 3, "nodes"); err != nil {
|
if err := indexUpdateMaxTxn(tx, 3, "nodes"); err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
tx.Commit()
|
require.NoError(t, tx.Commit())
|
||||||
|
|
||||||
if max := s.maxIndex("nodes"); max != 3 {
|
if max := s.maxIndex("nodes"); max != 3 {
|
||||||
t.Fatalf("bad max: %d", max)
|
t.Fatalf("bad max: %d", max)
|
||||||
|
|
|
@ -390,7 +390,12 @@ func (s *Store) TxnRW(idx uint64, ops structs.TxnOps) (structs.TxnResults, struc
|
||||||
return nil, errors
|
return nil, errors
|
||||||
}
|
}
|
||||||
|
|
||||||
tx.Commit()
|
err := tx.Commit()
|
||||||
|
if err != nil {
|
||||||
|
return nil, structs.TxnErrors{
|
||||||
|
{What: err.Error(), OpIndex: 0},
|
||||||
|
}
|
||||||
|
}
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue