Skip to content

Commit afae301

Browse files
committed
Merge branch 'main' of github.com:datastrato/graviton into issue_6570
2 parents 3aa3a07 + 9f5f3ee commit afae301

27 files changed

+1543
-1460
lines changed

core/src/main/java/org/apache/gravitino/authorization/AccessControlManager.java

+87-21
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.gravitino.Configs;
2626
import org.apache.gravitino.EntityStore;
2727
import org.apache.gravitino.MetadataObject;
28+
import org.apache.gravitino.NameIdentifier;
2829
import org.apache.gravitino.exceptions.GroupAlreadyExistsException;
2930
import org.apache.gravitino.exceptions.IllegalRoleException;
3031
import org.apache.gravitino.exceptions.NoSuchGroupException;
@@ -34,7 +35,10 @@
3435
import org.apache.gravitino.exceptions.NoSuchUserException;
3536
import org.apache.gravitino.exceptions.RoleAlreadyExistsException;
3637
import org.apache.gravitino.exceptions.UserAlreadyExistsException;
38+
import org.apache.gravitino.lock.LockType;
39+
import org.apache.gravitino.lock.TreeLockUtils;
3740
import org.apache.gravitino.storage.IdGenerator;
41+
import org.apache.gravitino.utils.MetadataObjectUtil;
3842

3943
/**
4044
* AccessControlManager is used for manage users, roles, grant information, this class is an
@@ -57,78 +61,120 @@ public AccessControlManager(EntityStore store, IdGenerator idGenerator, Config c
5761
@Override
5862
public User addUser(String metalake, String user)
5963
throws UserAlreadyExistsException, NoSuchMetalakeException {
60-
return userGroupManager.addUser(metalake, user);
64+
return TreeLockUtils.doWithTreeLock(
65+
NameIdentifier.of(AuthorizationUtils.ofUserNamespace(metalake).levels()),
66+
LockType.WRITE,
67+
() -> userGroupManager.addUser(metalake, user));
6168
}
6269

6370
@Override
6471
public boolean removeUser(String metalake, String user) throws NoSuchMetalakeException {
65-
return userGroupManager.removeUser(metalake, user);
72+
return TreeLockUtils.doWithTreeLock(
73+
NameIdentifier.of(AuthorizationUtils.ofUserNamespace(metalake).levels()),
74+
LockType.WRITE,
75+
() -> userGroupManager.removeUser(metalake, user));
6676
}
6777

6878
@Override
6979
public User getUser(String metalake, String user)
7080
throws NoSuchUserException, NoSuchMetalakeException {
71-
return userGroupManager.getUser(metalake, user);
81+
return TreeLockUtils.doWithTreeLock(
82+
AuthorizationUtils.ofUser(metalake, user),
83+
LockType.READ,
84+
() -> userGroupManager.getUser(metalake, user));
7285
}
7386

7487
@Override
7588
public String[] listUserNames(String metalake) throws NoSuchMetalakeException {
76-
return userGroupManager.listUserNames(metalake);
89+
return TreeLockUtils.doWithTreeLock(
90+
NameIdentifier.of(AuthorizationUtils.ofUserNamespace(metalake).levels()),
91+
LockType.READ,
92+
() -> userGroupManager.listUserNames(metalake));
7793
}
7894

7995
@Override
8096
public User[] listUsers(String metalake) throws NoSuchMetalakeException {
81-
return userGroupManager.listUsers(metalake);
97+
return TreeLockUtils.doWithTreeLock(
98+
NameIdentifier.of(AuthorizationUtils.ofUserNamespace(metalake).levels()),
99+
LockType.READ,
100+
() -> userGroupManager.listUsers(metalake));
82101
}
83102

84103
public Group addGroup(String metalake, String group)
85104
throws GroupAlreadyExistsException, NoSuchMetalakeException {
86-
return userGroupManager.addGroup(metalake, group);
105+
return TreeLockUtils.doWithTreeLock(
106+
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
107+
LockType.WRITE,
108+
() -> userGroupManager.addGroup(metalake, group));
87109
}
88110

89111
@Override
90112
public boolean removeGroup(String metalake, String group) throws NoSuchMetalakeException {
91-
return userGroupManager.removeGroup(metalake, group);
113+
return TreeLockUtils.doWithTreeLock(
114+
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
115+
LockType.WRITE,
116+
() -> userGroupManager.removeGroup(metalake, group));
92117
}
93118

94119
@Override
95120
public Group getGroup(String metalake, String group)
96121
throws NoSuchGroupException, NoSuchMetalakeException {
97-
return userGroupManager.getGroup(metalake, group);
122+
return TreeLockUtils.doWithTreeLock(
123+
AuthorizationUtils.ofGroup(metalake, group),
124+
LockType.READ,
125+
() -> userGroupManager.getGroup(metalake, group));
98126
}
99127

100128
@Override
101129
public Group[] listGroups(String metalake) throws NoSuchMetalakeException {
102-
return userGroupManager.listGroups(metalake);
130+
return TreeLockUtils.doWithTreeLock(
131+
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
132+
LockType.READ,
133+
() -> userGroupManager.listGroups(metalake));
103134
}
104135

105136
@Override
106137
public String[] listGroupNames(String metalake) throws NoSuchMetalakeException {
107-
return userGroupManager.listGroupNames(metalake);
138+
return TreeLockUtils.doWithTreeLock(
139+
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
140+
LockType.READ,
141+
() -> userGroupManager.listGroupNames(metalake));
108142
}
109143

110144
@Override
111145
public User grantRolesToUser(String metalake, List<String> roles, String user)
112146
throws NoSuchUserException, IllegalRoleException, NoSuchMetalakeException {
113-
return permissionManager.grantRolesToUser(metalake, roles, user);
147+
return TreeLockUtils.doWithTreeLock(
148+
AuthorizationUtils.ofUser(metalake, user),
149+
LockType.WRITE,
150+
() -> permissionManager.grantRolesToUser(metalake, roles, user));
114151
}
115152

116153
@Override
117154
public Group grantRolesToGroup(String metalake, List<String> roles, String group)
118155
throws NoSuchGroupException, IllegalRoleException, NoSuchMetalakeException {
119-
return permissionManager.grantRolesToGroup(metalake, roles, group);
156+
return TreeLockUtils.doWithTreeLock(
157+
AuthorizationUtils.ofGroup(metalake, group),
158+
LockType.WRITE,
159+
() -> permissionManager.grantRolesToGroup(metalake, roles, group));
120160
}
121161

122162
@Override
123163
public Group revokeRolesFromGroup(String metalake, List<String> roles, String group)
124164
throws NoSuchGroupException, IllegalRoleException, NoSuchMetalakeException {
125-
return permissionManager.revokeRolesFromGroup(metalake, roles, group);
165+
return TreeLockUtils.doWithTreeLock(
166+
AuthorizationUtils.ofGroup(metalake, group),
167+
LockType.WRITE,
168+
() -> permissionManager.revokeRolesFromGroup(metalake, roles, group));
126169
}
127170

128171
@Override
129172
public User revokeRolesFromUser(String metalake, List<String> roles, String user)
130173
throws NoSuchUserException, IllegalRoleException, NoSuchMetalakeException {
131-
return permissionManager.revokeRolesFromUser(metalake, roles, user);
174+
return TreeLockUtils.doWithTreeLock(
175+
AuthorizationUtils.ofUser(metalake, user),
176+
LockType.WRITE,
177+
() -> permissionManager.revokeRolesFromUser(metalake, roles, user));
132178
}
133179

134180
@Override
@@ -143,42 +189,62 @@ public Role createRole(
143189
Map<String, String> properties,
144190
List<SecurableObject> securableObjects)
145191
throws RoleAlreadyExistsException, NoSuchMetalakeException {
146-
return roleManager.createRole(metalake, role, properties, securableObjects);
192+
return TreeLockUtils.doWithTreeLock(
193+
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
194+
LockType.WRITE,
195+
() -> roleManager.createRole(metalake, role, properties, securableObjects));
147196
}
148197

149198
@Override
150199
public Role getRole(String metalake, String role)
151200
throws NoSuchRoleException, NoSuchMetalakeException {
152-
return roleManager.getRole(metalake, role);
201+
return TreeLockUtils.doWithTreeLock(
202+
AuthorizationUtils.ofRole(metalake, role),
203+
LockType.READ,
204+
() -> roleManager.getRole(metalake, role));
153205
}
154206

155207
@Override
156208
public boolean deleteRole(String metalake, String role) throws NoSuchMetalakeException {
157-
return roleManager.deleteRole(metalake, role);
209+
return TreeLockUtils.doWithTreeLock(
210+
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
211+
LockType.WRITE,
212+
() -> roleManager.deleteRole(metalake, role));
158213
}
159214

160215
@Override
161216
public String[] listRoleNames(String metalake) throws NoSuchMetalakeException {
162-
return roleManager.listRoleNames(metalake);
217+
return TreeLockUtils.doWithTreeLock(
218+
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
219+
LockType.READ,
220+
() -> roleManager.listRoleNames(metalake));
163221
}
164222

165223
@Override
166224
public String[] listRoleNamesByObject(String metalake, MetadataObject object)
167225
throws NoSuchMetalakeException, NoSuchMetadataObjectException {
168-
return roleManager.listRoleNamesByObject(metalake, object);
226+
NameIdentifier identifier = MetadataObjectUtil.toEntityIdent(metalake, object);
227+
return TreeLockUtils.doWithTreeLock(
228+
identifier, LockType.READ, () -> roleManager.listRoleNamesByObject(metalake, object));
169229
}
170230

171231
@Override
172232
public Role grantPrivilegeToRole(
173233
String metalake, String role, MetadataObject object, Set<Privilege> privileges)
174234
throws NoSuchRoleException, NoSuchMetalakeException {
175-
return permissionManager.grantPrivilegesToRole(metalake, role, object, privileges);
235+
return TreeLockUtils.doWithTreeLock(
236+
AuthorizationUtils.ofRole(metalake, role),
237+
LockType.WRITE,
238+
() -> permissionManager.grantPrivilegesToRole(metalake, role, object, privileges));
176239
}
177240

178241
@Override
179242
public Role revokePrivilegesFromRole(
180243
String metalake, String role, MetadataObject object, Set<Privilege> privileges)
181244
throws NoSuchRoleException, NoSuchMetalakeException {
182-
return permissionManager.revokePrivilegesFromRole(metalake, role, object, privileges);
245+
return TreeLockUtils.doWithTreeLock(
246+
AuthorizationUtils.ofRole(metalake, role),
247+
LockType.WRITE,
248+
() -> permissionManager.revokePrivilegesFromRole(metalake, role, object, privileges));
183249
}
184250
}

core/src/main/java/org/apache/gravitino/authorization/OwnerManager.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ public OwnerManager(EntityStore store) {
6060

6161
public void setOwner(
6262
String metalake, MetadataObject metadataObject, String ownerName, Owner.Type ownerType) {
63+
64+
NameIdentifier objectIdent = MetadataObjectUtil.toEntityIdent(metalake, metadataObject);
6365
try {
6466
Optional<Owner> originOwner = getOwner(metalake, metadataObject);
6567

66-
NameIdentifier objectIdent = MetadataObjectUtil.toEntityIdent(metalake, metadataObject);
6768
OwnerImpl newOwner = new OwnerImpl();
68-
6969
if (ownerType == Owner.Type.USER) {
7070
NameIdentifier ownerIdent = AuthorizationUtils.ofUser(metalake, ownerName);
7171
TreeLockUtils.doWithTreeLock(
@@ -129,16 +129,20 @@ public void setOwner(
129129
}
130130

131131
public Optional<Owner> getOwner(String metalake, MetadataObject metadataObject) {
132+
NameIdentifier ident = MetadataObjectUtil.toEntityIdent(metalake, metadataObject);
133+
OwnerImpl owner = new OwnerImpl();
132134
try {
133-
OwnerImpl owner = new OwnerImpl();
134-
NameIdentifier ident = MetadataObjectUtil.toEntityIdent(metalake, metadataObject);
135135
List<? extends Entity> entities =
136-
store
137-
.relationOperations()
138-
.listEntitiesByRelation(
139-
SupportsRelationOperations.Type.OWNER_REL,
140-
ident,
141-
MetadataObjectUtil.toEntityType(metadataObject));
136+
TreeLockUtils.doWithTreeLock(
137+
ident,
138+
LockType.READ,
139+
() ->
140+
store
141+
.relationOperations()
142+
.listEntitiesByRelation(
143+
SupportsRelationOperations.Type.OWNER_REL,
144+
ident,
145+
MetadataObjectUtil.toEntityType(metadataObject)));
142146

143147
if (entities.isEmpty()) {
144148
return Optional.empty();

core/src/main/java/org/apache/gravitino/authorization/PermissionManager.java

+18-4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.apache.gravitino.exceptions.NoSuchGroupException;
4040
import org.apache.gravitino.exceptions.NoSuchRoleException;
4141
import org.apache.gravitino.exceptions.NoSuchUserException;
42+
import org.apache.gravitino.lock.LockType;
43+
import org.apache.gravitino.lock.TreeLockUtils;
4244
import org.apache.gravitino.meta.AuditInfo;
4345
import org.apache.gravitino.meta.GroupEntity;
4446
import org.apache.gravitino.meta.RoleEntity;
@@ -67,7 +69,10 @@ User grantRolesToUser(String metalake, List<String> roles, String user) {
6769
try {
6870
List<RoleEntity> roleEntitiesToGrant = Lists.newArrayList();
6971
for (String role : roles) {
70-
roleEntitiesToGrant.add(roleManager.getRole(metalake, role));
72+
TreeLockUtils.doWithTreeLock(
73+
AuthorizationUtils.ofRole(metalake, role),
74+
LockType.READ,
75+
() -> roleEntitiesToGrant.add(roleManager.getRole(metalake, role)));
7176
}
7277

7378
User updatedUser =
@@ -153,7 +158,10 @@ Group grantRolesToGroup(String metalake, List<String> roles, String group) {
153158
try {
154159
List<RoleEntity> roleEntitiesToGrant = Lists.newArrayList();
155160
for (String role : roles) {
156-
roleEntitiesToGrant.add(roleManager.getRole(metalake, role));
161+
TreeLockUtils.doWithTreeLock(
162+
AuthorizationUtils.ofRole(metalake, role),
163+
LockType.READ,
164+
() -> roleEntitiesToGrant.add(roleManager.getRole(metalake, role)));
157165
}
158166

159167
Group updatedGroup =
@@ -239,7 +247,10 @@ Group revokeRolesFromGroup(String metalake, List<String> roles, String group) {
239247
try {
240248
List<RoleEntity> roleEntitiesToRevoke = Lists.newArrayList();
241249
for (String role : roles) {
242-
roleEntitiesToRevoke.add(roleManager.getRole(metalake, role));
250+
TreeLockUtils.doWithTreeLock(
251+
AuthorizationUtils.ofRole(metalake, role),
252+
LockType.READ,
253+
() -> roleEntitiesToRevoke.add(roleManager.getRole(metalake, role)));
243254
}
244255

245256
Group updatedGroup =
@@ -325,7 +336,10 @@ User revokeRolesFromUser(String metalake, List<String> roles, String user) {
325336
try {
326337
List<RoleEntity> roleEntitiesToRevoke = Lists.newArrayList();
327338
for (String role : roles) {
328-
roleEntitiesToRevoke.add(roleManager.getRole(metalake, role));
339+
TreeLockUtils.doWithTreeLock(
340+
AuthorizationUtils.ofRole(metalake, role),
341+
LockType.READ,
342+
() -> roleEntitiesToRevoke.add(roleManager.getRole(metalake, role)));
329343
}
330344

331345
User updatedUser =

0 commit comments

Comments
 (0)