Cetin Sahin created RANGER-2139:
-----------------------------------

             Summary: UnixUserGroupBuilder fails to detect consecutive updates 
on UNIX passwd and group files
                 Key: RANGER-2139
                 URL: https://issues.apache.org/jira/browse/RANGER-2139
             Project: Ranger
          Issue Type: Bug
          Components: usersync
    Affects Versions: 1.0.0, master
            Reporter: Cetin Sahin


When Unix based user and group synchronization is enabled in Ranger, 
UnixUserGroupBuilder periodically checks whether one of the /etc/passwd or 
/etc/group files is modified or not to trigger a synchronization.

However, while checking the modification of a file, the UnixUserGroupBuilder 
uses java.io.File.lastModified() to check whether the file is updated after the 
latest synchronization time.
{code:java}
long TempGroupFileModifiedAt = new File(unixGroupFile).lastModified();
{code}
java.io.File.lastModified() function, however, returns the latest modified 
timestamp in the time granularity of seconds. That means each timestamp ends 
with 000 independent of the millisecond precision.

[https://bugs.openjdk.java.net/browse/JDK-8177809]
 
[http://dev-answers.blogspot.com/2014/11/avoid-using-javaiofilelastmodified-for.html]

This can cause UnixUserGroupBuilder to fail to detect the update on the file if 
the file modification check happens between the two consecutive updates within 
the same second. Assume the following scenario with the corresponding 
timestamps where UnixUserGroupBuilder checks the updates per minute.

the latest modification of users and group files are at t0 (00:00:00.111), 
which have a corresponding timestamp of 1529539200111, denoted by T0

Now, consider the following scenario.
 * At time t1 (01:*00:00.123*), T1 (1529542800123): /etc/group file is updated 
and a new group called group01 is added.
 * At time t2 (01:*00:00.345*), T2 (1529542800345): UnixUserGroupBuilder 
threads wakes up and detects the update on the group file and performed the 
synchronization. After the synchronization, the latest modification time for 
the group is updated from the File.lastModified() function. latest modification 
of group file = File.lastModified(t1) = *1529542800000*. Please note that the 
last 3 digits corresponding to the milliseconds is truncated to 000 with 
File.lastModified() function.
 * At time t3 (01:*00:00.567*), T3 (1529542800567): /etc/group file is updated 
and a user membership is added to one of the groups (e.g., user user01 becomes 
a member of group group01).
 * At time t4 (01:*01:00.345*), T4 (1529542860345): UnixUserGroupBuilder thread 
wakes up and couldn't detect any changes since the timestamp generated from the 
File.lastModified() function returns the same timestamp for t1 and t3. Recall 
that the latest modification time of the group file becomes 1529542800000 at t2 
and File.lastModified(t3) returns *1529542800000* as well. Since both 
File.lastModified(t1) = File.lastModified(t3), UnixUserGroupBuilder could not 
detect the modification on the file at t4, assumes there is no update, and 
then, sleeps again without syncing the changes.

At time t4, UnixUserGroupBuilder is supposed to sync the user group membership 
but if fails to detect the update. If there is no any further update on one of 
these files, the user01 will never be part of group01 in Ranger.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to