假设文件 X 最近被工作站 WS1 使用了,所以 WS1 对于文件 X 持有锁。同时文件 Y 最近被工作站 WS2 使用,所以 WS2 对于文件 Y 持有锁。锁服务器会记住每个文件的锁被谁所持有。当然一个文件的锁也有可能不被任何人持有。
在每个工作站,会记录跟踪它所持有的锁,和锁对应的文件内容。所以在每个工作站中,Frangipani 模块也会有一个 lock 表单,表单会记录文件名、对应的锁的状态和文件的缓存内容。这里的文件内容可能是大量的数据块,也可能是目录的列表。
当一个 Frangipani 服务器决定要读取文件,比如读取目录 /、读取文件 A、查看一个 inode,首先,它会向一个锁服务器请求文件对应的锁,之后才会向 Petal 服务器请求文件或者目录的数据。收到数据之后,工作站会记住,本地有一个文件 X 的拷贝,对应的锁的状态,和相应的文件内容。
Cache Coherence
工作站不允许持有缓存的数据,除非同时也持有了与数据相关的锁。所以基本上来说,不允许在没有锁保护的前提下缓存数据。从操作意义上来说,这意味着对于一个工作站来说,在它使用一个数据之前,它首先要从锁服务器获取数据的锁。只有当工作站持有锁了,工作站才会从 Petal 读取数据,并将数据放在缓存中。所以这里的顺序是,获得锁,之后再从 Petal 读取数据。所以,直到获取了锁,工作站是不能缓存数据的,要想缓存数据,工作站必须先持有锁,之后,才能从 Petal 读取数据。
如果你在释放锁之前,修改了锁保护的数据,那你必须将修改了的数据写回到Petal,只有在Petal确认收到了数据,你才可以释放锁,也就是将锁归还给锁服务器。所以这里的顺序是,先向Petal存储系统写数据,之后再释放锁。
最后再从工作站的lock表单中删除关文件的锁的记录和缓存的数据。