librelist archives

« back to archive

kgio_ext.so: [BUG] constant not a symbol or string

kgio_ext.so: [BUG] constant not a symbol or string

From:
Christopher Rigor
Date:
2013-12-27 @ 06:23
Hi,

When I start sidekiq from the command line, it runs correctly. When it is
started from monit, I get kgio_ext.so: [BUG] constant not a symbol or
string.

I'm using kgio 2.8.0 and ruby 2.0.0 p353.

I know monit doesn't set some environment variables but I didn't expect to
encounter an issue with Ruby internals if an environment variable is
missing.

Based on the backtrace "kgio-2.8.0/lib/kgio_ext.so(init_kgio_tryopen+0x1a9)
[0x7fe93d120359]" I found the code where the error came from.

http://repo.or.cz/w/kgio.git/blob/8be51237720fd18cb45188f29c717bbac0ca1964:/ext/kgio/tryopen.c#l173

1. Is this an error on kgio?
2. Did I give enough information to pinpoint the issue?
3. How can I debug this? What tools do you use for this kind of problems?

Regards,
Christopher

Re: [kgio] kgio_ext.so: [BUG] constant not a symbol or string

From:
Eric Wong
Date:
2014-01-16 @ 23:54
Ping!  Were you able to resolve this issue?  Thanks.

Re: [kgio] kgio_ext.so: [BUG] constant not a symbol or string

From:
Christopher Rigor
Date:
2014-02-04 @ 02:38
Sorry for the late reply Eric. Your first reply went to my spam folder.

We replaced the server and didn't see this issue again. The server is
set up the same way. We don't use RVM or similar.

Thanks for the patch. This will help in the future.

-Christopher

On Fri, Jan 17, 2014 at 7:54 AM, Eric Wong <normalperson@yhbt.net> wrote:
> Ping!  Were you able to resolve this issue?  Thanks.

Re: [kgio] kgio_ext.so: [BUG] constant not a symbol or string

From:
Eric Wong
Date:
2014-02-04 @ 03:04
Thanks for the response.  I suspect your issue was due to a stray
object file leftover/copied from a previous installation.

I'll commit that patch just in case and release 2.9.0

Re: [kgio] kgio_ext.so: [BUG] constant not a symbol or string

From:
Eric Wong
Date:
2013-12-27 @ 07:41
Christopher Rigor <crigor@gmail.com> wrote:
> When I start sidekiq from the command line, it runs correctly. When it is
> started from monit, I get kgio_ext.so: [BUG] constant not a symbol or
> string.

Can you verify this is the same instance of sidekiq and loading the same
libraries from the same paths?  Also, are you using RVM or rbenv or
similar?  Can you reproduce the issue without those?

> I'm using kgio 2.8.0 and ruby 2.0.0 p353.
> 
> I know monit doesn't set some environment variables but I didn't expect to
> encounter an issue with Ruby internals if an environment variable is
> missing.
> 
> Based on the backtrace "kgio-2.8.0/lib/kgio_ext.so(init_kgio_tryopen+0x1a9)
> [0x7fe93d120359]" I found the code where the error came from.
> 
http://repo.or.cz/w/kgio.git/blob/8be51237720fd18cb45188f29c717bbac0ca1964:/ext/kgio/tryopen.c#l173
> 
> 1. Is this an error on kgio?

Unlikely :>

> 2. Did I give enough information to pinpoint the issue?

Not yet, but we'll get there.

> 3. How can I debug this? What tools do you use for this kind of problems?

I suspect something is mixed up with the installation/loading via monit.
Most likely, the kgio you're loading is for a different version of Ruby
than what you're running.  Or (unlikely) something is monkeypatching
Errno.constants to return bogus output...

Since you're running Ruby 2.0, you should see an array of symbols
(and nothing else) from the following command:

	ruby -e 'p Errno.constants'

You can also try dumping Errno.constants at various places in the
sidekiq code.  Sorry, I'm not familiar with sidekiq; but hopefully
it's not mangling Errno.constants output under monit somehow.

Also, the following patch should give you a little more debug output:

--- a/ext/kgio/tryopen.c
+++ b/ext/kgio/tryopen.c
@@ -173,7 +173,12 @@ void init_kgio_tryopen(void)
 		switch (TYPE(err)) {
 		case T_SYMBOL: const_id = SYM2ID(err); break;
 		case T_STRING: const_id = rb_intern(RSTRING_PTR(err)); break;
-		default: rb_bug("constant not a symbol or string");
+		default: {
+			VALUE i = rb_inspect(err);
+			const char *s = StringValueCStr(i);
+
+			rb_bug("constant not a symbol or string: %s", s);
+			}
 		}
 
 		error = rb_const_get(rb_mErrno, const_id);