[Mono-dev] Garbage collection breaks Oracle client

warren.puziewicz at realtimeworlds.com warren.puziewicz at realtimeworlds.com
Wed Sep 30 10:05:32 EDT 2009


Hello,

 

We are building an application on Mono with an Oracle database.  We are currently using Mono 2.5 built from source in June.  We recently started testing the most recent build from source, and have discovered an issue between garbage collection and the Oracle client.   After a number of operations, a bind parameter will have a few extra bytes of garbage appended.  This does not happen on the earlier build.  It can be prevented on the latest build if the environment variable GC_DONT_GC is set.  Below is information on our environment, a section of an Oracle client side trace file with the bad data highlighted, code to reproduce the error.

 

Our platform is:

$ uname -s -r -v -p -i -o

Linux 2.6.18-92.1.13.el5 #1 SMP Wed Sep 24 19:32:05 EDT 2008 x86_64 x86_64 GNU/Linux

 

(Failure occurs on this version of Mono)

$ mono -V

Mono JIT compiler version 2.5 (/trunk/mono r142988 Wed Sep 30 13:19:23 BST 2009)

Copyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com

        TLS:           __thread

        GC:            Included Boehm (with typed GC and Parallel Mark)

        SIGSEGV:       altstack

        Notifications: epoll

        Architecture:  amd64

        Disabled:      none

 

(Works fine on this version of Mono)

$ mono -V

Mono JIT compiler version 2.5 (/trunk/mono r137147 Tue Jun 30 14:46:43 BST 2009)

Copyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com

        TLS:           __thread

        GC:            Included Boehm (with typed GC and Parallel Mark)

        SIGSEGV:       altstack

        Notifications: epoll

        Architecture:  amd64

        Disabled:      none

 

Oracle client libraries are: Instant Client 11.1.0.7.0 (x64)

 

==== The exception generated ====

Unhandled Exception: System.Data.OracleClient.OracleException: ORA-01722: invalid number

 

  at System.Data.OracleClient.Oci.OciStatementHandle.Execute (Boolean nonQuery, Boolean useAutoCommit, Boolean schemaOnly) [0x00000]

  at System.Data.OracleClient.Oci.OciStatementHandle.ExecuteNonQuery (Boolean useAutoCommit) [0x00000]

  at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal (System.Data.OracleClient.Oci.OciStatementHandle statement, Boolean useAutoCommit) [0x00000]

  at System.Data.OracleClient.OracleCommand.ExecuteNonQuery () [0x00000]

  at (wrapper remoting-invoke-with-check) System.Data.OracleClient.OracleCommand:ExecuteNonQuery ()

  at ADOTest.Program.ExecSQLTest2 (Int32 numRows) [0x00000]

  at ADOTest.Program.Main (System.String[] args) [0x00000]

 

==== Snippet from Oracle client trace file ====

2009-09-30 14:28:30.013678 : nsbasic_bsd:00 00 00 00 FE 40 49 4E  |....þ@IN|

2009-09-30 14:28:30.013696 : nsbasic_bsd:53 45 52 54 20 49 4E 54  |SERT.INT|

2009-09-30 14:28:30.013723 : nsbasic_bsd:4F 20 64 61 74 61 5F 74  |O.data_t|

2009-09-30 14:28:30.013742 : nsbasic_bsd:65 73 74 20 28 63 6F 6C  |est.(col|

2009-09-30 14:28:30.013770 : nsbasic_bsd:5F 6F 6E 65 2C 20 63 6F  |_one,.co|

2009-09-30 14:28:30.013788 : nsbasic_bsd:6C 5F 74 77 6F 2C 20 63  |l_two,.c|

2009-09-30 14:28:30.013806 : nsbasic_bsd:6F 6C 5F 74 68 72 65 65  |ol_three|

2009-09-30 14:28:30.013824 : nsbasic_bsd:29 20 56 41 4C 55 45 53  |).VALUES|

2009-09-30 14:28:30.013842 : nsbasic_bsd:20 28 3A 70 31 2C 0A 20  |.(:p1,..|

2009-09-30 14:28:30.013860 : nsbasic_bsd:3A 70 32 2C 20 3A 70 33  |:p2,.:p3|

2009-09-30 14:28:30.013878 : nsbasic_bsd:29 00 01 00 00 00 01 00  |).......|

[snipped]

2009-09-30 14:28:30.014297 : nsbasic_bsd:00 07 03 31 32 33 04 34  |...123.4|  <= length of bind var includes the bad byte

2009-09-30 14:28:30.014315 : nsbasic_bsd:35 36 16 03 37 38 39     |56..789 |  <= extra byte of garbage data

 

Starting at the 3rd byte of the next to last line:

"03 31 32 33" = 3 bytes, values "123"

"04 34 35 36 16" = 4 bytes, values "456" + 1 garbage byte

"37 38 39" = 3 bytes, values "789"

In this case, the second parameter (value '456') had an extra byte (0x16) appended.

 

 

==== To reproduce ====

using System;

using System.Data.OracleClient;

/*  Inserts requested number of rows into a table.

 

CREATE TABLE data_test (

  col_one NUMBER(10,0),

  col_two NUMBER(10,0),

  col_three NUMBER(10,0)

)

 

Compiled with:

 mcs program.cs -r:System.Data.OracleClient

 

Execute (fail):

 mono program.exe 500

 

Execute (succeed):

 GC_DONT_GC=YES mono program.exe 500

 

*/

namespace ADOTest

{

    class Program

    {

        private const string ConnStr = "SERVER=dev;User ID=testuser;Password=testuser;";

 

        static void ExecSQLTest2(int numRows)

        {

            OracleConnection conn = new OracleConnection(ConnStr);

            conn.Open();

 

            for (int i = 0; i < numRows; i++)

            {

                if ((i % 100) == 0)

                {

                  Console.Write(".");

                }

                OracleCommand cmd = conn.CreateCommand();

                cmd.CommandText = "INSERT INTO data_test (col_one, col_two, col_three) VALUES (:p1, :p2, :p3)";

 

                OracleParameter p1 = new OracleParameter("p1", OracleType.Number);

                OracleParameter p2 = new OracleParameter("p2", OracleType.Number);

                OracleParameter p3 = new OracleParameter("p3", OracleType.Number);

 

                p1.Value = 1;

                p2.Value = 1;

                p3.Value = 1;

                cmd.Parameters.Add(p1);

                cmd.Parameters.Add(p2);

                cmd.Parameters.Add(p3);

 

                cmd.ExecuteNonQuery();

            }

            conn.Close();

        }

 

        static void Main(string[] args)

        {

            int numRows =  System.Convert.ToInt16(args[0]);

            ExecSQLTest2(numRows);

            Console.WriteLine("Done.");

        }

    }

}

 

Warren Puziewicz

Database Architect

Realtime Worlds, Ltd

152 West Marketgait

Dundee DD1 1NJ

+44 (0) 01382 202821

 


____________________________________________________________________
Check out NEoN, a ground-breaking digital arts festival taking place in Dundee on 13th-14th November 2009
http://www.northeastofnorth.ning.com



DISCLAIMER

This message and any attachments contain privileged and confidential information intended for the use of the addressee named above. If you are not the intended recipient of this message, you are hereby notified that any use, dissemination, distribution or reproduction of this message is prohibited. Please note that we cannot guarantee that this message or any attachment is virus free or that it has not been intercepted and amended. The views of the author may not necessarily reflect those of Realtime Worlds Ltd.

 

Realtime Worlds Ltd is registered in Scotland, number 225628. Registered Office: 152 West Marketgait, Dundee, DD1 1NJ.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20090930/056ce038/attachment-0001.html 


More information about the Mono-devel-list mailing list