2017-06-23 58 views
1

我们在过去的几周内重新定位了我们的服务器,并且随机(但是太频繁地)发生了跟踪错误。随机看到“解决方法时发现存根”???“在“XXX”包中重载“”“”

dbix verison现在是0.082820,之前是0.08250,但未出现此错误。

“在解析方法中找到存根”???“overloading”“”“在包中”XXX“位于/home/perlbrew/.perlbrew/libs/[email protected]/lib/perl5/ DBIx/Class/Row.pm 1250行“。

包XXX

有这可能与

use Class::Trait qw(TPrintable ); 

sub inflate_result { 
    my $self = shift; 
    my $ret = $self->next::method(@_); 
    my $typeCd = $ret->typeCd; 
    given ($typeCd) { 
     when($specialTypeCd) { 
      $self->ensure_class_loaded($specialSubClass); 
      bless ($ret, $specialSubClass); 
     } 
     default { 
      bless ($ret, $self); 
     } 
    } 
    return $ret; 
} 

代码引进包XXX有一个辅助方法做:

my $theY = $c->model('DB::Y')->find($yID, 
    { 
     prefetch => [ { 'xxxs' => 'typecd' } , 'zid' ] 
    }); 

return $theY; 

思考的问题是什么;如何使其一致以提交错误报告。

我们已经知道在Abstract.pm 潜在的解决方法SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION = 1

+0

有在'SQL :: Abstract'中是[this comment](https://github.com/dbsrgits/sql-abstract/blob/ca4f826a37ccb5194b0b5b9b4190b4007d647d9c/lib/SQL/Abstract.pm#L100),但这并不意味着问题是在'SQL :: Abstract'中。 –

+2

另外,就我所见,CPAN上没有版本“0.082820”。这再次强调了在升级生产库之前进行广泛测试的必要性。 –

+0

@SinanÜnür没有注意到我们的0.082820不是最新的好产品。 (我正在读它作为当前最新的0.082840)感谢您花时间看。 – melutovich

回答

0

一个建议一个人谁修复选择保持匿名 (这是不够的,我们在我们的Perl 5.16.3)

我们结束了切换到perl 5.26,问题消失了。 (我们被告知:“你是不太可能:5.18大修大量超载内部的”)

diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm 
index 264b0b1..b4d8fb4 100644 
--- a/lib/SQL/Abstract.pm 
+++ b/lib/SQL/Abstract.pm 
@@ -104,7 +104,11 @@ sub is_plain_value ($) { 
     # "%s"> and the source of overload::mycan()) 
     # 
     # either has stringification which DBI SHOULD prefer out of the box 
-  grep { *{ (qq[${_}::(""]) }{CODE} } @{ $_[2] = mro::get_linear_isa($_[1]) } 
+  grep { 
+   *{ (qq[${_}::()]) }{CODE} 
+   and 
+   *{ (qq[${_}::(""]) }{CODE} 
+  } @{ $_[2] = mro::get_linear_isa($_[1]) } 
      or 
     # has nummification or boolification, AND fallback is *not* disabled 
     (

为了把你放心:这里是什么是真正发生的事情:

perl -e ' 

    use warnings; 
    use strict; 

    require Scalar::Util; 

    { 
     package Some::Overload; 
     use overload 
     q{""}  => "named_stringifier", 
     fallback => 1, 
     ; 

     sub named_stringifier { $_[0] . "" } 
    } 

    { 
     package Some::Subclass; 
     use base "Some::Overload"; 
    } 


    my $thing = bless {}, "Some::Subclass"; 


    { 
     no strict "refs"; 
     grep { *{ (qq[${_}::(""]) }{CODE} } qw(Some::Subclass Some::Overload); 
    } 


    for (1, 2) { 


     # simulates runtime require of some *UNRELATED* class 
     eval sprintf <<EOS, $_; 
     { 
     package Some::UnrelatedThing%s; 
     use overload 
      q{""} => sub { \$_[0] . "" }, 
      fallback => 1, 
     ; 
     } 
EOS 

     my $some_object = bless {}, "Some::Subclass"; 
    } 

    warn "got here, all is well\n"; 
    exit 0; 
' 
相关问题