Thanks for your answer.

On Saturday, 5 November 2022, at 3:09 PM, ori wrote:
> The Tflush was successful: The Rflush does not indicate that a message was
cancelled, tit indicates that the server is no longer processing the request.

After your answer an read the manual pages a few times again and now I 
understand what to do :

1) All Tflush messages get a Rflush reply. If more than one Tflush arrives 
answering the last one means responding to all of them, like the manual states 
here :

"A Rflush for any of the multiple Tflushes implies an answer for all previous 
ones. Therefore, should a server receive a request and then multiple flushes 
for that request, it need respond only to the last flush."

2)Even when oldtag doesn't represent an active message Tflush gets a Rflush 
response. 

3) The only indicator for the client if his Tflush didn't interrupt (!!!) an 
active message cycle is (manual page) :

If a response to the flushed request is received before the Rflush, the client 
must honor the response as if it had not been flushed, since the completed 
request may signify a state change in the server. For instance, Tcreate may 
have created a file and Twalk may have allocated a fid. If no response is 
received before the Rflush, the flushed transaction is considered to have been 
canceled, and should be treated as though it had never been sent.

interpreted as : 

a) Server replies to oldtag before sending Rflush ==> indicates oldtag wasn't 
interrupted
b) Server sends Rflush before responding to oldtag ==> indicates oldtag-message 
was interrupted

4) Its legal that a client sends Tflush messages with an invalid oldtag for 
which it can expect an Rflush as response never an Rerror (manual) :

The server should answer the flush message immediately. If it recognizes oldtag 
as the tag of a pending transaction, it should abort any pending response and 
discard that tag. In either case, it should respond with an Rflush echoing the 
tag (not oldtag) of the Tflush message. A Tflush can never be responded to by 
an Rerror message.


Now my interpretation of Tflush and Rflush quite changed :

It seems that Tflush has at least two functions : 

(1) Interrupt a running message, while the probability to interrupt a running 
message is very small. 
(2) Polling the fileserver and guessing how it is implemented. A server with a 
simple sequential message processiong won't be able to respond to a Tflush by 
Rflush before responding to oldtag. A server which only replies to the n-th 
Tflush would be lagging and uses a message queue.

Consequences for my implementation :

1) Its not an error if Tflush uses an invalid oldtag even using the ntag of 
Tflush as oldtag would be valid.
2) Every Tflush gets an Rflush directly or indirectly (response to the last in 
a series is enough)
3) Tflush can be used/abused to measure the fileserver performance. Send a 
message and flush it to measure the time needed to process it. Send n messages 
and measure the response time-differences, aso.
4) Tflush is not related with transactions but has to be taken as a rollback if 
sent for an oldtag that interrupts a running write operation.


Thanks ori for your clear answers i got the right hints to check my 
understanding. And I had a misunderstanding regarding tflush till now so I 
needed to ask ;)

------------------------------------------
9fans: 9fans
Permalink: 
https://9fans.topicbox.com/groups/9fans/T04e11fe14739da68-Ma697c45ddea03254971a41da
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

Reply via email to