Re: FreeTDS and buffering on client side
LacaK <[email protected]> Thu, 26 Oct 2017 10:40:31 +0200
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <[email protected]> |
>> Thank you very much Frediano, >> >> now , when I increase number of rows in table I can reproduce network >> failure. >> >> But behavior is other than I have expected. >> >> I was expecting, that dbnextrow() will return FAIL, but it seems, that call >> to dbnextrow() never returns ... it freezes somewhere in dblib.dll >> (I can not debug more because I use dblib.dll from Pascal program) >> >> Is it expected behavior? >> >> L. >> > No, should return an error. > TDSDUMP could help. I have recompiled dblib from todays git master to ensure that problem persist. And yes persists. When rows are reading in loop and I unplug network cable loop stops. When I plug-in cable in few seconds loop continues and rows are returned. But when I unplug for longer time say 1 minute loop does not continue and program freezes. Then I must force end of program. Here are last lines in tdsdump (nothing special IMO): Whole dump has 265MB (as I transfer big rows with TEXT fields) 10:29:32.620 (dblib.c:2064):dbnextrow(032F9D10) 10:29:32.620 (dblib.c:2070):dbnextrow() dbresults_state = 2 (_DB_RES_RESULTSET_ROWS) 10:29:32.620 (token.c:532):tds_process_tokens(032F14A8, 015BFDE0, 00000000, 0x1508) 10:29:32.620 (util.c:165):Changed query state from PENDING to READING 10:29:32.620 (token.c:547):processing result tokens. marker is d2(NBC_ROW) 10:29:32.620 (token.c:1969):tds_process_nbcrow(): reading column 0 10:29:32.620 (data.c:740):tds_get_data: type 56, varint size 0 10:29:32.620 (data.c:784):tds_get_data(): wire column size is 4 10:29:32.620 (token.c:1969):tds_process_nbcrow(): reading column 1 10:29:32.620 (data.c:740):tds_get_data: type 56, varint size 0 10:29:32.620 (data.c:784):tds_get_data(): wire column size is 4 10:29:32.620 (token.c:1969):tds_process_nbcrow(): reading column 2 10:29:32.620 (data.c:740):tds_get_data: type 39, varint size 2 10:29:32.620 (data.c:784):tds_get_data(): wire column size is 4 10:29:32.620 (token.c:1969):tds_process_nbcrow(): reading column 3 10:29:32.620 (token.c:1969):tds_process_nbcrow(): reading column 4 10:29:32.620 (data.c:740):tds_get_data: type 35, varint size 4 10:29:32.620 (data.c:784):tds_get_data(): wire column size is 5000 10:29:32.620 (packet.c:640):Received packet ...follows binary dump of packet Thank you L. >>>> Hi *, >>>> >>>> I would like to ask how FreeTDS performs buffering on client side. >>>> I use dblib as my client library (I do not set there DBBUFFER using >>>> "dbsetopt") >>>> >>>> I am trying simulate network failure in such way: >>>> 1. connect to MS SQL Server using dbopen() >>>> 2. I send SQL select using dbcmd(), dbsqlexec() >>>> 3. then I call dbresults() >>>> 4. here I pause program and unplug network cable to simulate network >>>> error >>>> 5. next I process rows in loop calling dbnextrow() >>>> >>>> Strange thing is that I can perform step 5 also when network cable is >>>> unpluged. So I have suspection, that all rows from select are already >>>> somewhere on client side. Probably handled already by underlaying libtds >>>> ? >>>> >>>> What is going to happen? Why I can still read rows when there is already >>>> broken network connection ? >>>> Thanks >>>> >>>> -Laco. >>>> >>> There are a lot of caching in between. >>> The server execute the query and starts sending back results. >>> Probably the results you are expecting are already sent by the server >>> when you disconnect the cable and are in the tcp socket buffer ready >>> to be parsed from your program. Try to return 1000000 rows and at >>> some point the program will fail (unless connection is really fast and >>> network buffer is big enough!). >>> >>> Frediano >>> _______________________________________________ >>> FreeTDS mailing list >>> [email protected] >>> https://lists.ibiblio.org/mailman/listinfo/freetds >>> >> _______________________________________________ >> FreeTDS mailing list >> [email protected] >> https://lists.ibiblio.org/mailman/listinfo/freetds > _______________________________________________ > FreeTDS mailing list > [email protected] > https://lists.ibiblio.org/mailman/listinfo/freetds >