[wp-trac] [WordPress Trac] #11081: wp_insert_post() creates duplicates posts with two simultaneous mysql connections

WordPress Trac wp-trac at lists.automattic.com
Thu Nov 5 13:06:19 UTC 2009


#11081: wp_insert_post() creates duplicates posts with two simultaneous mysql
connections
--------------------------+-------------------------------------------------
 Reporter:  maribge       |       Owner:  ryan                                    
     Type:  defect (bug)  |      Status:  new                                     
 Priority:  normal        |   Milestone:  2.9                                     
Component:  Query         |     Version:                                          
 Severity:  normal        |    Keywords:  wp_insert_post, duplicate entries, mysql
--------------------------+-------------------------------------------------
 Hi,

 I'm running the lates 2.8.5 wordpress release, but "tested" this bug with
 an older version too. Tested it on 2 Windows machines and one Unix with
 different mysql versions.

 Precondition: create a sample plugin

 <?php

 /*
 Plugin Name: Test plugin
 Plugin URI: http://test
 Description: test plugin.
 Version: 1.0
 Author: test
 Author URI: http://test
 */


 function test_insertPosts()
 {
 $post['post_title'] = 'test title';
 $post['post_content'] = 'test content';
 $post['post_status'] = 'publish';
 $post['post_author'] = 1;
 $post['post_category'] = array(0);
 $post['guid'] = 'somethingsss';

 $post = add_magic_quotes($post);
 $postID = wp_insert_post($post);

 if(is_wp_error($postID)) return false;

 return $postID;
 }

 add_action('init', 'test_insertPosts');

 ?>

 On each refresh of the blog's home page this plugin should generate one
 post, however occasionally it generates two or even three posts at a time
 by establishing two or more simultaneous connections with a mysql
 database. Generally multiple(duplicate) posts are generated at the first,
 second or third homepage refreshes.

 Watch this video as an illustration:
 [http://www.youtube.com/watch?v=WdeDp4PjZnk] . Don't pay attention to
 other issues addressed in the video though, just the duplicate post issue.

 I looked through the mysql log file to locate the problem. I found that
 occasionally wordpress creates two simultaneous mysql conncetions and
 makes INSERT INTO 'wp_posts' query twice, instead of one and than closes
 both connections. The log file is attached, but I'm posting a snippet of
 it here:


 {{{
 mysqld, Version: 5.1.34-community-log (MySQL Community Server (GPL)).
 started with:
 TCP Port: 3306, Named Pipe: (null)
 Time                 Id Command    Argument
 091105 16:18:00    1 Connect    admin at localhost on
                     1 Query     SET NAMES utf8
                     1 Init DB   wordpress
                     1 Query     SELECT option_name, option_value FROM
 wp_options WHERE autoload = 'yes'
                     1 Query     UPDATE `wp_options` SET `option_value` =
 '1257427080' WHERE `option_name` = '_transient_doing_cron'
                     2 Connect   admin at localhost on
                     2 Query     SET NAMES utf8
                     2 Init DB   wordpress
                     2 Query     SELECT option_name, option_value FROM
 wp_options WHERE autoload = 'yes'
                     2 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'sidebars_widgets' LIMIT 1
                     2 Query     SELECT post_name FROM wp_posts WHERE
 post_name = 'test-title' AND post_type = 'post' AND ID != 0 LIMIT 1
                     2 Query     INSERT INTO `wp_posts`
 (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`)
 VALUES ('1','2009-11-05 16:18:00','2009-11-05 13:18:00','test
 content','','test title','','publish','post','open','open','','test-
 title','','','2009-11-05 16:18:00','2009-11-05
 13:18:00','0','0','somethingsss')
                     2 Query     SELECT tr.term_taxonomy_id FROM
 wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON
 tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (3) AND
 tt.taxonomy IN ('category')
                     2 Query     SELECT * FROM wp_posts WHERE ID = 3 LIMIT
 1
                     2 Query     SELECT ID FROM wp_posts WHERE post_parent
 = 3
                     2 Query     SELECT * FROM wp_posts WHERE ID = 3 LIMIT
 1
                     2 Query     INSERT INTO `wp_postmeta`
 (`post_id`,`meta_value`,`meta_key`) VALUES ('3','1','_pingme')
                     2 Query     INSERT INTO `wp_postmeta`
 (`post_id`,`meta_value`,`meta_key`) VALUES ('3','1','_encloseme')
                     2 Query     SELECT ID FROM wp_posts WHERE post_parent
 = 3
                     2 Query     UPDATE `wp_options` SET `option_value` =
 'a:2:{i:1257467774;a:3:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}s:7:\"version\";i:2;}'
 WHERE `option_name` = 'cron'
                     2 Query     SELECT * FROM wp_posts, wp_postmeta WHERE
 wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_pingme'
 LIMIT 1
                     2 Query     DELETE FROM wp_postmeta WHERE post_id = 3
 AND meta_key = '_pingme'
                     2 Query     SELECT pinged FROM wp_posts WHERE ID = 3
                     2 Query     SELECT * FROM wp_posts, wp_postmeta WHERE
 wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_pingme'
 LIMIT 1
                     2 Query     SELECT * FROM wp_posts, wp_postmeta WHERE
 wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_encloseme'
 LIMIT 1
                     2 Query     DELETE FROM wp_postmeta WHERE post_id = 3
 AND meta_key = '_encloseme'
                     2 Query     SELECT post_id, meta_key, meta_value FROM
 wp_postmeta WHERE post_id IN (3)
                     2 Query     SELECT * FROM wp_posts, wp_postmeta WHERE
 wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_encloseme'
 LIMIT 1
                     2 Query     SELECT ID FROM wp_posts WHERE to_ping <>
 '' AND post_status = 'publish'
 091105 16:18:01    2 Quit
                     1 Query     SELECT * FROM wp_users WHERE user_login =
 'admin'
                     1 Query     SELECT meta_key, meta_value FROM
 wp_usermeta WHERE user_id = 1
                     1 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'sidebars_widgets' LIMIT 1
                     1 Query     SELECT post_name FROM wp_posts WHERE
 post_name = 'test-title' AND post_type = 'post' AND ID != 0 LIMIT 1
                     1 Query     SELECT post_name FROM wp_posts WHERE
 post_name = 'test-title-2' AND post_type = 'post' AND ID != 0 LIMIT 1
                     1 Query     INSERT INTO `wp_posts`
 (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`)
 VALUES ('1','2009-11-05 16:18:01','2009-11-05 13:18:01','test
 content','','test title','','publish','post','open','open','','test-
 title-2','','','2009-11-05 16:18:01','2009-11-05
 13:18:01','0','0','somethingsss')
                     1 Query     SELECT tr.term_taxonomy_id FROM
 wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON
 tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (4) AND
 tt.taxonomy IN ('category')
                     1 Query     SELECT * FROM wp_posts WHERE ID = 4 LIMIT
 1
                     1 Query     SELECT ID FROM wp_posts WHERE post_parent
 = 4
                     1 Query     SELECT * FROM wp_posts WHERE ID = 4 LIMIT
 1
                     1 Query     INSERT INTO `wp_postmeta`
 (`post_id`,`meta_value`,`meta_key`) VALUES ('4','1','_pingme')
                     1 Query     INSERT INTO `wp_postmeta`
 (`post_id`,`meta_value`,`meta_key`) VALUES ('4','1','_encloseme')
                     1 Query     SELECT ID FROM wp_posts WHERE post_parent
 = 4
                     1 Query     SELECT SQL_CALC_FOUND_ROWS  wp_posts.*
 FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND
 (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
 ORDER BY wp_posts.post_date DESC LIMIT 0, 10
                     1 Query     SELECT FOUND_ROWS()
                     1 Query     SELECT t.*, tt.*, tr.object_id FROM
 wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id
 INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id =
 tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND
 tr.object_id IN (4, 3) ORDER BY t.name ASC
                     1 Query     SELECT post_id, meta_key, meta_value FROM
 wp_postmeta WHERE post_id IN (4,3)
                     1 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'kubrick_header_image' LIMIT 1
                     1 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'kubrick_header_color' LIMIT 1
                     1 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'kubrick_header_display' LIMIT 1
                     1 Query     SELECT * FROM wp_posts  WHERE (post_type =
 'page' AND post_status = 'publish')     ORDER BY menu_order, post_title
 ASC
                     1 Query     SELECT option_value FROM wp_options WHERE
 option_name = 'page_for_posts' LIMIT 1
                     1 Query     SELECT YEAR(post_date) AS `year`,
 MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts  WHERE
 post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date),
 MONTH(post_date) ORDER BY post_date DESC
                     1 Query     SELECT t.*, tt.* FROM wp_terms AS t INNER
 JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN
 ('category')  ORDER BY t.name ASC
                     1 Query     SELECT t.*, tt.* FROM wp_terms AS t INNER
 JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN
 ('link_category')  AND tt.count > 0 ORDER BY t.name ASC
                     1 Query     SELECT *  , IF (DATE_ADD(link_updated,
 INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated   FROM wp_links
 INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id =
 tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id =
 tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y'  AND ( tt.term_id = 2
 ) AND taxonomy = 'link_category'    ORDER BY link_name ASC
                     1 Quit
 }}}

 As you can clearly see, after the first connection had been extablished
 and two queries made:

 {{{
 091105 16:18:00    1 Connect    admin at localhost on
                     1 Query     SET NAMES utf8
                     1 Init DB   wordpress
                     1 Query     SELECT option_name, option_value FROM
 wp_options WHERE autoload = 'yes'
                     1 Query     UPDATE `wp_options` SET `option_value` =
 '1257427080' WHERE `option_name` = '_transient_doing_cron'
 }}}

 wordpress initiates another mysql connection:

 {{{
 2 Connect       admin at localhost on
                     2 Query     SET NAMES utf8
                     2 Init DB   wordpress
 }}}

 During the second connection query "INSERT INTO `wp_posts`" is performed.
 Then the second connection session ends:

 {{{
 091105 16:18:01    2 Quit
 }}}

 and queries of the first connection resume, and another "INSERT INTO
 `wp_posts`" query is made (which is a duplicate post). Then the first
 connection shuts down:

 {{{
 1 Quit
 }}}

 I've been trying to figure out what causes it (presumably two instances of
 the wpbd class are made), but failed to locate the problem in the
 wordpress code.

 Thanks,
 Merab.

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/11081>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list