← Back to team overview

mahara-contributors team mailing list archive

[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