@@ -1002,7 +1002,7 @@ func (m *Manager) AcquireFreshestFromStore(ctx context.Context, id descpb.ID) er
1002
1002
attemptsMade := 0
1003
1003
for {
1004
1004
// Acquire a fresh lease.
1005
- didAcquire , err := acquireNodeLease (ctx , m , id , AcquireFreshestBlock )
1005
+ didAcquire , err := m . acquireNodeLease (ctx , id , AcquireFreshestBlock )
1006
1006
if err != nil {
1007
1007
return err
1008
1008
}
@@ -1024,8 +1024,8 @@ func (m *Manager) AcquireFreshestFromStore(ctx context.Context, id descpb.ID) er
1024
1024
// being dropped or offline, the error will be of type inactiveTableError.
1025
1025
// The boolean returned is true if this call was actually responsible for the
1026
1026
// lease acquisition.
1027
- func acquireNodeLease (
1028
- ctx context.Context , m * Manager , id descpb.ID , typ AcquireType ,
1027
+ func ( m * Manager ) acquireNodeLease (
1028
+ ctx context.Context , id descpb.ID , typ AcquireType ,
1029
1029
) (bool , error ) {
1030
1030
start := timeutil .Now ()
1031
1031
log .VEventf (ctx , 2 , "acquiring lease for descriptor %d..." , id )
@@ -1037,7 +1037,7 @@ func acquireNodeLease(
1037
1037
},
1038
1038
func (ctx context.Context ) (interface {}, error ) {
1039
1039
if m .IsDraining () {
1040
- return nil , errLeaseManagerIsDraining
1040
+ return false , errLeaseManagerIsDraining
1041
1041
}
1042
1042
newest := m .findNewest (id )
1043
1043
var currentVersion descpb.DescriptorVersion
@@ -1051,26 +1051,75 @@ func acquireNodeLease(
1051
1051
if err != nil {
1052
1052
return false , errors .Wrapf (err , "lease acquisition was unable to resolve liveness session" )
1053
1053
}
1054
- desc , regionPrefix , err := m . storage . acquire ( ctx , session , id , currentVersion , currentSessionID )
1055
- if err != nil {
1056
- return nil , err
1057
- }
1058
- // If a nil descriptor is returned, then the latest version has already
1059
- // been leased. So, nothing needs to be done here.
1060
- if desc == nil {
1061
- return true , nil
1054
+
1055
+ doAcquisition := func () (catalog. Descriptor , error ) {
1056
+ desc , _ , err := m . storage . acquire ( ctx , session , id , currentVersion , currentSessionID )
1057
+ if err != nil {
1058
+ return nil , err
1059
+ }
1060
+
1061
+ return desc , nil
1062
1062
}
1063
- t := m .findDescriptorState (id , false /* create */ )
1064
- if t == nil {
1065
- return nil , errors .AssertionFailedf ("could not find descriptor state for id %d" , id )
1063
+
1064
+ doUpsertion := func (desc catalog.Descriptor ) error {
1065
+ t := m .findDescriptorState (id , false /* create */ )
1066
+ if t == nil {
1067
+ return errors .AssertionFailedf ("could not find descriptor state for id %d" , id )
1068
+ }
1069
+ t .mu .Lock ()
1070
+ t .mu .takenOffline = false
1071
+ defer t .mu .Unlock ()
1072
+ err = t .upsertLeaseLocked (ctx , desc , session , m .storage .getRegionPrefix ())
1073
+ if err != nil {
1074
+ return err
1075
+ }
1076
+
1077
+ return nil
1066
1078
}
1067
- t .mu .Lock ()
1068
- t .mu .takenOffline = false
1069
- defer t .mu .Unlock ()
1070
- err = t .upsertLeaseLocked (ctx , desc , session , regionPrefix )
1071
- if err != nil {
1072
- return nil , err
1079
+
1080
+ // These tables are special and can have their versions bumped
1081
+ // without blocking on other nodes converging to that version.
1082
+ if newest != nil && (id == keys .UsersTableID ||
1083
+ id == keys .RoleMembersTableID ||
1084
+ id == keys .RoleOptionsTableID ||
1085
+ m .isMaybeSystemPrivilegesTable (ctx , id )) {
1086
+
1087
+ // The two-version invariant allows an update in lease manager
1088
+ // without (immediately) acquiring a new lease. This prevents
1089
+ // a race on where the lease is acquired but the manager isn't
1090
+ // yet updated.
1091
+ desc , err := m .maybeGetDescriptorWithoutValidation (ctx , id , true /* existenceRequired */ )
1092
+ if err != nil {
1093
+ return false , err
1094
+ }
1095
+ err = doUpsertion (desc )
1096
+ if err != nil {
1097
+ return false , err
1098
+ }
1099
+
1100
+ desc , err = doAcquisition ()
1101
+ if err != nil {
1102
+ return false , err
1103
+ }
1104
+ if desc == nil {
1105
+ return true , nil
1106
+ }
1107
+ } else {
1108
+ desc , err := doAcquisition ()
1109
+ if err != nil {
1110
+ return false , err
1111
+ }
1112
+ // If a nil descriptor is returned, then the latest version has already
1113
+ // been leased. So, nothing needs to be done here.
1114
+ if desc == nil {
1115
+ return true , nil
1116
+ }
1117
+ err = doUpsertion (desc )
1118
+ if err != nil {
1119
+ return false , err
1120
+ }
1073
1121
}
1122
+
1074
1123
return true , nil
1075
1124
})
1076
1125
if m .testingKnobs .LeaseStoreTestingKnobs .LeaseAcquireResultBlockEvent != nil {
@@ -1084,6 +1133,22 @@ func acquireNodeLease(
1084
1133
return didAcquire , nil
1085
1134
}
1086
1135
1136
+ var systemPrivilegesTableDescID atomic.Uint32
1137
+
1138
+ // isMaybeSystemPrivilegesTable tries to determine if the given descriptor is
1139
+ // for the system privileges table. It depends on the namecache to resolve the
1140
+ // table descriptor after which it's memoized.
1141
+ func (m * Manager ) isMaybeSystemPrivilegesTable (ctx context.Context , id descpb.ID ) bool {
1142
+ if systemPrivilegesTableDescID .Load () == uint32 (descpb .InvalidID ) {
1143
+ if privilegesDesc , _ := m .names .get (ctx , keys .SystemDatabaseID , keys .SystemPublicSchemaID , "privileges" , hlc.Timestamp {}); privilegesDesc != nil {
1144
+ systemPrivilegesTableDescID .CompareAndSwap (uint32 (descpb .InvalidID ), uint32 (privilegesDesc .GetID ()))
1145
+ privilegesDesc .Release (ctx )
1146
+ }
1147
+ }
1148
+
1149
+ return uint32 (id ) == systemPrivilegesTableDescID .Load ()
1150
+ }
1151
+
1087
1152
// releaseLease deletes an entry from system.lease.
1088
1153
func releaseLease (ctx context.Context , lease * storedLease , m * Manager ) (released bool ) {
1089
1154
// Force the release to happen synchronously, if we are draining or, when we
@@ -1729,7 +1794,7 @@ func (m *Manager) Acquire(
1729
1794
t .markAcquisitionStart (ctx )
1730
1795
defer t .markAcquisitionDone (ctx )
1731
1796
// Renew lease and retry. This will block until the lease is acquired.
1732
- _ , errLease := acquireNodeLease (ctx , m , id , AcquireBlock )
1797
+ _ , errLease := m . acquireNodeLease (ctx , id , AcquireBlock )
1733
1798
return errLease
1734
1799
}(); err != nil {
1735
1800
return nil , err
@@ -2371,7 +2436,7 @@ func (m *Manager) refreshSomeLeases(ctx context.Context, refreshAndPurgeAllDescr
2371
2436
return
2372
2437
}
2373
2438
}
2374
- if _ , err := acquireNodeLease (ctx , m , id , AcquireBackground ); err != nil {
2439
+ if _ , err := m . acquireNodeLease (ctx , id , AcquireBackground ); err != nil {
2375
2440
log .Dev .Errorf (ctx , "refreshing descriptor: %d lease failed: %s" , id , err )
2376
2441
2377
2442
if errors .Is (err , catalog .ErrDescriptorNotFound ) || errors .Is (err , catalog .ErrDescriptorDropped ) {
0 commit comments