Somebody started to need that :)
oneway calls were just a "half" of normal call, when they should be treated differently - like in Steven's zeromq integration or Ben's pass-through server. oneways are a really nice feature of thrift, so it would be nice to make them work properly. Also - if thrift already defines "4 / oneway" as additional message type it should use it :)

Konrad

On 16.09.2014 19:49, Jens Geyer wrote:

Seems as if nobody really needs it?


-----Ursprüngliche Nachricht----- From: Konrad Grochowski
Sent: Tuesday, September 16, 2014 2:49 PM
To: [email protected]
Subject: Re: oneway Thrift version 0.9.1 oneway flag generates regular T_CALL as opposed to T_ONEWAY with c++ code

I've updated generators for other langs, unfortunately I had to fill new
issues:

https://issues.apache.org/jira/browse/THRIFT-2706
https://issues.apache.org/jira/browse/THRIFT-2707
https://issues.apache.org/jira/browse/THRIFT-2708

seems that "oneway" message type was never fully supported.

Konrad

On 16.09.2014 13:25, Konrad Grochowski wrote:
As I haven't change the way things are encoded, just fixed decoding procedure, no protocol version change is needed (imho).

But still - old server with old decoding procedures may not support oneway methods sent by new clients in compact protocol.

Konrad

On 16.09.2014 13:20, Steven Varga wrote:
Hi Konrad,

I can confirm both of your results; TDenseProtocol failed all my tests as
well  -- therefore I didn't take a closer look at it; will look at
TCompactProtocol correction as soon as I can.

Also wondering that how you folks handle such changes:  With bumping up
protocol version to avoid mismatch with other implementations or there are
other less obvious solutions?

These changes are great because allows filtering on message types; ZeroMq
is very sensitive to such.



On Tue, Sep 16, 2014 at 7:06 AM, Konrad Grochowski <[email protected]>
wrote:

Steven,

Dense protocol fails tests as it does not support messages at all :)
Compact protocol should be fixed now, awaiting CI results and merge.

Konrad


On 16.09.2014 12:56, Konrad Grochowski wrote:

Pushed fix for Compact protocol, moving to Dense :)

Can somebody check have I missed any lang?

Konrad

On 16.09.2014 12:17, Konrad Grochowski wrote:

got it:

is:
messageType = (TMessageType)((versionAndType >> TYPE_SHIFT_AMOUNT) &
0x03);

should be:
messageType = (TMessageType)((versionAndType >> TYPE_SHIFT_AMOUNT) &
0x07);

as TYPE_MASK = 0xE0 // 1110 0000 - 3bits, 0x03 - 2bits

I'll commit it as soon as I check all other impl of compact protocol


W dniu 2014-09-16 12:01, Konrad 'Hcorg' Grochowski pisze:

I was able to reproduce Steven's problem. Seems that T_ONEWAY encodes badly in Compact protocol: "Thrift: Tue Sep 16 11:54:30 2014 received
invalid message type 0 from client"

I'll debug all those shifts and masks etc, hopefully it's a programming mistake, not protocol issue (T_ONEWAY == 4 and there are 4 bits for message
type, so everything should be ok...)

Konrad

W dniu 2014-09-15 15:07, Ben Craig pisze:

Looks like an oversight to me. The server side of the generated code
in
C++ respects T_ONEWAY and T_CALL.

Coincidentally, someone at my company was likely going to run into this issue in about three weeks. They are doing some fancy pass-through
server

stuff, and as a 'server' without access to a specific .thrift file,
they
need to know whether to wait as a 'client' when passing an RPC. They
were

planning on looking at the message type to figure that out.

I've looked at your commit, but have not tested it. +0.9.

Konrad Grochowski <[email protected]> wrote on 09/14/2014 09:08:28
AM:

  From: Konrad Grochowski <[email protected]>
To: [email protected],
Date: 09/14/2014 09:09 AM
Subject: ODP: Re: oneway Thrift version 0.9.1 oneway flag generates
regular T_CALL as opposed to T_ONEWAY with c++ code

I suspected that something will break - that's why I submited pull
req to see what will Travis say :)

I'll look further into it, also I hope for some explaining comments
to issue from devs ;)

Konrad

-------- Oryginalna wiadomość --------
Od: Steven Varga <[email protected]>
Data:14.09.2014  14:41  (GMT+01:00)
Do: [email protected]
Temat: Re: oneway Thrift version 0.9.1 oneway flag generates regular
T_CALL as opposed to T_ONEWAY with c++ code

Hello Konrad,

I looked at the patch but it only resolves the issue posted; and may

lead

to deeper problems:
Whereas TBinaryProtocol is ok with T_ONEWAY flag, TCompactProtocol

seems

to have a different way of handling things [it filters it out?], and TDenseProtocol also failed test but I didn't follow up with that and

the

rest of the provided protocols.

steve

On Sun, Sep 14, 2014 at 7:19 AM, Konrad 'Hcorg' Grochowski <
[email protected]> wrote:

I've created issue https://issues.apache.org/jira/browse/THRIFT-2704
and
submited patch, maybe it'll get accepted :)
W dniu 2014-09-12 18:25, Randy Abernethy pisze:

   +1

On Sep 12, 2014 8:13 AM, "Nevo Hed" <[email protected]>
wrote:

   Steven

I can confirm that for my oneway messages I observe the same T_CALL

(I
have
not looked into why)

The difference is that one way messages have fooClient::bar that

just
call
send_bar and if it was not oneway it would call send_bar AND

recv_bar
Now realize that you do not have to use the RPC mechanism at all -
you
could just serialize objects into your messages, perhaps with a
custom
header (there may be something supported already). This is what we
have
been doing since thrift0.6.x for SOME of our connections - for that
case
we
do not even define a service, just objects and an enumeration of

messages
On Fri, Sep 12, 2014 at 8:31 AM, Steven Varga
<[email protected]>
wrote:
   Hi,

the following service generates oneway RPC call flagged with
T_CALL

flag
as
  opposed to expected T_ONEWAY; I need the T_ONEWAY flag to
implement

  proper
  zero MQ message passing. Zero MQ message passing system
differentiates
between request - reply patterns and push - pull ones at socket
level;
Am I doing something wrong ?
best,
steve

service foo {
          oneway void bar( 1:string value );
}

void fooClient::put( const std::string& value ) {
send_bar( value ); // <- this is correct that recv_xxx is

missing
}
// ----- incorrect or unreasoned T_CALL instead of T_ONEWAY
void fooClient::send_bar(const std::string& value) {
     int32_t cseqid = 0;
     oprot_->writeMessageBegin("bar",

::apache::thrift::protocol::T_CALL,
cseqid);
    ....
}

------ EXAMPLE -----
service foo {
       oneway void bar( 1:string value );
}

------------- response excerpt ----------

void fooClient::bar(const std::string& value)
{
     send_bar(value);
}

void fooClient::send_bar(const std::string& value)
{
     int32_t cseqid = 0;
     oprot_->writeMessageBegin("bar",

::apache::thrift::protocol::T_CALL,
cseqid);
     foo_bar_pargs args;
     args.value = &value;
     args.write(oprot_);

     oprot_->writeMessageEnd();
oprot_->getTransport()->writeEnd();
oprot_->getTransport()->flush();
}






Reply via email to