# Create file ![afs-cb-0][1] 1. create file on *host d* * data version (dv) = 1 * callback registration 2. read on *hosts a,b,c* 3. fetch-states 4. add callback at fileserver # Replicate file ![afs-cb-1][2] hello.c propagates to *hosts a,b,c* from fileserver. Callbacks are registered for a period of time. Callbacks notify a host if a change occurs. # Modify file ![afs-cb-2][3] host a modifies the file. 1. open, write, close on *host a* 2. store-data 3. callbacks *b,c,d* are called * "break" callbacks once called (i.e. remove them from the table once called) 4. reply *dv=2* for *host a* * incremented at the *fileserver* # Read stale file ![afs-cb-3][4] read a stale file on *host c*. 1. open, read on *host c* 2. fetch-status * returns *dv=2* > local cached *dv=1* 3. fetch-data *dv=2* for *host c* * registers callback for the file on *host c* # Callback expires ![afs-cb-4][5] 1. callbacks *a,c* expire. 2. read file on *host c* 3. fetch-status * returns *dv=2* == local cached *dv* * registers a new callback for the file on *host c* with *fileserver* 4. new callback. cached data so local data is used. # Callback failure ![afs-cb-5][6] a common failure mode: callback to host fails 1. write, close on *host a* 2. store-data 3. callback (fails) 4. store-data reply * *fileserver* increments *dv=3* 5. delayed callback (fails until it does not) 6. callback expires (read fails) [1]: /diagrams/afs-cb-0.png "Create file" [2]: /diagrams/afs-cb-1.png "Replicate file" [3]: /diagrams/afs-cb-2.png "Modify file" [4]: /diagrams/afs-cb-3.png "Read stale file" [5]: /diagrams/afs-cb-4.png "Callback expires" [6]: /diagrams/afs-cb-5.png "Callback failure"