 |
State transition of client - Fig
3
 |
Hoarding state
 |
Connected to the
server |
 |
Cache file both for
performance and possible disconnected-operation |
 |
Prioritized and
hierarchical cache management
 |
Priority of
file is determined by
 |
user's
input about the importance of the file |
 |
recent
reference pattern - LRU |
|
 |
Directory is
not kicked out until all the files and subdirectories
under it are kicked out |
|
 |
Hoard walking
 |
Priority of
file is dynamic
 |
user's
input is static, but |
 |
priority
determined by reference pattern changes
dynamically and over time |
|
 |
-> Priority
inversion could happen
 |
Files
with higher priority are out of cache |
|
 |
Hoard walking
 |
makes the
cache reflect priority by kicking out files with
lower priority and bringing in those with higher
priority |
 |
brings
latest version of file, excluding directory, which has been modified in
another site
 |
Usually
callback is handled, i.e., new version is
brought into, only when the file is
referenced again. So this action of bringing
new version will occur only when a callback was delivered
to this client but no
reference to the file has been made until the time
of hoard walking |
|
|
|
|
 |
Emulation state -
disconnected operation
 |
Client acts as a
pseudo-server |
 |
Security checks are
postponed until reintegration |
 |
Temporary file-id is
generated for newly created file |
 |
Log is recorded for
later reintegration
 |
Log per volume |
 |
Each log entry
has
 |
system
call & its arguments |
 |
version
number of target object |
|
 |
Log should be
short. Client should be very frugal to use cache |
|
|
 |
Reintegration state
 |
Changes made during
emulation state are propagated to servers |
 |
Client cache is
updated with latest versions from servers |
 |
Algorithm
 |
Client
 |
gets
permanent fids and replaces temporary fids in the
log |
 |
sends the
log in parallel to servers having the volume |
|
 |
Each server in
parallel,
 |
parses
the log file and locks objects referenced in it |
 |
validate
& execute operations |
 |
brings
data blocks of modified files from client |
 |
commit |
|
|
 |
How servers detect
conflicting modification?
 |
Each object is
tagged (i.e., versioned) with an id |
 |
For update
operation of a file t
 |
if ( id(t)
in log == id(t) in server ) valid -> apply the
modification of log to server |
 |
otherwise,
error |
|
 |
For directory
modification, entry level check is done if id's
mismatches |
|
|
|