[ 
http://issues.apache.org/jira/browse/DERBY-1539?page=comments#action_12422730 ] 
            
Mamta A. Satoor commented on DERBY-1539:
----------------------------------------

I want to start out by saying that this is my first time ever working with 
hashCode so I am new to this part of the code and hence new to the terminology. 
Having said that, I debugged through permissions caching and found that 
Permission Descriptor does not change its hashCode during its lifetime in the 
cache. I did my debugging for a TablePermissionsDescriptor and same logic 
should apply to ColPermsDescriptor and RoutinePermsDescriptor.

Following are more details from debugging
1)When a statement such as create view is compiled, a list of privileges are 
collected for it. At this point, we only know of tableUUID and grantee and the 
required privilege type and know nothing about the Permission Descriptor's UUID 
since we haven't gone to system tables yet. 
During the statement's execution phase, one required privilege is taken at a 
time. For each one of them, we first create a Permission Descriptor using the 
tableUUID, permission type and grantee as PUBLIC. We find if there is such a 
granted permission by going to system tables and if yes, then we get that 
permission's UUID and put it in the Permission Descriptor object and save it in 
the hash table using the tableUUID and grantee as the hash key(so the entry in 
the has table will have both UUID and tableUUID) and we move on to the next 
required privilege.  
If there is no PUBLIC level privilege found, then the Permission Descriptor 
with tableUUID, grantee as PUBLIC and no UUID is added to the hash table and we 
look for the privilege at the user specific level in the permissions system 
tables. 
If we find a privilege granted at the user level, then we add a Permission 
Descriptor with the UUID for that privilege(found from the system table), 
tableUUID and grantee as the actual user in the hash table and we move on to 
the next required privilege. Ofcourse, if no privilege found at PUBLIC or user 
level, there will be an exception thrown.
So, at the end of the statement execution, the hash table would have 
permissions descriptors with or without UUIDs depending on whether a permission 
was granted at the PUBLIC or user level. But in both cases, the hashkey used is 
based on tableUUID and grantee.

2)Next, when revoke privilege is called, dependency manager has access to the 
UUID of the privilege. It looks in the hashtable using UUID for the haskey(we 
do not know the tableUUID at this point and hence have to reply on UUID. This 
is the code change that I made in this patch). Since the earlier entries in 
hashtable is step 1) above were based on the hashcode of tableUUID and grantee, 
we will not find the entry in the hash table based on the UUID. The cahing code 
makes an entry in the hashtable using the hashkey based on UUID and as part of 
the remaining logic in the caching code for a new entry, we goto system tables 
and get the remaining information about Permission Descriptor which includes 
tableUUID, grantee, permission type etc. This happens in 
PermssionsCacheable.setIdentity. During this time, caching code finds that 
there is already an entry in the hashtable for the tableUUID and grantee(which 
were just found from the system table) and hence it uses the existing hashtable 
entry and removes the entry that was made using UUID as the hashkey. So, this 
is what ensures that a Permission Descriptor does not change its hashCode 
during its lifetime in the cache and we continue to use tableUUID and grantee 
to get stuff from the cache or to add stuff into the cache. 

The stack trace of where we abandon the hashentry made using UUID and reuse the 
existing hasttable entry based on tableUUID and grantee is as follows
        PermissionsCacheable.setIdentity(Object) line: 66
        CachedItem.takeOnIdentity(CacheManager, CacheableFactory, Object, 
boolean, Object) line: 235
        Clock.addEntry(CachedItem, Object, boolean, Object) line: 796
        Clock.find(Object) line: 301
        DataDictionaryImpl.getPermissions(PermissionsDescriptor) line: 9796
        DataDictionaryImpl.getTablePermissions(UUID) line: 9790
        DDdependableFinder.getDependable(DataDictionary, UUID) line: 354
        DDdependableFinder.getDependable(UUID) line: 180
        BasicDependencyManager.getDependencyDescriptorList(List) line: 1190
        BasicDependencyManager.getDependents(Provider) line: 1370
        BasicDependencyManager.coreInvalidateFor(Provider, int, 
LanguageConnectionContext) line: 247
        BasicDependencyManager.invalidateFor(Provider, int, 
LanguageConnectionContext) line: 224
        TablePermsDescriptor.sendInvalidationMessages(DependencyManager, 
LanguageConnectionContext) line: 194
        DataDictionaryImpl.addRemovePermissionsDescriptor(boolean, 
PermissionsDescriptor, String, TransactionController) line: 10004
        TablePrivilegeInfo.executeGrantRevoke(Activation, boolean, List) line: 
131
        GrantRevokeConstantAction.executeConstantAction(Activation) line: 61
        MiscResultSet.open() line: 56
        GenericPreparedStatement.execute(Activation, boolean, long) line: 357
        EmbedStatement.executeStatement(Activation, boolean, boolean) line: 1181
        EmbedStatement.execute(String, boolean, boolean, int, int[], String[]) 
line: 584
        EmbedStatement.execute(String) line: 516
        ij.executeImmediate(String) line: 313
        utilMain14(utilMain).doCatch(String) line: 433
        utilMain14(utilMain).go(LocalizedInput[], LocalizedOutput, Properties) 
line: 310
        Main14(Main).go(LocalizedInput, LocalizedOutput, Properties) line: 207
        Main.mainCore(String[], Main) line: 173
        Main14.main(String[]) line: 55
        ij.main(String[]) line: 60


Dan, I hope this answers your question.

> As per the functional spec attached to DERBY-1330, a trigger should be 
> dropped when a privilege required by the trigger is revoked.
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1539
>                 URL: http://issues.apache.org/jira/browse/DERBY-1539
>             Project: Derby
>          Issue Type: New Feature
>          Components: SQL
>    Affects Versions: 10.2.0.0
>            Reporter: Mamta A. Satoor
>         Assigned To: Mamta A. Satoor
>             Fix For: 10.2.0.0
>
>         Attachments: DERBY1539V1hashCodeEqualsDiff.txt, 
> DERBY1539V1hashCodeEqualsStat.txt
>
>
> A trigger tracks its privileges requirements using Derby's Dependency 
> Manager. If any one of those required privileges are revoked, the trigger 
> should be dropped automatically. 
> I am just creating a new jira entry here so it is easier to track sub items 
> of DERBY-1330. Will link this Jira entry to DERBY-1330.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to