mahara-contributors team mailing list archive
-
mahara-contributors team
-
Mailing list archive
-
Message #31246
[Bug 1515929] Re: Copy a collection failing
Hi Ed,
Thanks for the bug report!
Hm, I think the problem here is that our code assumes there will be no
more than one record in usr_custom_layout for each (user, layout) pair,
or (group, layout), or (institution, layout). But, there's no uniqueness
constraint for that in the database. Our insert code is trying to make
sure not to insert duplicate records, but apparently it can happen in
some anomalous circumstances (maybe a bug in the code, or a race
condition).
So our fix should be:
1. Put a uniqueness constraint on those relations, if possible. (And
when applying that uniqueness constraint in the upgrade block, make sure
to delete any duplicate records first.)
2. If we can't put a uniqueness constraint on those relations, change
this bit of code to tolerate the presence of more than one record. Maybe
we should add an optional parameter to the get_record() family of
arguments to tell it whether it should error out if it finds more than
one record?
Ed,
In the meantime, for your specific site, the workaround is to delete the
duplicate records from the database, which you should be able to do by
running this query:
DELETE FROM "usr_custom_layout" WHERE "id" NOT IN (SELECT MIN("id") FROM
"usr_custom_layout" GROUP BY "usr", "group", "institution", "layout");
Or if you want to take a more cautious approach, you can use this query
to view the duplicate records, and then delete all but one from each
set, individually:
SELECT ucl.*
FROM "usr_custom_layout" ucl
INNER JOIN ( SELECT "usr", "group", "institution", "layout" FROM "usr_custom_layout" GROUP BY "usr", "group", "institution", "layout" HAVING COUNT(*) > 1) q
ON (ucl.usr=q.usr OR ucl.group=q.group OR ucl.institution=q.institution) AND ucl.layout=q.layout
ORDER BY "usr", "group", "institution", "layout";
... if you're using MySQL you'll need to replace those "double quotes"
with `backticks`, or run "SET SQL_MODE='POSTGRESQL';"
Cheers,
Aaron
** Changed in: mahara
Importance: Undecided => Low
** Changed in: mahara
Status: Incomplete => Confirmed
** Also affects: mahara/16.04
Importance: Low
Status: Confirmed
** Also affects: mahara/15.10
Importance: Undecided
Status: New
** Changed in: mahara/15.10
Milestone: None => 15.10.1
** Changed in: mahara/16.04
Milestone: 15.10.1 => 16.04.0
** Changed in: mahara/15.10
Importance: Undecided => Low
** Changed in: mahara/15.10
Status: New => Confirmed
** Summary changed:
- Copy a collection failing
+ Duplicate records in usr_custom_layout cause fatal crash when copying a collection
--
You received this bug notification because you are a member of Mahara
Contributors, which is subscribed to Mahara.
Matching subscriptions: Subscription for all Mahara Contributors -- please ask on #mahara-dev or mahara.org forum before editing or unsubscribing it!
https://bugs.launchpad.net/bugs/1515929
Title:
Duplicate records in usr_custom_layout cause fatal crash when copying
a collection
Status in Mahara:
Confirmed
Status in Mahara 15.10 series:
Confirmed
Status in Mahara 16.04 series:
Confirmed
Bug description:
When creating a collection by copying a previous collection we are
getting an error of:
Site unavailable
A nonrecoverable error occurred. This probably means you have encountered a bug in the system
PHP is reporting the following error and we are on the latest version
of Mahara to date 15.10.0:
2015/11/13 09:02:51 [error] 1077#0: *7505 FastCGI sent in stderr: "PHP message: [WAR] 0a (lib/errors.php:747) get_record_sql found more than one row. If you meant to retrieve more than one record, use get_records_*, otherwise check your code or database for inconsistencies
PHP message: Call stack (most recent first):
PHP message: * log_message("get_record_sql found more than one row. If you mea...", 8, true, true) at /scratch/var/mahara/htdocs/lib/errors.php:97
PHP message: * log_warn("get_record_sql found more than one row. If you mea...") at /scratch/var/mahara/htdocs/lib/errors.php:747
PHP message: * SQLException->__construct("get_record_sql found more than one row. If you mea...") at /scratch/var/mahara/htdocs/lib/dml.php:328
PHP message: * get_record_sql("SELECT * FROM "usr_custom_layout" WHERE "layout" ...", array(size 2)) at /scratch/var/mahara/htdocs/lib/dml.php:291
PHP message: * get_record("usr_custom_layout", "layout", "203", "usr", "1770") at /scratch/var/mahara/htdocs/lib/view.php:428
PHP message: * View::create_from_template(array(size 5), "40765", "1770", true, false) at /scratch/var/mahara/htdocs/lib/collection.php:292
PHP message: * Collection::create_from_template(array(size 6), 4307) at /scratch/var/mahara/htdocs/lib/view.php:6376
PHP message: * createview_submit(object(Pieform), array(size 7)) at Unknown:0
PHP message: * call_user_func_array("createview_submit", array(size 2)) at /scratch/var/mahara/htdocs/lib/pieforms/pieform.php:537
PHP message: * Pieform->__construct(array(size 8)) at /scratch/var/mahara/htdocs/lib/pieforms/pieform.php:164
PHP message: * Pieform::process(array(size 8)) at /scratch/var/mahara/htdocs/lib/pieforms/pieform.php:71
PHP message: * pieform(array(size 8)) at /scratch/var/mahara/htdocs/view/choosetemplate.php:27
PHP message:
PHP message: [WAR] 0a (lib/dml.php:327) get_record_sql found more than one row. If you meant to retrieve more than one record, use get_records_*, otherwise check your code or database for inconsistencies
PHP message: Ca
Cheers,
Ed
To manage notifications about this bug go to:
https://bugs.launchpad.net/mahara/+bug/1515929/+subscriptions
References