MB-21925: Fix queue_fill stat when persitenceCursor on queue_op::empty 30/70730/3 v4.6.0 v4.6.0-MP1
authorDave Rigby <daver@couchbase.com>
Wed, 7 Dec 2016 17:44:03 +0000 (17:44 +0000)
committerDave Rigby <daver@couchbase.com>
Fri, 9 Dec 2016 14:01:36 +0000 (14:01 +0000)
commite4c8bcbbf20b52b11e93665901597875e10b2070
tree221294b6ab3ba2a370dadf8ece2d933c35ee07f0
parentd85969d57aefc717db1816c49c5b712febdc4538
MB-21925: Fix queue_fill stat when persitenceCursor on queue_op::empty

There is a bug related to how we account for items when we enqueue
mutations to be persisted (Checkpoint::queueDirty). The bug occurs
when we enqueue an item which already exists (i.e. it is to be
de-duplicated), and the persistence cursor has not permitted any items
for that VBucket - i.e. at the very beginning of the lifetime of the
VBucket.

With the advent of the MB-20852 (the set_vbucket_state changes), the
first item in a Bucket's checkpoint is now a
queue_op::set_vbucket_state - previously it would have been a "normal"
item. When items are added to a checkpoint, we just update the queuing
stats - essentially there are two possibilities:

1. The item is a new key (NEW_KEY), or it's a key which isn't new but
   has already been persisted (PERSIST_AGAIN) - we need to persist it -
   increment queue_fill

2. The item can be de-duplcated (EXISTING_ITEM) - don't increment
   queue_fill.

Essentially, there's a bug in this logic - we incorrectly mark the
incoming item as PERSIST_AGAIN, instead of EXISTING_ITEM. As a result
the queue_fill value is incorrectly inflated.

This is due to using a unsigned value for the mutation_id, which we
decrement by one if it's a meta_item. This should go to -1 (less than
any possible valid item id), but instead it goes to 2^63-1, *greater*
than any possible valid item (!)

Note: this is purely a stats issue, the actual item /is/ queued and
persisted correctly.

Change-Id: I8d40c417dc165e192b4f90e8cc16c6e87557d451
Reviewed-on: http://review.couchbase.org/70730
Tested-by: buildbot <build@couchbase.com>
Well-Formed: buildbot <build@couchbase.com>
Reviewed-by: Daniel Owen <owend@couchbase.com>
src/checkpoint.cc
src/checkpoint.h
tests/module_tests/checkpoint_test.cc