I just submitted a trac ticket about this:
delete_post_meta() functions don’t know how to deal with post revision IDs.
add_post_meta() does, it uses the following block of code to make sure the passed $post_id is a real post, not a revision:
if ( $the_post = wp_is_post_revision($post_id) ) $post_id = $the_post;
This is important because the global $post_id when a post is being saved is for the revision, not the real post. If you pass that to these functions,
delete_post_meta() will try to update or delete the records related to the revision. When
update_post_meta() fails to find any records for the post_id you submitted, it calls
add_post_meta(). Each attempt at updating the meta will actually create a new row in the table.
For now I’m checking with
wp_is_post_revision() before making any calls to the post_meta functions.