Shaun,
This is extremely helpful. In fact it would make a great addition to the
traffic server on line documentation. Personally I prefer to understand what
the methods I am calling do rather than not.
The one question that remains unanswered is whether or not this method needs to
be called more than once.
The reason for my question is this:
I have a transform which essentially prepends and postpends content to the
upstream content being served. It works in states
STATE_START = write the prefix content downstream and shift to STATE_MIDDLE.
STATE_MIDDLE = copy upstream content to downstream until there is no
more content and then shift to STATE_END.
STATE_END = write the suffix content downstream and shift to STATE_EXIT.
STATE_EXIT = clean up the transaction and shut down the VIO's because
were done.
This plugin works with smaller upstream content as expected. However when the
upstream content gets larger than about 30K, what I am seeing is that from the
transform plugin's perspective it is working as expected. The expected amount
of data is being copied downstream and the suffix is being written. I can tell
this because I am logging the values of upstream_avail, upstream_todo,
bytesWritten etc. And everything adds up to all content being delivered.
However the client is receiving truncated content and I am baffled as to why
this my be happening. I thought that maybe I was not properly using the
TSVConnWrite method but from your explanation of the method below, it would
seem that this is possibly not the case.
At any rate,
Thank you for the explanation.
Best Regards,
Steve Owens
From: Shaun mcginnity
<[email protected]<mailto:[email protected]>>
Reply-To:
"[email protected]<mailto:[email protected]>"
<[email protected]<mailto:[email protected]>>
Date: Fri, 15 Mar 2013 07:09:12 -0700
To: "[email protected]<mailto:[email protected]>"
<[email protected]<mailto:[email protected]>>
Subject: Re: API Question
Hi Steve,
TSVConnWrite initiates a write operation on the transform's downstream
VConnection. The last parameter is the total amount of data you are going to
write. INT64_MAX is effectively unlimited.
When you have data to write you get the VIO's buffer
(TSVIOBufferGet(output_vio)), and copy the data into it. Then the VIO is
reenabled. Reenabling the VIO causes an IMMEDIATE event to be sent to the VIO's
VConnection. When the VConnection's event handler has finished with the data it
will call your continuation back. If it expects you to send more data it will
pass a WRITE_READY event. If you have given the VIO the total amount of data as
set in TSVConnWrite it will call you back with a WRITE_COMPLETE event.
Thisbehaviour is the same as what the transform should do to its input VIO.
Since the downstream VConnection is the client and / or cache, if you do a
finite write, i.e. not INT64_MAX, then the HTTP transaction will close when the
limit is reached. Issuing another write in this case will probably not work.
You can do multiple writes on a NetVConnection though, e.g. as provided by
TSNetConnect.
Hope that helps.
Shaun
-----Original Message-----
From: James Peach [mailto:[email protected]]
Sent: Friday, March 15, 2013 3:12 AM
To: [email protected]<mailto:[email protected]>
Subject: Re: API Question
On 14/03/2013, at 5:13 PM, "Owens, Steve"
<[email protected]<mailto:[email protected]>> wrote:
> In looking at the following documentation:
> http://trafficserver.apache.org/docs/trunk/sdk/io-guide/transformations.en.html
>
> It would seem that the only mention of TSVConnWrite is to a single parameter
> method.
>
> Yet in my plugin I am using
>
> data->output_vio = TSVConnWrite(output_conn, contp, data->output_reader,
> INT64_MAX);
>
> What has changed about this method?
>
> What does it actually do?
It schedules data to be written to the VConnection.
>
> Do I need to call it every time the plugin is re-enabled? Or can I just call
> it once?
I don't know that I really understand the question, but if the length is
INT64_MAX you would only call it once. If you want you cancall it a multiple
times with shorter lengths.
J