[ https://issues.apache.org/jira/browse/OAK-4119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
angela updated OAK-4119: ------------------------ Description: First bunch of potential improvements to be tested/verified using the benchmarks: h4. General - dedicated index for {{rep:members}} property defined by nt {{rep:MemberReferences}} (=> mod in {{UserInitializer}}) - adjust nt-handling in {{IdentifierManager.getReferences}} : if a single nt name is specified in the {{nodeTypeNames}} param it is inserted in the query statement instead of looking for {{nt:base}} - introduce {{hasAnyReferenceInPath}}, which allows to search for any references being located in a give subtree of the repository (with TODOs) - {{MembershipProvider.MemberReferenceIterator}}: keeping track of processed references is optional i.e. an implementation detail - {{MembershipProvider.AbstractMemberIterator}}: no more protected fields (patch OAK-4119_2) - {{MembershipProvider.AbstractMemberIterator}}: breadth-first iteration before performing queries for the inherited members/membership (patch OAK-4119_2) h4. Group.isMember - {{MembershipProvider}}: introduce shortcut if a Group doesn't have any members - {{MembershipProvider}}: keep old logic if the target Group has (potentially) pending changes - {{MembershipProvider}}: for unmodified Groups use reverse membership lookup of the target authorizable instead (patch OAK-4119_2: further optimizes 'hasMembership' as the {{AbstractMemberIterator}} doesn't need to search for the complete membership; limiting the number of queries to be executed. see above) - {{GroupImpl}}: add shortcut if member to be tested is a Group representing the {{EveryonePrincipal}} h4. Group.isDeclaredMember - introduce shortcut if a Group doesn't have any members - keep old logic if target Group (potentially) has pending changes or if the number of members is small (=> threshold with {{MembershipProvider}}) - minor change with the old behavior, which does no longer keep track of processed references, which is not needed here - for unmodified Groups with plenty of members use {{IdentifierManager.hasAnyReferenceInPath}} - All modifications in {{MembershipProvider}} h4. Group.addMember(Authorizable) - {{GroupImpl}}: drop extra test for circular membership, which is anyway enforced by the {{UserValidator}} => needs adjustment of test-cases that expect this to be detected immediately => intoducing save-call to verify if cycles are properly detected latest during commit. - {{UserValidator}}: if {{isMember}} is improved by the changes above, the check for circular membership would be faster as well h4. Group.addMembers(String...) - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} that don't take a single contentID but rather a Map of contentID:memberID and returns the set of memberIDs that could not be processed successfully. - consequently finding the best {{rep:members property}} and avoiding duplicate membership is performed only once for the batch of ids to be added - Note: once best-property reaches threshold new member-ref nodes will be created h4. Group.removeMembers(String...) - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} that don't take a single contentID but rather a Map of contentID:memberID and returns the set of memberIDs that could not be processed successfully. - consequently for a given batch of ids the declared member are traversed only once was: First bunch of potential improvements to be tested/verified using the benchmarks: h4. General - dedicated index for {{rep:members}} property defined by nt {{rep:MemberReferences}} (=> mod in {{UserInitializer}}) - adjust nt-handling in {{IdentifierManager.getReferences}} : if a single nt name is specified in the {{nodeTypeNames}} param it is inserted in the query statement instead of looking for {{nt:base}} - introduce {{hasAnyReferenceInPath}}, which allows to search for any references being located in a give subtree of the repository (with TODOs) - {{MembershipProvider.AbstractMemberIterator}}: no more protected fields (patch OAK-4119_2) - {{MembershipProvider.AbstractMemberIterator}}: breadth-first iteration before performing queries for the inherited members/membership (patch OAK-4119_2) h4. Group.isMember - {{MembershipProvider}}: introduce shortcut if a Group doesn't have any members - {{MembershipProvider}}: keep old logic if the target Group has (potentially) pending changes - {{MembershipProvider}}: for unmodified Groups use reverse membership lookup of the target authorizable instead (patch OAK-4119_2: further optimizes 'hasMembership' as the {{AbstractMemberIterator}} doesn't need to search for the complete membership; limiting the number of queries to be executed. see above) - {{GroupImpl}}: add shortcut if member to be tested is a Group representing the {{EveryonePrincipal}} h4. Group.isDeclaredMember - introduce shortcut if a Group doesn't have any members - keep old logic if target Group (potentially) has pending changes or if the number of members is small (=> threshold with {{MembershipProvider}}) - for unmodified Groups with plenty of members use {{IdentifierManager.hasAnyReferenceInPath}} - Modifications: {{MembershipProvider}} h4. Group.addMember(Authorizable) - {{GroupImpl}}: drop extra test for circular membership, which is anyway enforced by the {{UserValidator}} => needs adjustment of test-cases that expect this to be detected immediately => intoducing save-call to verify if cycles are properly detected latest during commit. - {{UserValidator}}: if {{isMember}} is improved by the changes above, the check for circular membership would be faster as well h4. Group.addMembers(String...) - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} that don't take a single contentID but rather a Map of contentID:memberID and returns the set of memberIDs that could not be processed successfully. - consequently finding the best {{rep:members property}} and avoiding duplicate membership is performed only once for the batch of ids to be added - Note: once best-property reaches threshold new member-ref nodes will be created h4. Group.removeMembers(String...) - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} that don't take a single contentID but rather a Map of contentID:memberID and returns the set of memberIDs that could not be processed successfully. - consequently for a given batch of ids the declared member are traversed only once > Improvements Take 1 > ------------------- > > Key: OAK-4119 > URL: https://issues.apache.org/jira/browse/OAK-4119 > Project: Jackrabbit Oak > Issue Type: Improvement > Components: core > Reporter: angela > Assignee: angela > Attachments: OAK-4119.patch, OAK-4119_2.patch, OAK-4119_tests.patch > > > First bunch of potential improvements to be tested/verified using the > benchmarks: > h4. General > - dedicated index for {{rep:members}} property defined by nt > {{rep:MemberReferences}} (=> mod in {{UserInitializer}}) > - adjust nt-handling in {{IdentifierManager.getReferences}} : if a single nt > name is specified in the {{nodeTypeNames}} param it is inserted in the query > statement instead of looking for {{nt:base}} > - introduce {{hasAnyReferenceInPath}}, which allows to search for any > references being located in a give subtree of the repository (with TODOs) > - {{MembershipProvider.MemberReferenceIterator}}: keeping track of processed > references is optional i.e. an implementation detail > - {{MembershipProvider.AbstractMemberIterator}}: no more protected fields > (patch OAK-4119_2) > - {{MembershipProvider.AbstractMemberIterator}}: breadth-first iteration > before performing queries for the inherited members/membership (patch > OAK-4119_2) > h4. Group.isMember > - {{MembershipProvider}}: introduce shortcut if a Group doesn't have any > members > - {{MembershipProvider}}: keep old logic if the target Group has > (potentially) pending changes > - {{MembershipProvider}}: for unmodified Groups use reverse membership > lookup of the target authorizable instead (patch OAK-4119_2: further > optimizes 'hasMembership' as the {{AbstractMemberIterator}} doesn't need to > search for the complete membership; limiting the number of queries to be > executed. see above) > - {{GroupImpl}}: add shortcut if member to be tested is a Group representing > the {{EveryonePrincipal}} > h4. Group.isDeclaredMember > - introduce shortcut if a Group doesn't have any members > - keep old logic if target Group (potentially) has pending changes or if the > number of members is small (=> threshold with {{MembershipProvider}}) > - minor change with the old behavior, which does no longer keep track of > processed references, which is not needed here > - for unmodified Groups with plenty of members use > {{IdentifierManager.hasAnyReferenceInPath}} > - All modifications in {{MembershipProvider}} > h4. Group.addMember(Authorizable) > - {{GroupImpl}}: drop extra test for circular membership, which is anyway > enforced by the {{UserValidator}} => needs adjustment of test-cases that > expect this to be detected immediately => intoducing save-call to verify if > cycles are properly detected latest during commit. > - {{UserValidator}}: if {{isMember}} is improved by the changes above, the > check for circular membership would be faster as well > h4. Group.addMembers(String...) > - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} > that don't take a single contentID but rather a Map of contentID:memberID and > returns the set of memberIDs that could not be processed successfully. > - consequently finding the best {{rep:members property}} and avoiding > duplicate membership is performed only once for the batch of ids to be added > - Note: once best-property reaches threshold new member-ref nodes will be > created > h4. Group.removeMembers(String...) > - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}} > that don't take a single contentID but rather a Map of contentID:memberID and > returns the set of memberIDs that could not be processed successfully. > - consequently for a given batch of ids the declared member are traversed > only once -- This message was sent by Atlassian JIRA (v6.3.4#6332)