[ 
https://issues.apache.org/jira/browse/THRIFT-1700?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13469320#comment-13469320
 ] 

Maxim Korobov edited comment on THRIFT-1700 at 10/4/12 11:23 PM:
-----------------------------------------------------------------

??I finally got to see your code...??

We use C# for client. Seems like thrift don't generates async wrappers for sync 
methods when using C#. So we made our hand-made task-based wrappers. Here they 
are:

{code:title=C#}
        public void GetStream (GetStreamAction action, Action <StreamContent> 
onSuccess = null,
                               Action <Exception> onError = null)
        {
                        factory.StartNew<StreamContent> (() => {
                try {
                    ConnectIfNeed ();
                    
                    var result = Client.getStream (action);

                    if (onSuccess != null)
                        onSuccess (result);
                    
                    return result;
                } catch (Exception e) {
                    if (onError != null)
                        onError (e);
                    return null;
                }
            } 
            );
        }
{code}

{code:title=thrift}
struct GetStreamAction {
    1: string authKey
    2: commons.StreamId streamId
    3: optional commons.Cursor cursor
}

commons.StreamContent getStream( 1 : GetStreamAction action ) throws (1: 
BackendException ex)
{code}

??It seems like your frame is just too big :)??
??You'd have to change ReadAll as well in order to be able to read a uint or 
you will get a negative value when casing it back to int.??

I will try it out.

??Anyway, it would "only" allow you to read another 2 million bytes, is it 
enough for you???

2 billions, maybe?

??did you try with the buffered transport? and what is the other target 
language?  actually it should NOT send a size bigger than int.Max!??

I will try it out. Our colleagues at server-side uses Java+Scala.
                
      was (Author: maximkorobov):
    ??I finally got to see your code...??

We use C# for client. Seems like thrift don't generates async wrappers for sync 
methods when using C#. So we made our hand-made task-based wrappers. Here it is:

{code:title=C#}
        public void GetStream (GetStreamAction action, Action <StreamContent> 
onSuccess = null,
                               Action <Exception> onError = null)
        {
                        factory.StartNew<StreamContent> (() => {
                try {
                    ConnectIfNeed ();
                    
                    var result = Client.getStream (action);

                    if (onSuccess != null)
                        onSuccess (result);
                    
                    return result;
                } catch (Exception e) {
                    if (onError != null)
                        onError (e);
                    return null;
                }
            } 
            );
        }
{code}

{code:title=thrift}
struct GetStreamAction {
    1: string authKey
    2: commons.StreamId streamId
    3: optional commons.Cursor cursor
}

commons.StreamContent getStream( 1 : GetStreamAction action ) throws (1: 
BackendException ex)
{code}

??It seems like your frame is just too big :)??
??You'd have to change ReadAll as well in order to be able to read a uint or 
you will get a negative value when casing it back to int.??

I will try it out.

??Anyway, it would "only" allow you to read another 2 million bytes, is it 
enough for you???

2 billions, maybe?

??did you try with the buffered transport? and what is the other target 
language?  actually it should NOT send a size bigger than int.Max!??

I will try it out. Our colleagues at server-side uses Java+Scala.
                  
> Number overflow in ReadFrame.
> -----------------------------
>
>                 Key: THRIFT-1700
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1700
>             Project: Thrift
>          Issue Type: Bug
>          Components: C# - Library
>    Affects Versions: 0.8
>            Reporter: Alexey
>
> private void ReadFrame()
> {
>       byte[] i32rd = new byte[header_size];
>       transport.ReadAll(i32rd, 0, header_size);
>       int size =
>               ((i32rd[0] & 0xff) << 24) |
>               ((i32rd[1] & 0xff) << 16) |
>               ((i32rd[2] & 0xff) <<  8) |
>               ((i32rd[3] & 0xff));
>       byte[] buff = new byte[size];
>       transport.ReadAll(buff, 0, size);
>       readBuffer = new MemoryStream(buff);
> }
> Here, when calculating size, number overflow throws sometimes.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to