Seite 1 von 2

Session: freeze() failed & Duplicate entry

Verfasst: Mi 31. Mai 2006, 09:01
von asycs
Folgend Fehlermeldungen treten sporadisch auf:

[30-May-2006 14:41:46] /cms/cms/front_content.php?idcatart=4&lang=1&client=1 Session: freeze() failed.
[30-May-2006 18:57:35] /cms/cms/front_content.php?idcatart=4&lang=1&client=1 MySQL error 1062: Duplicate entry 'bff08dee6542e49ace4d01271b560c4a' for key 1
insert into con_phplib_active_sessions ( sid, name, val, changed ) values ('bff08dee6542e49ace4d01271b560c4a', 'sid_1_1', '- sehr langer string -', '20060530185734')



Die Folge des ganzen - Ladezeiten wie zu Omas Zeiten.
Die Fehlermeldung scheint aber nur dann aufzutreten, wenn Artikel geändert wurden.
Betrifft auch nicht die Artikel, die geändert wurden, sondern irgendwelche.

Laut Fehlermeldung oben, scheint es Probleme bei idcatart=4 zu geben.
Dieser Artikel wurde aber def. nicht geändert.


Der Session: freeze() Fehler scheint ja nicht das Problem zu sein, soweit die Meinungen im Forum.
Hab aber keine Threads gefunden, bei denen freeze() und sql Fehler gemeinsam auftauchen.


Danke für Hinweise und Tipps.

Verfasst: Mi 31. Mai 2006, 09:16
von emergence
dafür gibts leider keine lösung...

konnte man bis jetzt noch nie nachvollziehen warum und wieso...
dass das system dadurch langsam wird, ist mir in der beziehung aber auch noch nicht aufgefallen..

Verfasst: Mo 10. Jul 2006, 14:16
von Dalamar
Ich denke ich habe eine Lösung gefunden.

Werde aber noch ein wenig testen.

Gruss,
Christian

Verfasst: Di 11. Jul 2006, 10:49
von Dalamar
Ok, vielleicht interessiert es ja jemanden.

/conlib/ct_sql.inc öffnen und folgende Funktion

Code: Alles auswählen

  function ac_store($id, $name, $str) {
    $ret = true;

    switch ( $this->encoding_mode ) {
      case "slashes":
        $str = addslashes($name . ":" . $str);
      break;

      case "base64":
      default:
        $str = base64_encode($name . ":" . $str);
    };

    $name = addslashes($name);

    ## update duration of visit
    global $HTTP_REFERER, $HTTP_USER_AGENT, $REMOTE_ADDR;

    $now = date("YmdHis", time());
    $uquery = sprintf("update %s set val='%s', changed='%s' where sid='%s' and name='%s'",
      $this->database_table,
      $str,
      $now,
      $id,
      $name);
    $squery = sprintf("select count(*) from %s where val='%s' and changed='%s' and sid='%s' and name='%s'",
      $this->database_table,
      $str,
      $now,
      $id,
      $name);
    $iquery = sprintf("insert into %s ( sid, name, val, changed ) values ('%s', '%s', '%s', '%s')",
      $this->database_table,
      $id,
      $name,
      $str,
      $now);

    $this->db->query($uquery);

    # FIRST test to see if any rows were affected.
    #   Zero rows affected could mean either there were no matching rows
    #   whatsoever, OR that the update statement did match a row but made
    #   no changes to the table data (i.e. UPDATE tbl SET col = 'x', when
    #   "col" is _already_ set to 'x') so then,
    # SECOND, query(SELECT...) on the sid to determine if the row is in
    #   fact there,
    # THIRD, verify that there is at least one row present, and if there
    #   is not, then
    # FOURTH, insert the row as we've determined that it does not exist.

    if ( $this->db->affected_rows() == 0
        && $this->db->query($squery)
        && $this->db->next_record() && $this->db->f(0) == 0
        && !$this->db->query($iquery)) {

        $ret = false;
    }
    return $ret;
  }
durch diese

Code: Alles auswählen

  function ac_store($id, $name, $str)
  {
	$ret = true;

	switch ($this->encoding_mode)
	{
		case "slashes":
			$str = addslashes($name . ":" . $str);
			break;

		case "base64":
		default:
			$str = base64_encode($name . ":" . $str);
    	}

	$name = addslashes($name);
	global $HTTP_REFERER, $HTTP_USER_AGENT, $REMOTE_ADDR;
	$now = date("YmdHis", time());
     
	$iquery = sprintf("replace into %s ( sid, name, val, changed ) values ('%s', '%s', '%s', '%s')",
		$this->database_table,
		$id,
		$name,
		$str,
		$now);

	if (!$this->db->query($iquery)) $ret = false;
    	
    	return $ret;
  }
ersetzen.

Bisher tauchte bei mir keine Session Freeze Failed Meldung mehr im Log auf. Vielleicht kann das jemand testen.

LG,
Christian

Verfasst: Di 11. Jul 2006, 13:56
von Thorsten G.
Habe den Code geändert und arbeite jetzt seit einer Stunde in contenido.
Seither keine Errorlog-Einträge mehr.

Eins, setzen.

Verfasst: Di 11. Jul 2006, 14:32
von HerrB
Schön, vor allem, da die Stelle eingegrenzt wurde. Nochmal näher ansehen...

Verschoben.

Gruß
HerrB

Verfasst: Di 11. Jul 2006, 14:42
von emergence
intressanter ansatz...
hab etwas gesucht und das hier gefunden
http://home.fnal.gov/~dbox/SQL_API_Portability.html
replace into foo values ( 'bar',1);
completely non portable. Use delete/insert or update as appropriate.
hmm...
einen verdacht warum das eigentlich manchmal zustande kommen kann hab ich ja mittlerweile... (tritt an sich ja nur im backend auf)
mögliche ursache -> wenn innerhalb eines framesets zur selben zeit der gleiche code ausgeführt wird...

folgende code änderung könnte auch funktionieren (sperren der tabelle beim updaten):

Code: Alles auswählen

  function ac_store($id, $name, $str) {
	$ret = true;

	switch ( $this->encoding_mode ) {
	  case "slashes":
		$str = addslashes($name . ":" . $str);
	  break;

	  case "base64":
	  default:
		$str = base64_encode($name . ":" . $str);
	};

	$name = addslashes($name);

	## update duration of visit
	global $HTTP_REFERER, $HTTP_USER_AGENT, $REMOTE_ADDR;

	$now = date("YmdHis", time());
	$uquery = sprintf("update %s set val='%s', changed='%s' where sid='%s' and name='%s'",
	  $this->database_table,
	  $str,
	  $now,
	  $id,
	  $name);
	$squery = sprintf("select count(*) from %s where val='%s' and changed='%s' and sid='%s' and name='%s'",
	  $this->database_table,
	  $str,
	  $now,
	  $id,
	  $name);
	$iquery = sprintf("insert into %s ( sid, name, val, changed ) values ('%s', '%s', '%s', '%s')",
	  $this->database_table,
	  $id,
	  $name,
	  $str,
	  $now);

	$this->db->lock($this->database_table);
	$this->db->query($uquery);

	# FIRST test to see if any rows were affected.
	#	Zero rows affected could mean either there were no matching rows
	#	whatsoever, OR that the update statement did match a row but made
	#	no changes to the table data (i.e. UPDATE tbl SET col = 'x', when
	#	"col" is _already_ set to 'x') so then,
	# SECOND, query(SELECT...) on the sid to determine if the row is in
	#	fact there,
	# THIRD, verify that there is at least one row present, and if there
	#	is not, then
	# FOURTH, insert the row as we've determined that it does not exist.

	if ( $this->db->affected_rows() == 0
		&& $this->db->query($squery)
		&& $this->db->next_record() && $this->db->f(0) == 0
		&& !$this->db->query($iquery)) {

		$ret = false;
	}

	$this->db->unlock();

	return $ret;
  }
das ist jetzt aber nicht getestet...

Verfasst: Fr 20. Okt 2006, 09:41
von Dalamar
Moin Contenido-Team,

ich bin jetzt endlich dazu gekommen, die 4.6.15er Version auszuprobieren. Dabei ist mir aufgefallen, dass das Session Freeze Problem immer noch auftritt (bei mir bereits nach 3min Backend-Wurschtelei).

Wäre schön, wenn Ihr eine/n Workaround/Lösung in die nächste Version einbaut. Einen Lösungsvorschlag habe ich bereits weiter oben gepostet.

Danke Euch.

LG,
Christian

Verfasst: Mo 15. Okt 2007, 14:55
von Dalamar
Leider enthält die Version 4.6.23 diesen Fehler immer noch.

Verfasst: Mo 15. Okt 2007, 17:06
von HerrB
Ja, da dieser Thread offen ist, wurde es noch nicht eingebaut.

Gruß
HerrB

Verfasst: Fr 16. Nov 2007, 17:30
von wosch
emergence hat geschrieben:dafür gibts leider keine lösung...

konnte man bis jetzt noch nie nachvollziehen warum und wieso...
Ich poste es mal zum Überprüfen ob sich damit der Fehler reproduzieren läßt.
Ich hatte diesen Fehler (wie in Posting #1) seit ewigen Zeiten nicht mehr.
Dann habe ich ein Bild über die Dateiverwaltung hochgeladen.
Bildname: kuezel_bildname_x
das Bild lag im Unterverzeichnis upload/w
Und im Unterverzeichnis upload/c lag ein anders Bild mit exakt dem gleichen Namen.
Bilder wurden im Artikel richtig angezeigt, aber der Fehler war da.
Erst als ich das Bild im Verzeichnis w gelöscht und mit einem anderen Namen neu hochgeladen hatte war der Fehler weg.

Zufall ???

Verfasst: Di 25. Dez 2007, 12:42
von Contenider
Wird das in die nächste Version eingebaut?

Verfasst: Mi 26. Dez 2007, 18:44
von bweichel
hi wosch,

ich habe das gleiche Problem mit den Bildern... hast du eine Lösung oder einen Ansatz woran es liegen könnte? Es ist zum verzweifeln...

Verfasst: Sa 29. Dez 2007, 20:44
von Dalamar
@bweichel: Einen Workaround findest Du weiter oben! :D

Verfasst: Di 8. Jan 2008, 19:38
von HerrB
Zunächst Fix von emergence eingebaut.

Gruß
HerrB