[wp-trac] [WordPress Trac] #17483: Comments displayed multiple times in edit moderated comments screen

WordPress Trac wp-trac at lists.automattic.com
Wed May 18 03:00:37 UTC 2011


#17483: Comments displayed multiple times in edit moderated comments screen
--------------------------+-----------------------------
 Reporter:  mintindeed    |      Owner:
     Type:  defect (bug)  |     Status:  new
 Priority:  normal        |  Milestone:  Awaiting Review
Component:  Comments      |    Version:  3.1.2
 Severity:  normal        |   Keywords:
--------------------------+-----------------------------
 When moderating comments on WP Admin > Comments > Pending, there is a race
 condition in the ajax code that can cause the same comment to be displayed
 multiple times.

 If you change the status (approve, spam, trash) of a comment, then change
 the status of another comment before the ajax response from
 refillTheExtraList() (located in trunk/wp-admin/js/edit-comments.dev.js)
 is returned, then the response from refillTheExtraList() triggered by the
 second comment will populate the extra list with a duplicate comment.
 This isn't immediately obvious unless you are moderating enough comments
 to cause the duplicate comments to float to the top and appear in the
 comments list.  At that point, you may have multiple instances of the same
 comment (with the same id) visible on the page, which will start causing
 weird things to happen when you try and modify them (since there are now
 multiple comments on the page with the same ID).

 Here are steps to get it to reproduce, '''it can be reproduces in WP 3.1.2
 as well as trunk as of svn r17949''':
 * Go to WP Admin > Comments > Pending and view the contents of the hidden
 the-extra-comment-list table using firebug etc. Note the comments IDs that
 are present.  (It's easier if you change the number of comments shown to
 something small, like 5.)
 * Using a proxy like Charles or Fiddler, throttle your connections to the
 server so that admin-ajax.php will take a while to respond (long enough
 for you to change the status of multiple comments).
 * Approve a bunch of comments and watch the contents of the the-extra-
 comment-list table. You will start seeing duplicate comments appear.
 * Once you’ve approved enough comments, the duplicate comments start
 getting appended to the "real" comments list.
 * Once the "real" comments list is appended with duplicate comments and
 you start trying to interact with the duplicates, the page starts getting
 jacked up.

 We have coded up a fairly simple patch to wpList (/wp-includes/js/wp-
 lists.dev.js) that checks whether an element with the same ID exists
 before appending it to the extra list.  We put it here because this same
 condition may present itself in other places where the wpList.add method
 is used.

 This is only half the solution, however, because if you consistently
 moderate enough comments that this issue presents itself, and you
 encounter this race condition more than 8 times, the extra list will
 eventually shrink to 1 row, and will eventually shrink the number of
 comments presented for moderation down to 1 because you're moderating
 faster than the server can fill the list.

 I'm not sure if the answer here is:
 1. to call refillTheExtraList() using an exponential backoff if an element
 of the extra list already exists with the same ID (which presents some
 additional challenges since refillTheExtraList() is implemented as a
 private method), or
 2. to implement a queue so that each subsequent time refillTheExtraList()
 is called its offset is increased by the number of admin-ajax.php called
 still haven't responded (which would need some significant refactoring of
 the code), or
 3. just let the list dry up and let the user page forward or refresh if
 they run out of comments, since it's an edge case already (the easiest
 solution, but maybe not the correct one)

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


More information about the wp-trac mailing list