[Dbix-class] Class::C3::Componentised bug (was deployment bug with DBIC running from PAR)

Peter Rabbitson rabbit+dbic at rabbit.us
Wed Feb 4 08:31:57 GMT 2009


Toby Corkindale wrote:
> Peter Rabbitson wrote:
>> Toby Corkindale wrote:
>>> I need to stop replying to myself :(
>>> I'd say the problem lies this block of code:
>>>
>>> # Look through the @INC path to find the file
>>>     foreach ( @try_first, @INC ) {
>>>         my $full = "$_/$filename";
>>>         next unless -e $full;
>>>         return $UNIX ? $full : $class->_inc_to_local($full);
>>> }
>>>
>>> since when using PAR, the first entry in @INC is a coderef, and thus
>>> this routine tests for '-e "CODE(0xd34db33f)/Foo/Bar.pm"' which, not
>>> unsurprisingly, fails.
>>>
>>> D'Oh.
>>>
>>> I'll raise some bugs on RT. Not sure where the blame lies now..
>>
>> Hi,
>> The issue you describe was worked around in this commit.
>> http://dev.catalyst.perl.org/svnweb/bast/revision/?rev=5355
>>
>> I would recommend against raising a bug against C3:: as it behaves
>> correctly
>> wrt availability of a module. Since there is no mechanism for a
>> coderef in
>> @INC to say "I didn't find" vs "I didn't load", ensure_class_found can
>> not
>> be expected to work correctly. A POD patch indicating the above would be
>> most welcome.
> 
> I'm not entirely sure what that POD should say though..
> "Warning - this feature will not work when used in one of the two ways
> you can use PAR, and thus should not be used at all if you intend your
> application, or any of its descendants, to work properly" ?
> 
> Perhaps It would be better to submitt a patch against
> DBIx::Class::Schema::Storage::DBI to remove the uses of
> ensure_class_found instead?

You didn't check the link I sent did you.

> I freely admit I don't understand why one would use the
> "check-but-don't-load" functionality often, especially since the case in
> point that breaks the deployment will always attempt to load the class
> immediately if it is found:
> 

If someone put it there, someone does use it.

In short:

1) DBIC was fixed last week - applied patch is here:
http://dev.catalyst.perl.org/svnweb/bast/revision/?rev=5355

2) Raising bugs against C3 is not productive. Much better to supply a POD
patch against Class::C3::Componentised, explaining that ensure_class_found()
will not work with PAR environments and anything that stuffs coderefs in @INC.

Cheers




More information about the DBIx-Class mailing list