/**
* Copyright (C) 2018 MongoDB Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
* linked combinations including the program with the OpenSSL library. You
* must comply with the GNU Affero General Public License in all respects
* for all of the code used other than as permitted herein. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you do not
* wish to do so, delete this exception statement from your version. If you
* delete this exception statement from all source files in the program,
* then also delete it in the license file.
*/
#include "mongo/platform/basic.h"
#include
#include "mongo/db/curop.h"
#include "mongo/unittest/unittest.h"
namespace mongo {
namespace {
TEST(CurOpTest, AddingAdditiveMetricsObjectsTogetherShouldAddFieldsTogether) {
OpDebug::AdditiveMetrics currentAdditiveMetrics = OpDebug::AdditiveMetrics();
OpDebug::AdditiveMetrics additiveMetricsToAdd = OpDebug::AdditiveMetrics();
// Initialize field values for both AdditiveMetrics objects.
currentAdditiveMetrics.keysExamined = 0;
additiveMetricsToAdd.keysExamined = 2;
currentAdditiveMetrics.docsExamined = 4;
additiveMetricsToAdd.docsExamined = 2;
currentAdditiveMetrics.nMatched = 5;
additiveMetricsToAdd.nMatched = 5;
currentAdditiveMetrics.nModified = 3;
additiveMetricsToAdd.nModified = 1;
currentAdditiveMetrics.ninserted = 4;
additiveMetricsToAdd.ninserted = 0;
currentAdditiveMetrics.ndeleted = 3;
additiveMetricsToAdd.ndeleted = 2;
currentAdditiveMetrics.nmoved = 0;
additiveMetricsToAdd.nmoved = 4;
currentAdditiveMetrics.keysInserted = 6;
additiveMetricsToAdd.keysInserted = 5;
currentAdditiveMetrics.keysDeleted = 4;
additiveMetricsToAdd.keysDeleted = 2;
currentAdditiveMetrics.prepareReadConflicts = 1;
additiveMetricsToAdd.prepareReadConflicts = 5;
currentAdditiveMetrics.writeConflicts = 7;
additiveMetricsToAdd.writeConflicts = 0;
// Save the current AdditiveMetrics object before adding.
OpDebug::AdditiveMetrics additiveMetricsBeforeAdd = currentAdditiveMetrics;
currentAdditiveMetrics.add(additiveMetricsToAdd);
// The following field values should have changed after adding.
ASSERT_EQ(*currentAdditiveMetrics.keysExamined,
*additiveMetricsBeforeAdd.keysExamined + *additiveMetricsToAdd.keysExamined);
ASSERT_EQ(*currentAdditiveMetrics.docsExamined,
*additiveMetricsBeforeAdd.docsExamined + *additiveMetricsToAdd.docsExamined);
ASSERT_EQ(*currentAdditiveMetrics.nMatched,
*additiveMetricsBeforeAdd.nMatched + *additiveMetricsToAdd.nMatched);
ASSERT_EQ(*currentAdditiveMetrics.nModified,
*additiveMetricsBeforeAdd.nModified + *additiveMetricsToAdd.nModified);
ASSERT_EQ(*currentAdditiveMetrics.ninserted,
*additiveMetricsBeforeAdd.ninserted + *additiveMetricsToAdd.ninserted);
ASSERT_EQ(*currentAdditiveMetrics.ndeleted,
*additiveMetricsBeforeAdd.ndeleted + *additiveMetricsToAdd.ndeleted);
ASSERT_EQ(*currentAdditiveMetrics.nmoved,
*additiveMetricsBeforeAdd.nmoved + *additiveMetricsToAdd.nmoved);
ASSERT_EQ(*currentAdditiveMetrics.keysInserted,
*additiveMetricsBeforeAdd.keysInserted + *additiveMetricsToAdd.keysInserted);
ASSERT_EQ(*currentAdditiveMetrics.keysDeleted,
*additiveMetricsBeforeAdd.keysDeleted + *additiveMetricsToAdd.keysDeleted);
ASSERT_EQ(*currentAdditiveMetrics.prepareReadConflicts,
*additiveMetricsBeforeAdd.prepareReadConflicts +
*additiveMetricsToAdd.prepareReadConflicts);
ASSERT_EQ(*currentAdditiveMetrics.writeConflicts,
*additiveMetricsBeforeAdd.writeConflicts + *additiveMetricsToAdd.writeConflicts);
}
TEST(CurOpTest, AddingUninitializedAdditiveMetricsFieldsShouldBeTreatedAsZero) {
OpDebug::AdditiveMetrics currentAdditiveMetrics = OpDebug::AdditiveMetrics();
OpDebug::AdditiveMetrics additiveMetricsToAdd = OpDebug::AdditiveMetrics();
// Initialize field values for both AdditiveMetrics objects.
additiveMetricsToAdd.keysExamined = 5;
currentAdditiveMetrics.docsExamined = 4;
currentAdditiveMetrics.nModified = 3;
additiveMetricsToAdd.ninserted = 0;
currentAdditiveMetrics.nmoved = 0;
additiveMetricsToAdd.nmoved = 4;
currentAdditiveMetrics.keysInserted = 6;
additiveMetricsToAdd.keysInserted = 5;
currentAdditiveMetrics.keysDeleted = 4;
additiveMetricsToAdd.keysDeleted = 2;
currentAdditiveMetrics.prepareReadConflicts = 1;
additiveMetricsToAdd.prepareReadConflicts = 5;
currentAdditiveMetrics.writeConflicts = 7;
additiveMetricsToAdd.writeConflicts = 0;
// Save the current AdditiveMetrics object before adding.
OpDebug::AdditiveMetrics additiveMetricsBeforeAdd = currentAdditiveMetrics;
currentAdditiveMetrics.add(additiveMetricsToAdd);
// The 'keysExamined' field for the current AdditiveMetrics object was not initialized, so it
// should be treated as zero.
ASSERT_EQ(*currentAdditiveMetrics.keysExamined, *additiveMetricsToAdd.keysExamined);
// The 'docsExamined' field for the AdditiveMetrics object to add was not initialized, so it
// should be treated as zero.
ASSERT_EQ(*currentAdditiveMetrics.docsExamined, *additiveMetricsBeforeAdd.docsExamined);
// The 'nMatched' field for both the current AdditiveMetrics object and the AdditiveMetrics
// object to add were not initialized, so nMatched should still be uninitialized after the add.
ASSERT_EQ(currentAdditiveMetrics.nMatched, boost::none);
// The following field values should have changed after adding.
ASSERT_EQ(*currentAdditiveMetrics.nmoved,
*additiveMetricsBeforeAdd.nmoved + *additiveMetricsToAdd.nmoved);
ASSERT_EQ(*currentAdditiveMetrics.keysInserted,
*additiveMetricsBeforeAdd.keysInserted + *additiveMetricsToAdd.keysInserted);
ASSERT_EQ(*currentAdditiveMetrics.keysDeleted,
*additiveMetricsBeforeAdd.keysDeleted + *additiveMetricsToAdd.keysDeleted);
ASSERT_EQ(*currentAdditiveMetrics.prepareReadConflicts,
*additiveMetricsBeforeAdd.prepareReadConflicts +
*additiveMetricsToAdd.prepareReadConflicts);
ASSERT_EQ(*currentAdditiveMetrics.writeConflicts,
*additiveMetricsBeforeAdd.writeConflicts + *additiveMetricsToAdd.writeConflicts);
}
TEST(CurOpTest, AdditiveMetricsFieldsShouldIncrementByN) {
OpDebug::AdditiveMetrics additiveMetrics = OpDebug::AdditiveMetrics();
// Initialize field values.
additiveMetrics.writeConflicts = 1;
additiveMetrics.keysInserted = 2;
additiveMetrics.prepareReadConflicts = 6;
// Increment the fields.
additiveMetrics.incrementWriteConflicts(1);
additiveMetrics.incrementKeysInserted(5);
additiveMetrics.incrementKeysDeleted(0);
additiveMetrics.incrementNmoved(1);
additiveMetrics.incrementNinserted(3);
additiveMetrics.incrementPrepareReadConflicts(2);
ASSERT_EQ(*additiveMetrics.writeConflicts, 2);
ASSERT_EQ(*additiveMetrics.keysInserted, 7);
ASSERT_EQ(*additiveMetrics.keysDeleted, 0);
ASSERT_EQ(*additiveMetrics.nmoved, 1);
ASSERT_EQ(*additiveMetrics.ninserted, 3);
ASSERT_EQ(*additiveMetrics.prepareReadConflicts, 8);
}
} // namespace
} // namespace mongo