Project

General

Profile

Actions

Bug #9514

closed

Huge query crash ruby core

Added by waghanza (Marwan Rabbâa) about 10 years ago. Updated about 10 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p353
[ruby-core:60666]

Description

Hi,

I have made a query on a [[http://teradata.com|terradata]] server using https://github.com/priviterag/teradata-cli

The result output is a CSV file containing at least a billing of lines (unicode).

After a few hours, I have the following stack

    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1055: [BUG] object allocation during garbage collection phase
    ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
    -- Control frame information -----------------------------------------------
    c:0022 p:---- s:0097 e:000096 CFUNC  :[]=
    c:0021 p:0027 s:0092 e:000091 BLOCK  /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1055 [FINISH]
    c:0020 p:---- s:0089 e:000088 CFUNC  :each
    c:0019 p:0011 s:0086 e:000085 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:766
    c:0018 p:0019 s:0082 E:000340 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1053
    c:0017 p:0023 s:0076 e:000075 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1047 [FINISH]
    c:0016 p:---- s:0071 e:000070 CFUNC  :new
    c:0015 p:0054 s:0066 e:000065 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:784
    c:0014 p:0090 s:0060 e:000059 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:696 [FINISH]
    c:0013 p:---- s:0055 E:002200 CFUNC  :map
    c:0012 p:0026 s:0052 E:000bc8 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:714
    c:0011 p:0061 s:0049 E:0017e8 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:178
    c:0010 p:0009 s:0044 e:000043 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:195
    c:0009 p:0010 s:0040 e:000039 BLOCK  /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/querify.rb:17
    c:0008 p:0223 s:0036 E:000e80 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:71 [FINISH]
    c:0007 p:---- s:0028 e:000027 CFUNC  :new
    c:0006 p:0017 s:0023 e:000022 METHOD /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:38
    c:0005 p:0083 s:0018 E:000d70 METHOD /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/querify.rb:16
    c:0004 p:0030 s:0012 e:000011 TOP    /usr/local/share/gems/gems/tdsql-0.2/bin/tdsql:4 [FINISH]
    c:0003 p:---- s:0010 e:000009 CFUNC  :load
    c:0002 p:0134 s:0006 E:001dd8 EVAL   /usr/local/bin/tdsql:23 [FINISH]
    c:0001 p:0000 s:0002 E:0021f8 TOP    [FINISH]
    /usr/local/bin/tdsql:23:in `'
    /usr/local/bin/tdsql:23:in `load'
    /usr/local/share/gems/gems/tdsql-0.2/bin/tdsql:4:in `'
    /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/querify.rb:16:in `exec'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:38:in `connect'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:38:in `new'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:71:in `initialize'
    /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/querify.rb:17:in `block in exec'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:195:in `entries'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:178:in `execute_query'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:714:in `fetch_all'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:714:in `map'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:696:in `each_record'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:784:in `unmarshal'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:784:in `new'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1047:in `initialize'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1053:in `build_name_index'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:766:in `each_column'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:766:in `each'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1055:in `block in build_name_index'
    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1055:in `[]='
    -- C level backtrace information -------------------------------------------
    -- Other runtime information -----------------------------------------------
    * Loaded script: /usr/local/bin/tdsql
    * Loaded features:
    0 enumerator.so
    1 /usr/lib64/ruby/enc/encdb.so
    2 /usr/lib64/ruby/enc/trans/transdb.so
    3 /usr/lib64/ruby/rbconfig.rb
    4 /usr/local/share/ruby/site_ruby/rubygems/compatibility.rb
    5 /usr/local/share/ruby/site_ruby/rubygems/defaults.rb
    6 /usr/local/share/ruby/site_ruby/rubygems/deprecate.rb
    7 /usr/local/share/ruby/site_ruby/rubygems/errors.rb
    8 /usr/local/share/ruby/site_ruby/rubygems/version.rb
    9 /usr/local/share/ruby/site_ruby/rubygems/requirement.rb
    10 /usr/local/share/ruby/site_ruby/rubygems/platform.rb
    11 /usr/local/share/ruby/site_ruby/rubygems/basic_specification.rb
    12 /usr/local/share/ruby/site_ruby/rubygems/stub_specification.rb
    13 /usr/local/share/ruby/site_ruby/rubygems/util/stringio.rb
    14 /usr/local/share/ruby/site_ruby/rubygems/specification.rb
    15 /usr/local/share/ruby/site_ruby/rubygems/exceptions.rb
    16 /usr/share/rubygems/rubygems/defaults/operating_system.rb
    17 /usr/local/share/ruby/site_ruby/rubygems/core_ext/kernel_gem.rb
    18 /usr/share/ruby/thread.rb
    19 /usr/share/ruby/monitor.rb
    20 /usr/local/share/ruby/site_ruby/rubygems/core_ext/kernel_require.rb
    21 /usr/local/share/ruby/site_ruby/rubygems.rb
    22 /usr/local/share/ruby/site_ruby/rubygems/path_support.rb
    23 /usr/local/share/ruby/site_ruby/rubygems/dependency.rb
    24 /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/version.rb
    25 /usr/share/ruby/forwardable.rb
    26 /usr/share/ruby/English.rb
    27 /usr/lib64/ruby/date_core.so
    28 /usr/share/ruby/date/format.rb
    29 /usr/share/ruby/date.rb
    30 /usr/lib64/ruby/stringio.so
    31 /usr/share/ruby/csv.rb
    32 /usr/share/ruby/vendor_ruby/psych/syntax_error.rb
    33 /usr/lib64/ruby/vendor_ruby/psych.so
    34 /usr/share/ruby/vendor_ruby/psych/nodes/node.rb
    35 /usr/share/ruby/vendor_ruby/psych/nodes/stream.rb
    36 /usr/share/ruby/vendor_ruby/psych/nodes/document.rb
    37 /usr/share/ruby/vendor_ruby/psych/nodes/sequence.rb
    38 /usr/share/ruby/vendor_ruby/psych/nodes/scalar.rb
    39 /usr/share/ruby/vendor_ruby/psych/nodes/mapping.rb
    40 /usr/share/ruby/vendor_ruby/psych/nodes/alias.rb
    41 /usr/share/ruby/vendor_ruby/psych/nodes.rb
    42 /usr/share/ruby/vendor_ruby/psych/streaming.rb
    43 /usr/share/ruby/vendor_ruby/psych/visitors/visitor.rb
    44 /usr/lib64/ruby/strscan.so
    45 /usr/share/ruby/vendor_ruby/psych/scalar_scanner.rb
    46 /usr/share/ruby/vendor_ruby/psych/visitors/to_ruby.rb
    47 /usr/share/ruby/vendor_ruby/psych/visitors/emitter.rb
    48 /usr/share/ruby/vendor_ruby/psych/visitors/yaml_tree.rb
    49 /usr/share/ruby/vendor_ruby/psych/json/ruby_events.rb
    50 /usr/share/ruby/vendor_ruby/psych/visitors/json_tree.rb
    51 /usr/share/ruby/vendor_ruby/psych/visitors/depth_first.rb
    52 /usr/share/ruby/vendor_ruby/psych/visitors.rb
    53 /usr/share/ruby/vendor_ruby/psych/handler.rb
    54 /usr/share/ruby/vendor_ruby/psych/tree_builder.rb
    55 /usr/share/ruby/vendor_ruby/psych/parser.rb
    56 /usr/share/ruby/vendor_ruby/psych/omap.rb
    57 /usr/share/ruby/vendor_ruby/psych/set.rb
    58 /usr/share/ruby/vendor_ruby/psych/coder.rb
    59 /usr/share/ruby/vendor_ruby/psych/core_ext.rb
    60 /usr/share/ruby/vendor_ruby/psych/deprecated.rb
    61 /usr/share/ruby/vendor_ruby/psych/stream.rb
    62 /usr/share/ruby/vendor_ruby/psych/json/yaml_events.rb
    63 /usr/share/ruby/vendor_ruby/psych/json/tree_builder.rb
    64 /usr/share/ruby/vendor_ruby/psych/json/stream.rb
    65 /usr/share/ruby/vendor_ruby/psych/handlers/document_stream.rb
    66 /usr/share/ruby/vendor_ruby/psych.rb
    67 /usr/share/ruby/yaml.rb
    68 /usr/share/ruby/logger.rb
    69 /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql/querify.rb
    70 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/version.rb
    71 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/exception.rb
    72 /usr/local/lib64/gems/ruby/teradata-cli-0.0.12/teradata-cli/cli.so
    73 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/cli.rb
    74 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/utils.rb
    75 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb
    76 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/dbobject.rb
    77 /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli.rb
    78 /usr/local/share/gems/gems/tdsql-0.2/lib/tdsql.rb
    79 /usr/lib64/ruby/enc/utf_16le.so
    80 /usr/lib64/ruby/enc/utf_16be.so

I do not know what happen and I'll try to do this with an other way (I just want to report this)

Updated by normalperson (Eric Wong) about 10 years ago

wrote:

I have made a query on a [[http://teradata.com|terradata]] server using https://github.com/priviterag/teradata-cli

    /usr/local/share/gems/gems/teradata-cli-0.0.12/lib/teradata-cli/connection.rb:1055:
[BUG] object allocation during garbage collection phase

It is likely the following in ext/teradata-cli/cli/cli.c:

  static void
cli_free(struct rb_cli *p)
{
  if (p->logging_on) {
    logoff(p, Qtrue);
  }
}

Maybe if disabling logging will avoid calling the logoff function,
you won't hit the [BUG].

The logoff function is not safe to call inside the GC free phase
since it uses rb_raise:

  static void
logoff(struct rb_cli *p, VALUE force)
{
  Int32 status;
  char dummy[4] = {0, 0, 0, 0};

  p->dbcarea.func = DBFDSC;
  DBCHCL(&status, dummy, &p->dbcarea);
  if (!force && status != EM_OK) {
    rb_raise(CLIError, "CLI error: [%s] %s",
	status_name(status), p->dbcarea.msg_text);
  }
  p->logging_on = Qfalse;
}

I do not know the non-Ruby API at all, so DBCHCL/DBFDSC macros /may/
not be safe, either.

Can you contact the teradata-cli authors and forward this to them?
I don't know anything about teradata-cli and do not have time to test.

0 enumerator.so
1 /usr/lib64/ruby/enc/encdb.so
2 /usr/lib64/ruby/enc/trans/transdb.so
27 /usr/lib64/ruby/date_core.so
30 /usr/lib64/ruby/stringio.so
33 /usr/lib64/ruby/vendor_ruby/psych.so
44 /usr/lib64/ruby/strscan.so
72 /usr/local/lib64/gems/ruby/teradata-cli-0.0.12/teradata-cli/cli.so
79 /usr/lib64/ruby/enc/utf_16le.so
80 /usr/lib64/ruby/enc/utf_16be.so</pre>

The rest of the C extensions you have look to be in the standard distro,
so teradata-cli/cli.so was the most likely candidate to look for bugs
in.

Updated by drbrain (Eric Hodel) about 10 years ago

  • Category deleted (core)
  • Status changed from Open to Third Party's Issue
Actions

Also available in: Atom PDF

Like0
Like0Like0