Peter Rabbitson [Sun, 15 May 2016 13:54:30 +0000]
Streamline ::ResultSource::* inheritance, similar to
d009cb7d
There should be zero functional changes
Peter Rabbitson [Sun, 15 May 2016 14:38:59 +0000]
Clean up the mess around $rsrc->sqlt_deploy_callback
Back in
f89bb832 nothingmuch introduced a hook point used to better integrate
with KiokuDB::Backend::DBI. It was properly implemented as a $rsrc instance
attribute, though somewhat undocmented.
Then in
880c075b castaway came along and incorrectly documented the attribute
as settable from a class, without it ever becoming a member of the list in
DBIC::ResultSourceProxy.
Then in
3b4e619d1 yours truly came along and (either misled by the docs, or
by drugs, or both) switched the accessor to classdata (CAG inherited) even
though rsrc-class-level operations were never a thing.
Revert part of
3b4e619d1 and fix the documentation to properly reflect the
state of affairs
Peter Rabbitson [Mon, 2 May 2016 11:35:40 +0000]
Explicit exception clarifying that $rsrc->from() is not a setter
This has always been the case, but previously from('foo') would just eat the
arguments silently
Peter Rabbitson [Fri, 29 Apr 2016 11:00:35 +0000]
Pull apart a test section (no functional changes)
Peter Rabbitson [Wed, 4 May 2016 16:10:33 +0000]
In
d009cb7d I stupidly created a "double around()"
Consolidate all the logic in DBIC::Componentised instead
Peter Rabbitson [Fri, 29 Apr 2016 16:00:03 +0000]
Bump Sub::Uplevel dep - too much breaks on <= 0.18
Note that this is a kludge - the guts of ::Carp need to be protected much
better by a faulty caller() override (as was the case in RT#32640)
An attempt to do so in
821edc09 turned out insufficient - everything still
fails on `DBIC_TRACE=1 prove ...` if the older Sub::Uplevel is installed :(
Peter Rabbitson [Fri, 15 Apr 2016 14:24:33 +0000]
More indirect call removals: the second part of
77c3a5dc
This may see like a random thing to do, especially given the late dev stage,
but it is needed for the clean fix of rsrc duality several commits later.
The spots were audited via "list all subs 10 lines or less":
~/devel/dbic$ find lib \
-name '*.pod' -prune \
-o -path lib/DBIx/Class/CDBICompat -prune \
-o -path lib/DBIx/Class/Admin -prune \
-o -path lib/DBIx/Class/Storage -prune \
-o -path lib/DBIx/Class/SQLMaker -prune \
-o -type f -exec perl -0777 -e '
$_ =~ /\S/
and
$_ !~ /ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call/
and
print "\n=====\n$ARGV\n=====\n\n$_\n\n\n"
for (<> =~ / (
^ (\s*) sub \s+ \w+ \s* \{ (?:
[^\n]+? \} \s*? \n
|
(?: [^\n]* \n ){0,10}? ^ \2 \}
)
) /xmg)
' {} \; \
| less
Peter Rabbitson [Wed, 27 Apr 2016 12:57:40 +0000]
Centralize remaining uses of Sub::Name within _Util
No functional changes
Peter Rabbitson [Thu, 28 Apr 2016 07:07:08 +0000]
Missed test spewing odd debug after
fd2c6658f (slave-less replication)
Disabling VIA_REPLICATED as it makes no sense here anyway
Sebastian Riedel [Tue, 26 Apr 2016 22:04:38 +0000]
Silly GitHub, Perl6 is not a real language :trollface:
Port of https://github.com/kraih/mojo/commit/
19cdf772
Before this clarification the project listed as 7% Perl6 code >.<
The explicit listing is needed, as there apparently won't be a fix
within Github itself any time soon:
https://github.com/github/linguist/issues/2149#issuecomment-
108954064
https://github.com/github/linguist/issues/2781#issuecomment-
167095903
https://github.com/github/linguist/issues/2074#issue-
56431157
Language names sourced from:
https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
Peter Rabbitson [Sun, 24 Apr 2016 16:49:46 +0000]
(travis) Work around RT#113740
Peter Rabbitson [Sun, 24 Apr 2016 11:36:47 +0000]
(travis) Make more helper functions available to subexecs
Peter Rabbitson [Sun, 24 Apr 2016 13:49:30 +0000]
Fix last remaining tests with -T under < 5.10
Model on https://github.com/p5sagit/namespace-clean/commit/
acb1d694, this is
still a mega-kludge, as the FIXME in the file says
Dagfinn Ilmari Mannsåker [Wed, 10 Dec 2014 18:04:06 +0000]
Fix ordering by 1:M prefetched boolean columns in Pg
PostgreSQL doesn't have min/max aggregates for the boolean type, but
it has and/or, which are equivalent. So, allow the storage to override
the aggregate used for constructing the order by clause based on the
column info.
Dagfinn Ilmari Mannsåker [Wed, 20 Apr 2016 16:23:46 +0000]
Use prepared statement from the start for populate on PostgreSQL
DBD::Pg since version 3.0.0 by default only starts using server-side
prepared statements the second time ->execute is called on a given
statement handle.
Unless server-side prepared statements have been disabled (by setting
the threshold to zero), make it use them immediately to avoid parsing
the statement twice.
Dagfinn Ilmari Mannsåker [Wed, 20 Apr 2016 16:20:26 +0000]
Fix Oracle _dbh_execute_for_fetch warning suppression
Commit
52cef7e3 changed from using execute_array to execute_for_fetch,
but didn't update the signature of the override in
Storage::DBI::Oracle::Generic, so it was setting ->{PrintWarn} 0 on the
result source, not the statement handle.
The reason it was not detected since is that DBD::Oracle 1.28+ already
fixed the underlying warning.
Peter Rabbitson [Tue, 19 Apr 2016 10:54:46 +0000]
After
5e0eea35 we can actually test for cleaned namespaces within CDBI
Peter Rabbitson [Tue, 19 Apr 2016 08:04:26 +0000]
Remove Class::Data::Inheritable and use CAG 'inherited' style accessors
This *is* a subtle change in behavior, as the CAG accessors could be overriden
by a rogue get/set_inherited in the stack. However keeping CDI in-place while
satisfying the requirements of the rsrc refactor is just too much work for a
miniscule risk avoidance. If something blows up - we'll think then.
Peter Rabbitson [Tue, 19 Apr 2016 12:13:03 +0000]
Start setting the 'c3' mro unambiguously everywhere
This is a necessary part of the rsrc refactor, which there is no way around.
And yes - it is extremely invasive and dangerous, with very high chance of
fallout. Given the situation there is no other way :/
The implementation itself is rather simple: all we need to do is hook
inject_base (which is called by load_components via several levels of
indirection), and also (as a precaution) we set the mro on anything loaded
via a component-group accessor. This seems to nicely cover pretty much all
of the hierarchy (except ::Storage, but that is another matter/rewrite)
Also move the CAG compat pieces where they belong
Peter Rabbitson [Wed, 20 Apr 2016 06:02:29 +0000]
Reorder a couple stray loads in ResultSource.pm
Peter Rabbitson [Wed, 20 Apr 2016 10:31:23 +0000]
Fix obscure failure of CDBICompat accessor install on 5.8
CDBICompat has a bizarre override of the CAG logic, in a way that only works
reliably at compiletime due to Class::C3 "cache" slots
A test implicitly starts covering this failcase once Class::Data::Inheritable
is removed sever commits later
Peter Rabbitson [Fri, 8 Apr 2016 14:36:22 +0000]
Augment the infinite loop fix
4f52479b with the infra of ddcc02d1
This also fixes a manifestation (but not the cause, this comes later) of a
bug where $result->result_source != $result->result_source_instance.
This commit is made early as it is rather efficient anyway, and it allows me
to test Handel (which was broken by
4f52479b) to validate subsequent rsrc
rewritering
Peter Rabbitson [Tue, 15 Dec 2015 22:22:51 +0000]
Reduce duplicate ->result_source calls where sensible
No functional changes
Peter Rabbitson [Tue, 15 Dec 2015 21:30:10 +0000]
This was commented out in 2008 (
5b0b4df8) and never used
Peter Rabbitson [Thu, 14 Apr 2016 12:56:00 +0000]
Slightly golf ::ResultSource::DESTROY and several weaken() calls
No functional changes
Fabrice Gabolde [Wed, 13 Apr 2016 13:42:38 +0000]
Proxy the 'unsafe' attribute to the internal ::Versioned storage
Peter Rabbitson [Thu, 14 Apr 2016 08:34:30 +0000]
Remove one level of indirection in Versioned on_connect
No functional changes
Peter Rabbitson [Thu, 14 Apr 2016 07:19:15 +0000]
Add a weaken() cycle forgotten in
d63c9e64
The reason this has not been a problem is because thread spawn in DESTROY is
practically unheard of. Nevertheless if one throws the following in, the
problem becomes apparent: ( not committing this test, because... just no. )
--- a/t/storage/txn_scope_guard.t
+++ b/t/storage/txn_scope_guard.t
@@ -247,5 +247,7 @@ require DBICTest::AntiPattern::NullObject;
my @arg_capture;
{
+ use threads;
local $SIG{__WARN__} = sub {
+ threads->new(sub { sleep 1})->join;
package DB;
Peter Rabbitson [Wed, 13 Apr 2016 17:43:30 +0000]
Fix thinko from
10dd5c05 - make sure we actually sleep
Under very tight concurrency it is possible that the test will not be given
sufficient timeshare before the scheduled 'point in the future', which would
result in us asking Time::HiRes to sleep for a negative amount of time, which
it "helpfully" converts to an obnoxious exception.
Tina Mueller [Fri, 14 Aug 2015 11:51:53 +0000]
Add a proof of concept test for copy() with assymetric IC::DT
What a mess. The core of the problem is that some of our IC::DT in/deflator
pairs are *not* symmetric. That is for things to roundtrip one needs values
to pass through the database, which is configured "just properly wrong" to
perform the second half of this evil dance.
Of course this break copy() and likely other things I do not know about.
Given there is nothing one can do about the core problem (huge install base)
a minimally invasive workaround has been devised and tested here. Refer to
`git show 993fa9b | perl -ne 'print if 110..134'` for the exact snippet you
need to place in your base result class to make everything work again.
This is terrible.
-- ribasushi
For completeness: here is a full list of individual inflators (as of Apr
2016) and which ones are broken beyond repair:
ACCESS 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
DB2 2016-04-13-07.42.58 2016-04-13T07:42:58 2016-04-13-07.42.58 (via DateTime::Format::DB2)
MSSQL 2016-04-13 07:42:58.000 2016-04-13T07:42:58 2016-04-13 07:42:58.000 (via DBIx::Class::Storage::DBI::MSSQL::DateTime::Format)
Pg 2016-04-13 07:42:58+0000 2016-04-13T07:42:58 2016-04-13 07:42:58+0000 (via DateTime::Format::Pg)
ADO 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
NoBindVars 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
SQLAnywhere 2016-04-13 07:42:58.000000 2016-04-13T07:42:58 2016-04-13 07:42:58.000000 (via DateTime::Format::Strptime)
AutoCast 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
Firebird 2016-04-13 07:42:58.0000 2016-04-13T07:42:58 2016-04-13 07:42:58.0000 (via DBIx::Class::Storage::DBI::InterBase::DateTime::Format)
Informix 2016-04-13 07:42:58.00000 2016-04-13T07:42:58 2016-04-13 07:42:58.00000 (via DBIx::Class::Storage::DBI::Informix::DateTime::Format)
ODBC 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
Sybase 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
mysql 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
InterBase 2016-04-13 07:42:58.0000 2016-04-13T07:42:58 2016-04-13 07:42:58.0000 (via DBIx::Class::Storage::DBI::InterBase::DateTime::Format)
Oracle 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
SQLite 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::SQLite)
Firebird::Common 2016-04-13 07:42:58.0000 2016-04-13T07:42:58 2016-04-13 07:42:58.0000 (via DBIx::Class::Storage::DBI::InterBase::DateTime::Format)
Sybase::FreeTDS 2016-04-13 07:42:58 2016-04-13T07:42:58 2016-04-13 07:42:58 (via DateTime::Format::MySQL)
Sybase::MSSQL 2016-04-13 07:42:58.000 Your datetime does not match your pattern. at (via DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format)
Sybase::Microsoft_SQL_Server 2016-04-13 07:42:58.000 Your datetime does not match your pattern. at (via DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format)
Sybase::ASE 04/13/2016 07:42:58.000 Your datetime does not match your pattern. at (via DBIx::Class::Storage::DBI::Sybase::ASE::DateTime::Format)
Sybase::Microsoft_SQL_Server::NoBindVars 2016-04-13 07:42:59.000 Your datetime does not match your pattern. at (via DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format)
Sybase::ASE::NoBindVars 04/13/2016 07:42:59.000 Your datetime does not match your pattern. at (via DBIx::Class::Storage::DBI::Sybase::ASE::DateTime::Format)
Oracle::WhereJoins 2016-04-13 07:42:59 2016-04-13T07:42:59 2016-04-13 07:42:59 (via DateTime::Format::Oracle)
Oracle::Generic 2016-04-13 07:42:59 2016-04-13T07:42:59 2016-04-13 07:42:59 (via DateTime::Format::Oracle)
ODBC::ACCESS 2016-04-13 07:42:59 2016-04-13T07:42:59 2016-04-13 07:42:59 (via DBIx::Class::Storage::DBI::ODBC::ACCESS::DateTime::Format)
ODBC::DB2_400_SQL 2016-04-13-07.42.59 2016-04-13T07:42:59 2016-04-13-07.42.59 (via DateTime::Format::DB2)
ODBC::SQL_Anywhere 2016-04-13 07:42:59.000000 2016-04-13T07:42:59 2016-04-13 07:42:59.000000 (via DateTime::Format::Strptime)
ODBC::Firebird 2016-04-13 07:42:59.0000 2016-04-13T07:42:59 2016-04-13 07:42:59.0000 (via DBIx::Class::Storage::DBI::InterBase::DateTime::Format)
ODBC::Microsoft_SQL_Server 2016-04-13 07:42:59.000 2016-04-13T07:42:59 2016-04-13 07:42:59.000 (via DBIx::Class::Storage::DBI::MSSQL::DateTime::Format)
ADO::MS_Jet 04/13/2016 07:42:59 AM 2016-04-13T07:42:59 04/13/2016 07:42:59 AM (via DBIx::Class::Storage::DBI::ADO::MS_Jet::DateTime::Format)
ADO::Microsoft_SQL_Server 04/13/2016 07:42:59 AM 2016-04-13T07:42:59 04/13/2016 07:42:59 AM (via DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server::DateTime::Format)
... and the program that produces the above ...
~$ perl -I lib -MDateTime -MFile::Find -e '
find({ no_chdir => 1, follow_fast => 1, wanted => sub {
-f _ or next;
$_ =~ m{DBIx/Class/Storage/DBI/(?!Replicated|IdentityInsert|.*?Cursor|UniqueIdentifier)(.+)\.pm} or next;
list_dt_state($1);
}}, "lib" );
sub list_dt_state {
( my $id = shift ) =~ s|/|::|g;
my $s = "DBIx::Class::Storage::DBI::$id";
my $p = eval "local \$SIG{__WARN__} = sub {}; require $s; $s->build_datetime_parser"
or ( printf "%s: %s\n", $id, substr $@, 0, 45 and next );
my $as_string = $p->format_datetime( DateTime->now );
my $half_trip = eval { $p->parse_datetime( $as_string ) } || substr $@, 0, 45;
my $full_trip = $@ ? "" : eval { $p->format_datetime( $half_trip ) } || substr $@, 0, 45;
printf "%-30s %-26s %-20s %-26s (via %s)\n",
$id,
$as_string,
$half_trip,
$full_trip,
( ref $p || $p ),
;
}
'
Peter Rabbitson [Tue, 12 Apr 2016 14:28:25 +0000]
Fix t/746sybase.t failing under -T
Peter Rabbitson [Tue, 12 Apr 2016 14:25:58 +0000]
Fix forgotten finally{} in Sybase::ASE (missed in
ddcc02d14)
I guess my grep-fu failed me, the finally is right there...
As per the comment nothing seems to fail if I just remove this, but ASE is
so fragile that I'll just play it safe...
Peter Rabbitson [Mon, 11 Apr 2016 11:31:18 +0000]
And lose yet another dependency: List::Util (yes, I know it's core)
The main motivation for this is that first {} is an expensive subcall,
whereas grep is a native fast opcode. Within the entire codebase there
are pretty much no spots where we have so many elements to check, that
the "check everything" of grep will overwhelm the expense of entersub
(in fact 2 calls - one to first() itself, another to the block)
As a side effect the removal of first(), which was the only thing
we used that has known leaks prior to L::U 1.18, lets us drop the
"5.8.8+ or later" List::Util dep entirely (it doesn't matter much
for users, but it stresses the CI even more, which is a good thing)
This cangeset should introduce 0 functional changes
Peter Rabbitson [Mon, 11 Apr 2016 09:49:56 +0000]
Lose another dependency: Class::Inspector
It is either used in tests (where we cargocult a similar function), or in a
spot where Package::Stash will do
Peter Rabbitson [Tue, 12 Apr 2016 11:27:14 +0000]
Remove dead code from DBI::Replicated
This was originally introduced in
fecb38cba, without tests nor justification.
Subsequently it got modified a bit in
7da56142c, and then got completely
broken by
bbdda2810 which designated _dbh_details() as an off-limits internal
method.
Given nothing has been heard since (6 years), and there is no effective change
of behavior (the snippet below fails identically below and after this change)
go ahead and burninate.
Also adjust the "can't touch this" exception text a bit.
DBICTEST_VIA_REPLICATED=1 perl -Ilib -It/lib -MDBICTest -e '
eval { DBICTest->init_schema->storage->$_ }, warn $@
for qw( _dbh_details _server_info _get_server_version _describe_connection )
'
Peter Rabbitson [Tue, 12 Apr 2016 10:09:03 +0000]
Harmonize DBICTEST_VIA_REPLICATED detection in tests
Back in
8b60b9211a I made a number of mistakes implementing the escape
checks: an envvar being set does not mean we are in fact running under
replication (e.g. the user requested explicitly use_file => 0 )
Fix that and also make sure we still run when use_file => 1 (and fix a
forgotten test failing this way)
Peter Rabbitson [Tue, 12 Apr 2016 11:52:04 +0000]
Bring back constants excised in
08a8d8f1. FML.
Peter Rabbitson [Mon, 11 Apr 2016 13:53:04 +0000]
(travis) Add a CLEANTEST run of RURBAN's cperl in the spirit of
62f2092b
Refer to the (*really* small) patchset for info on how to run the same locally
TLDR: you need to activate distroprefs and use CPAN.pm
Peter Rabbitson [Mon, 11 Apr 2016 11:10:53 +0000]
(travis) Add 5.22.1 with quadmath testing
Peter Rabbitson [Mon, 11 Apr 2016 18:24:21 +0000]
(travis) Reorganize POISON_ENV mode
Allow MVDT and BREAK_CC to be separate settings, will make sense in further
commits. This adds extra testing of DEVREL_DEPS with no compiler, which
brings another round of exceptions etc... sigh
Read under -w
Peter Rabbitson [Mon, 11 Apr 2016 15:19:34 +0000]
(travis) Enhance the 'broken compiler' test
Peter Rabbitson [Sat, 2 Apr 2016 15:41:52 +0000]
Fix another ::FilterColumn bug sigh...
This one is technically a regression introduced by
dc6dadae, which aimed to
solve multiple runs on already-dirty columns. Unfortunately this very same
change broke update(). Overload get_dirty_columns to fix that, and add a
bunch of tests validating nothing crazy is going on.
I should have seen all of these problems when FC was initially considered,
but alas I was too damn inexperienced :/
Peter Rabbitson [Sat, 2 Apr 2016 13:21:37 +0000]
Test with explicitly readonly 'replicants' under DBICTEST_VIA_REPLICATED
Fabrice Gabolde [Fri, 1 Apr 2016 13:05:42 +0000]
Fix parsing DSN when the driver part includes DBI attributes
Peter Rabbitson [Fri, 1 Apr 2016 10:19:51 +0000]
Fix annoying warnings on innocent looking MSSQL code
After several rounds of improvements in the retry logic (
84efb6d7, 729656c5)
MSSQL code non-fatally aborting due to clashing multiple active resultsets
would emit an annoying warning. Such warnings are especially baffling when
encountered in innocent-looking code like:
my $first_bar_of_first_foo = $schema->resultset('Foo')
->search({ foo => 'fa' })
->next
->related_resultset("bar")
->next;
Since no object destruction takes place until the = operator is executed, the
cursor returning "first foo matching fa" is still active when we run a second
search for the "bars". With default MSSQL settings (i.e. without an enabled
MARS[1] implementation) this leads to an exception on the second ->next().
The failed next() is properly retried, since we are not in transaction or some
similar complicating factor, and the entire thing executes correctly, except
the force-disconnect-before-reconnect-after-failed-ping warns about the first
cursor being still alive.
Add extra stack marker for this particular case, and teach the MSSQL driver to
hide the (at this stage spurious) warning
[1] http://p3rl.org/DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server#MULTIPLE-ACTIVE-STATEMENTS
Peter Rabbitson [Fri, 1 Apr 2016 10:05:51 +0000]
Silence spurious warnings from todoified test
Paul Mooney [Thu, 10 Mar 2016 10:50:57 +0000]
Avoid infinite loop if save point does not exist
Peter Rabbitson [Wed, 30 Mar 2016 18:24:49 +0000]
Really fix SQLite savepoints unlike the shortsighted
398215b1
Peter Rabbitson [Wed, 30 Mar 2016 14:06:48 +0000]
Fix incorrect exception propagation in ::Replicated::execute_reliably
The code makes no sense in its current state, lapse left in after
1abccf54
Peter Rabbitson [Wed, 30 Mar 2016 13:44:15 +0000]
Fix *stupid* silencing of exceptions introduced in
4e9fc3f3
The reason this has not been detected is because it is virtually impossible
for the stock inflate_result() to throw, and pretty rare for custom ones.
ARGH!
Found and individually vetted all remaining eval()s as in:
grep -Pnr -B2 -A7 '^(?!\s*#).*?\beval\b' lib | less
Peter Rabbitson [Wed, 23 Mar 2016 13:05:10 +0000]
Store collapser source in the resultset private metadata as well
After
05a5ca4b the deparse of the row-parser coderef is incomprehensible at
best. Add the source to the private cache structure to aid debugging if it
ever becomes necessary (fingercross it won't be). Aside from the explicit
evaluation package name, and the slight change of the return of _mk_row_parser
there are no functional changes
Read under -w
Peter Rabbitson [Fri, 25 Mar 2016 13:28:42 +0000]
Step up the error reporting on unexpected NULLs during collapse
The collapser became so complex that it is practically impossible to debug
when things go sideways. Expand the rudimentary "just check root identifier"
to a comprehensive check of all identifier groups, at the expense of some
performance. This builds on top of the {nullchecks} metadata collected in
5ff6d603, generating maximally unrolled definedness checks which cause an
early return with no results and flagged unexpected-null-positions
The commit itself is relatively straightforward, though the meager changeset
in lib/ is misleading: the damned thing took almost 8 days to fully think
through and implement with several detours for bugfixing :/
Peter Rabbitson [Thu, 24 Mar 2016 15:22:44 +0000]
First part of changes for better unexpected NULL reporting
Doing things in two parts to make it easier to reason about. This part only
changes the collapse_map visitor to collect more metadata, and uses a bit
of it to elide a couple of // ops.
Additionally we are now feeding the stash-arrayref to the collapser at all
times, it will become clear way in the next commit (where all the real
changes are)
Read under -w
Peter Rabbitson [Fri, 25 Mar 2016 17:15:34 +0000]
Support one more convoluted case of data-poor collapse
Any might_have ( optional, 1:1 ) relation with a fully defined left-side is
identifiable as long as at least one non-nullable (not necessarily unique)
column is fetched
Dagfinn Ilmari Mannsåker [Tue, 29 Mar 2016 12:10:39 +0000]
Remove confusing code introduced in
8fc4291e
<ilmari> but why is $dump_str declared outside dump_value?
<ribasushi> ilmari: silly minimalistic microoptimization (not to reclear the dump every time it's needed)
<ribasushi> ilmari: my $foo { reuse $foo many time in this scope } *minimally faster* than { use my $foo_to_be_cleared_any_time_we_leave_scope }
<ribasushi> less for the scope unwinder to do
<ribasushi> as I said - it's silly, and 100% undetectable
<ilmari> is dump_value that hot?
<ribasushi> it's not hot at all
<ilmari> we've probably wasted more time discussing this now than the total CPU time saved by that micro-optimisation, over the entire future lifetime of DBIC
<ribasushi> ilmari: well, my 1st sentence today was admitting exactly that ;)
<ribasushi> I have been working on the rowparser for 5 days, the mindset is different, and it "bleeds through"
Peter Rabbitson [Mon, 28 Mar 2016 16:56:46 +0000]
More tests and tighter code with better error reporting in collapser maker
Additionally RowParser::Util was scanned with Devel::Core to ensure I don't
have any remaining holes similar to
1fd3505d. The coverage of said file is
not at 100%, due to bugs in Devel::Cover itself, notably handling of
$x = $y || $z ( https://github.com/pjcj/Devel--Cover/issues/154 )
Peter Rabbitson [Sat, 26 Mar 2016 22:14:09 +0000]
Fix incorrect data returned in a corner case of partial-select HRI
While investigating better reporting on disagreeing metadata and actual
results returned by the data source, I stumbled across an incorrect
optimization applied to the HRI fast-path in
aa1d8a87. The reason this has
never been a problem in the wild is that the failure case is very convoluted:
In order for the problem to present itself one needs to have a subchain of
... something-single ... with the "something" not fetching anything
AND the entire chain being hit exactly once (no multiplication of the branch
neither by a result or a parallel 1:M) AND the HRI fast-path code needs to be
in effect. Then and only then everything from "something"onwards will present
as "nonexisting left join" and a sole undef will be returned in place of the
entire substructure.
Peter Rabbitson [Mon, 28 Mar 2016 20:50:55 +0000]
Lose yet another dep (Data::Dumper::Concise)
Peter Rabbitson [Thu, 24 Mar 2016 14:35:51 +0000]
Remove some old forgotten pieces of code in collapse resolver
Peter Rabbitson [Fri, 12 Feb 2016 08:27:38 +0000]
Make sure handling of exception_action is recursion-safe
Pointed out by Lukas Mai in the last (fifth) bullet point of
https://github.com/PerlDancer/Dancer2/issues/1125#issuecomment-
180326756
In addition add extra testing making sure that we will not inadvertently
silence $SIG{__DIE__} when the error is *not* transient
Hopefully this is the last piece of the "clean transient exceptions" puzzle,
it's already been way too much faffing:
7cb35852, ddcc02d1 and 5c33c8be :(
Peter Rabbitson [Tue, 22 Mar 2016 22:43:19 +0000]
Expand ASSERT_NO_SPURIOUS_EXCEPTION_ACTION to set a rogue $SIG{__DIE__}
This simple augmentation of
ddcc02d1 caught a couple extra spots where a
__DIE__ handler could be incorrectly triggered (one of them ironically
introduced by
86cdddbe which happened *after* the work in ddcc02d1)
See next commit for *YET MORE* of the same...
Peter Rabbitson [Fri, 12 Feb 2016 08:27:38 +0000]
Better testing that RT#63874 being fully fixed by
ddcc02d1
Also separate some of the basic find() tests to a new testfile
Peter Rabbitson [Thu, 10 Mar 2016 20:32:35 +0000]
Fix failing test case missed during
da9346a03
Adjust CI to execute one job as a non-poisoning noisy tracer
Peter Rabbitson [Thu, 10 Mar 2016 18:02:00 +0000]
Really work around RT#108390 (
630e2ea8a)
A certain chain of events can still deadlock things without an explicit flush
Peter Rabbitson [Thu, 3 Mar 2016 14:27:34 +0000]
Move expensive test to xt/, add malloc-canary preventing false-negatives
This test was originally written to validate both Devel::GlobalDestruction::PP
and the M.A.D. cyclic reference handler (
a4367b26). These days it makes little
sense to run on end-user installs, yet this bizarre test still uncovers weird
problems in the underlying Rube Goldberg machine.
So instead of outright deleting it - move it to xt/ and validate its execution
environment with what is essentially a guarded calloc()
Add a tight-memory travis config to make sure that OOM won't kill the wrong
thing
Read diff under -C
Peter Rabbitson [Wed, 9 Mar 2016 16:48:16 +0000]
(travis) Strangely `cpan .` does not work in certain configs
No intention to investigate further at this time
Peter Rabbitson [Tue, 8 Mar 2016 17:29:41 +0000]
(travis) Make sure DEVREL_DEPS + CLEANTEST-false behaves as intended
This lapse was the reason https://github.com/Test-More/test-more/issues/637
went undetected for a while (also made me aware of RT#112312, ARGH!)
Matthew Horsfall [Tue, 8 Mar 2016 14:15:04 +0000]
Much simpler sure-flush on dirty exit ( ribasushi-- # overcomplicating )
Peter Rabbitson [Sat, 5 Mar 2016 14:32:11 +0000]
Restructure thread/fork tests to run with maximum concurrency
Add better exit handling on older perls: the thread-related failures on
global destroy have nothing to do with what we want to test. Activated by
setting $ENV{DBICTEST_DIRTY_EXIT}
Also reduce the default amount of workers - 10 is too many
Dagfinn Ilmari Mannsåker [Mon, 7 Mar 2016 15:25:59 +0000]
Fix erroneous use of multidimensional array emulation in
1fb834df
Peter Rabbitson [Sun, 6 Mar 2016 06:08:56 +0000]
(optdeps) _gen_pod can *very much* fail, not sure what I was thinking
Peter Rabbitson [Sat, 5 Mar 2016 13:43:44 +0000]
These files are not used by anything - remnants from the distant
ea2e61bf
Peter Rabbitson [Fri, 4 Mar 2016 18:55:39 +0000]
Apparently -i and -jN do not work on win32, what the hell
These fixes together with RT#112706 make distbuilding on SighOS possible again
Also adjust a number of whitespace checks to work properly, ensuring the
distdir built on a normal OS and on Win32 match.
Read under diff -w -C
Peter Rabbitson [Fri, 4 Mar 2016 15:24:27 +0000]
More robust behavior of ANFANG.pm, also guard against sitecustomize.pl
Peter Rabbitson [Thu, 3 Mar 2016 11:24:55 +0000]
Do not load DBIC::Optional::Dependencies at runtime unless we need to
Peter Rabbitson [Sun, 10 Jan 2016 14:26:40 +0000]
(optdeps) One last pass through tests, streamline skip messages
Peter Rabbitson [Mon, 11 May 2015 10:39:39 +0000]
Get rid of Path::Class ( that *does* feel good )
This was a rather long journey (I've been meaning to do this since ~2013).
As everything else it turned out more complex than I anticipated. Notably
due to having to implement from semi-scratch things that a dev should usually
never worry about >:( Just look at the amount of stuff one can't reasonably
trust these days (pay attention to the comments):
git show
5d54c117 | perl -ne 'print if 155..304' | less
git show
358a3aa7 | perl -ne 'print if 407..453' | less
There is a tangible difference in the smoke times due to a leaner set of deps
(though not as big as one would hope... yet). Sample timings as follows:
for n in $(seq 26); do
dbic_trv_diffable() {
perl -0777 -n -E '
print ( map { "$ENV{cur}: $_\n" } map { split /\r?\n/, $_ }
$_ =~ /(^TRAVIS_PERL_VERSION.+)/m,
$_ =~ / \QSetting environment variables\E .+? (?:\r?\n)+ (.+?) (?: \r?\n){2} /xms,
$_ =~ /(^.*Configuration phase seems to have taken.*)/m,
);
say (
$_ =~ /(^[^\n]*?List of loadable modules .+?)^[^\n]*?List of loadable modules/ms
);
'
}
x=$((
112987257 + $n)) &&\
y=$((
113113497 + $n)) &&\
echo -e "$x => $y\n========\n" &&\
diff -U0 \
<( wget -qO- s3.amazonaws.com/archive.travis-ci.org/jobs/$x/log.txt | \
cur=$x dbic_trv_diffable )\
<( wget -qO- s3.amazonaws.com/archive.travis-ci.org/jobs/$y/log.txt | \
cur=$y dbic_trv_diffable )
done | less
P.S. The above is hideous, yes, but you can run it in your terminal *directly*
Peter Rabbitson [Tue, 1 Mar 2016 20:49:56 +0000]
Several cosmetic fixups, making next commit easier to read
No notable functional changes, mostly de-File::Spec-ing spots that do not need
it ( '/' works on Win32 just fine, and VMS is a looooong way off )
Peter Rabbitson [Mon, 15 Feb 2016 11:40:34 +0000]
Stop loading Time::HiRes in the base test schema - there is no need
Switch all spots to a select()-based sleep instead
Peter Rabbitson [Sun, 14 Feb 2016 10:39:14 +0000]
Untangle strictly-DBICTest constant from the main constant set
Not sure what I was thinking when I wrote this
Peter Rabbitson [Wed, 17 Feb 2016 10:01:20 +0000]
Move tmpdir() to DBICTest::Util where it belongs
This detangles things even more. Add some extra logic fixes to the hideous
routine while we are at it...
Some notes on the actual test pefrormed: there have been cases on smokers
where a returned directory was not in fact writable [1]. Thus work harder
making sure everything works. The check is expensive but not terribly so:
about 14ms on cold caches ( echo 3 > /proc/sys/vm/drop_caches ) and ~6ms
thereafter. This adds up to 2 seconds over the current 320 tests. Timed via:
~$ perl -It/lib -Ilib -MANFANG -MDBICTest::Util=tmpdir -MTime::HiRes=time -e '
my $t0 = time;
sub delta_t { my $t = time; printf "%.06f\n", $t - $t0; $t0 = $t }
delta_t();
print tmpdir . "\n";
delta_t();
print tmpdir . "\n";
delta_t();
print tmpdir . "\n";
delta_t();
'
[1] http://www.cpantesters.org/cpan/report/
36d4436d-7888-1014-a278-e5322b825c07
Peter Rabbitson [Mon, 15 Feb 2016 11:42:13 +0000]
Revert
ab340f7f - it no longer makes sense given the excellent CI setup
There should be no functional changes / difference in behavior (the config
option is named differently, and is inverted in meaning)
Verified no change in behavior (at least on CI) via:
( not checking all 20+ jobs as the log-counter jumps towards the end )
for n in $(seq 18) ; do
x=$((
112787688 + $n)) && \
y=$((
112787738 + $n)) && \
echo "$x => $y" && \
diff -U0 \
<(wget -qO- https://s3.amazonaws.com/archive.travis-ci.org/jobs/$x/log.txt | \
perl -0777 -n -E 'say ( ($_ =~ /List of loadable modules within both the core and(.+?)List of loadable modules within both the core and/s )[0] )') \
<(wget -qO- https://s3.amazonaws.com/archive.travis-ci.org/jobs/$y/log.txt | \
perl -0777 -n -E 'say ( ($_ =~ /List of loadable modules within both the core and(.+?)List of loadable modules within both the core and/s )[0] )')
done | less
This also happened to find https://rt.cpan.org/Ticket/Display.html?id=112601
Peter Rabbitson [Mon, 29 Feb 2016 10:35:26 +0000]
Institute a central "load this first in testing" package
Instead of the hodge-podge of "what loads first where" make a verified focal
package and move some of the stuff within DBICTest::RunMode there
There are no other changes aside from the load order
Peter Rabbitson [Sun, 28 Feb 2016 12:37:46 +0000]
Move find_co_root into DBICTest::Util
This is the first step of rearranging the utility pieces, removing reliance
on Path::Class in general
No visible functional changes, the old sub _find_co_root left as-is for the
time being, with an eval wrapped around it to retain the old "best effort"
behavior. Will be revisited in subsequent commits.
Peter Rabbitson [Sun, 28 Feb 2016 13:04:08 +0000]
Revert part of
bbcc1fe8 - the 'queue unstick hack' belongs in DBICTest
DBICTest::Util is more likely to be loaded before Test::More, voiding the
check in the BEGIN. DBICTest on the other hand is almost invariably loaded
after T::M.
Peter Rabbitson [Mon, 29 Feb 2016 11:50:54 +0000]
(optdep) last-from-block is a compile-time warning, silence properly
Without this we do get warnings under RELEASE_TESTING=1 as warnings are then
enabled file-wide
Peter Rabbitson [Fri, 26 Feb 2016 08:57:27 +0000]
Switch the main dev branch back to 'master'
Previously the idea was to have two dev branches - one for "the crowd", and
another one for the rel manager to do periodic squashes, merges, cleanups etc.
This worked rather well for about 1.5 years, but with the primary architect
outgoing it can't be sustained, and only serves to confuse everyone.
Thus a fast forward with a mini-merge of master up to the tip of current/blead
and continuing pushes to master alone from there on. Not yet deleting the old
'current/blead' and 'current/for_cpan_index' branches, as it affects PR states
due to useless "smarts" in the github logic.
Peter Rabbitson [Sat, 13 Feb 2016 20:38:31 +0000]
(travis) Display TAP directives on single threaded CI runs
Add a couple extra single-thread runs, shouldn't take *that* much longer
Peter Rabbitson [Thu, 18 Feb 2016 04:46:00 +0000]
(travis) Fix INC-poison thinko from
6d74b82cc
Ensure stable DBIC is in fact in INC by test time ( detected courtesy of the
@INC-state reporter in t/00describe_environment.t \o/ )
Peter Rabbitson [Thu, 18 Feb 2016 04:14:29 +0000]
(travis) Revert version.pm workaround
dd94f6ef
Peter Rabbitson [Sat, 13 Feb 2016 17:27:11 +0000]
Eeeeep /x doesn't affect the insides of [...]
gregor herrmann [Sat, 13 Feb 2016 18:56:13 +0000]
Apply debian downstream spelling patch
481e21bf
Peter Rabbitson [Sat, 13 Feb 2016 20:01:48 +0000]
Adjust Changes to reflect what was shipped in 0.082821
Peter Rabbitson [Thu, 11 Feb 2016 17:07:51 +0000]
Add experimental meta flags signifying the status of parallel testing
Peter Rabbitson [Thu, 11 Feb 2016 17:52:40 +0000]
Add explicit patronage listing (should have done this a while ago)
Not generalizing it (yet) as patrons are few and far between
Dagfinn Ilmari Mannsåker [Mon, 8 Feb 2016 16:31:22 +0000]
Proper fix for the lazy workaround in
7e1774f7
Pure-perl subs return values as mortal copies on the stack, incrementing
the reference count until the next statement. In the case of the last
statement in a sub, that is in the caller, after the other lexicals have
been GCed.
if ( ... ) { ... };
counts as a single statement for this purpose, since it compiles to
( ... ) && do { ... };
The reason this doesn't bite when using XS is that Class::XSAcessor
returns the SV directly from the hash, rather than a mortal copy, so the
reference count never gets incremented.
Generalize the fix to a similar problem (
8e9b9ce5) and pepper potentially
problematic codepaths with explicit NEXTSTATEs. Many of the changes do not
resolve anything as there is no "statement leakage" in most of this code,
but it is a good idea to have them there nevertheless: This way future
code-flow modifications will not accidentally reintroduce this problem.
Peter Rabbitson [Thu, 4 Feb 2016 09:30:30 +0000]
Silence more spurious warnings (this one is a serious wtf)
Seen in no-XS CI (e.g https://travis-ci.org/dbsrgits/dbix-class/jobs/
106811389)
on all perls and too involved to diagnose properly given the tight schedule
Just go for a cop out
Peter Rabbitson [Thu, 4 Feb 2016 09:18:51 +0000]
Do our best to disconnect on request (goes with
45792de6)
This ensures that a failed rollback won't leave is in a weird state
Peter Rabbitson [Thu, 4 Feb 2016 08:54:13 +0000]
Remove statement cache eviction before disconnect
This was added for no apparent reason with a ton of other code in
f200d74b.
It is known to have unintended effects on at least ::Pg handles (as detailed
in theory/dbix-connector/issues/39) and generally seems like a gratuitous
action to take.
Given it doesn't seem to add extra noise on any of the test runs - kill it
with fire.
Peter Rabbitson [Thu, 4 Feb 2016 09:16:40 +0000]
Streamline couple code paths/texts, no func changes (goes with
7cb35852)