1
0
Fork 0

moved things out of TRI_collection_t

This commit is contained in:
jsteemann 2016-09-02 11:56:48 +02:00
parent b76bf9b3fb
commit 4839d65b36
32 changed files with 176 additions and 170 deletions

View File

@ -39,6 +39,7 @@
#endif #endif
#include <velocypack/Builder.h> #include <velocypack/Builder.h>
#include <velocypack/Iterator.h>
#include <velocypack/Slice.h> #include <velocypack/Slice.h>
#include <velocypack/ValueType.h> #include <velocypack/ValueType.h>
#include <velocypack/velocypack-aliases.h> #include <velocypack/velocypack-aliases.h>

View File

@ -85,7 +85,7 @@ size_t Collection::count() const {
} else { } else {
// local case // local case
// cache the result // cache the result
numDocuments = static_cast<int64_t>(collection->_numberDocuments); numDocuments = static_cast<int64_t>(collection->numberDocuments());
} }
} }

View File

@ -3350,16 +3350,16 @@ AqlValue Functions::CollectionCount(
auto resolver = trx->resolver(); auto resolver = trx->resolver();
TRI_voc_cid_t cid = resolver->getCollectionIdLocal(collectionName); TRI_voc_cid_t cid = resolver->getCollectionIdLocal(collectionName);
trx->addCollectionAtRuntime(cid, collectionName); trx->addCollectionAtRuntime(cid, collectionName);
auto document = trx->documentCollection(cid); auto collection = trx->documentCollection(cid);
if (document == nullptr) { if (collection == nullptr) {
THROW_ARANGO_EXCEPTION_FORMAT(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND, THROW_ARANGO_EXCEPTION_FORMAT(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND,
"'%s'", collectionName.c_str()); "'%s'", collectionName.c_str());
} }
TransactionBuilderLeaser builder(trx); TransactionBuilderLeaser builder(trx);
// TODO Temporary until move to LogicalCollection is complete // TODO Temporary until move to LogicalCollection is complete
builder->add(VPackValue(document->_numberDocuments)); builder->add(VPackValue(collection->numberDocuments()));
return AqlValue(builder.get()); return AqlValue(builder.get());
} }

View File

@ -32,6 +32,7 @@
#include "Basics/StaticStrings.h" #include "Basics/StaticStrings.h"
#include "Utils/OperationCursor.h" #include "Utils/OperationCursor.h"
#include "V8/v8-globals.h" #include "V8/v8-globals.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/vocbase.h" #include "VocBase/vocbase.h"
#include <velocypack/Iterator.h> #include <velocypack/Iterator.h>

View File

@ -25,10 +25,14 @@
#include "Aql/ExecutionEngine.h" #include "Aql/ExecutionEngine.h"
#include "Aql/ExecutionPlan.h" #include "Aql/ExecutionPlan.h"
#include "VocBase/EdgeCollectionInfo.h"
#include "Utils/AqlTransaction.h" #include "Utils/AqlTransaction.h"
#include "Utils/OperationCursor.h" #include "Utils/OperationCursor.h"
#include "Utils/Transaction.h" #include "Utils/Transaction.h"
#include "VocBase/EdgeCollectionInfo.h"
#include "VocBase/MasterPointer.h"
#include <velocypack/Iterator.h>
#include <velocypack/velocypack-aliases.h>
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief typedef the template instantiation of the PathFinder /// @brief typedef the template instantiation of the PathFinder

View File

@ -31,6 +31,9 @@
#include "Utils/CollectionNameResolver.h" #include "Utils/CollectionNameResolver.h"
#include "V8Server/V8Traverser.h" #include "V8Server/V8Traverser.h"
#include <velocypack/Iterator.h>
#include <velocypack/velocypack-aliases.h>
using namespace arangodb::basics; using namespace arangodb::basics;
using namespace arangodb::aql; using namespace arangodb::aql;

View File

@ -32,10 +32,12 @@
#include "Cluster/ClusterTraverser.h" #include "Cluster/ClusterTraverser.h"
#include "Utils/OperationCursor.h" #include "Utils/OperationCursor.h"
#include "Utils/Transaction.h" #include "Utils/Transaction.h"
#include "VocBase/SingleServerTraverser.h"
#include "V8/v8-globals.h" #include "V8/v8-globals.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/SingleServerTraverser.h"
#include <velocypack/Builder.h> #include <velocypack/Builder.h>
#include <velocypack/Iterator.h>
#include <velocypack/velocypack-aliases.h> #include <velocypack/velocypack-aliases.h>
using namespace arangodb::aql; using namespace arangodb::aql;

View File

@ -30,6 +30,9 @@
#include "Aql/TraversalOptions.h" #include "Aql/TraversalOptions.h"
#include "Indexes/Index.h" #include "Indexes/Index.h"
#include <velocypack/Iterator.h>
#include <velocypack/velocypack-aliases.h>
using namespace arangodb::basics; using namespace arangodb::basics;
using namespace arangodb::aql; using namespace arangodb::aql;

View File

@ -22,10 +22,11 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "FulltextIndex.h" #include "FulltextIndex.h"
#include "Logger/Logger.h"
#include "Basics/StringRef.h" #include "Basics/StringRef.h"
#include "Basics/Utf8Helper.h" #include "Basics/Utf8Helper.h"
#include "Basics/VelocyPackHelper.h"
#include "FulltextIndex/fulltext-index.h" #include "FulltextIndex/fulltext-index.h"
#include "Logger/Logger.h"
#include "VocBase/collection.h" #include "VocBase/collection.h"
#include "VocBase/transaction.h" #include "VocBase/transaction.h"

View File

@ -24,6 +24,7 @@
#include "GeoIndex.h" #include "GeoIndex.h"
#include "Logger/Logger.h" #include "Logger/Logger.h"
#include "Basics/StringRef.h" #include "Basics/StringRef.h"
#include "Basics/VelocyPackHelper.h"
#include "VocBase/collection.h" #include "VocBase/collection.h"
#include "VocBase/transaction.h" #include "VocBase/transaction.h"

View File

@ -24,6 +24,7 @@
#include "ContinuousSyncer.h" #include "ContinuousSyncer.h"
#include "ApplicationFeatures/ApplicationServer.h" #include "ApplicationFeatures/ApplicationServer.h"
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Basics/StaticStrings.h"
#include "Basics/StringBuffer.h" #include "Basics/StringBuffer.h"
#include "Basics/VelocyPackHelper.h" #include "Basics/VelocyPackHelper.h"
#include "Basics/WriteLocker.h" #include "Basics/WriteLocker.h"

View File

@ -1651,7 +1651,7 @@ int64_t InitialSyncer::getSize(arangodb::LogicalCollection* col) {
} }
auto document = trx.documentCollection(); auto document = trx.documentCollection();
return static_cast<int64_t>(document->_numberDocuments); return static_cast<int64_t>(document->numberDocuments());
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -152,8 +152,6 @@ void MMFilesCleanupThread::cleanupCollection(arangodb::LogicalCollection* collec
// but if we are in server shutdown, we can force unloading of collections // but if we are in server shutdown, we can force unloading of collections
bool isInShutdown = application_features::ApplicationServer::isStopping(); bool isInShutdown = application_features::ApplicationServer::isStopping();
TRI_collection_t* document = collection->_collection;
// loop until done // loop until done
while (true) { while (true) {
@ -217,7 +215,7 @@ void MMFilesCleanupThread::cleanupCollection(arangodb::LogicalCollection* collec
} }
} }
if (!document->isFullyCollected()) { if (!collection->isFullyCollected()) {
bool isDeleted = false; bool isDeleted = false;
// if there is still some garbage collection to perform, // if there is still some garbage collection to perform,

View File

@ -597,7 +597,6 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
// return false; // return false;
// } // }
TRI_collection_t* document = collection->_collection;
wasBlocked = false; wasBlocked = false;
// if we cannot acquire the read lock instantly, we will exit directly. // if we cannot acquire the read lock instantly, we will exit directly.
@ -617,7 +616,7 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
// we already have created a compactor file in progress. // we already have created a compactor file in progress.
// if this happens, then a previous compaction attempt for this collection // if this happens, then a previous compaction attempt for this collection
// failed or is not finished yet // failed or is not finished yet
document->setCompactionStatus(ReasonCompactionBlocked); collection->setCompactionStatus(ReasonCompactionBlocked);
wasBlocked = true; wasBlocked = true;
return false; return false;
} }
@ -627,7 +626,7 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
if (datafiles.empty()) { if (datafiles.empty()) {
// collection has no datafiles // collection has no datafiles
document->setCompactionStatus(ReasonNoDatafiles); collection->setCompactionStatus(ReasonNoDatafiles);
return false; return false;
} }
@ -638,7 +637,7 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
size_t const n = datafiles.size(); size_t const n = datafiles.size();
LOG_TOPIC(DEBUG, Logger::COMPACTOR) << "inspecting datafiles of collection '" << collection->name() << "' for compaction opportunities"; LOG_TOPIC(DEBUG, Logger::COMPACTOR) << "inspecting datafiles of collection '" << collection->name() << "' for compaction opportunities";
size_t start = document->getNextCompactionStartIndex(); size_t start = collection->getNextCompactionStartIndex();
// get number of documents from collection // get number of documents from collection
uint64_t const numDocuments = getNumberOfDocuments(collection); uint64_t const numDocuments = getNumberOfDocuments(collection);
@ -797,10 +796,10 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
if (toCompact.empty()) { if (toCompact.empty()) {
// nothing to compact. now reset start index // nothing to compact. now reset start index
document->setNextCompactionStartIndex(0); collection->setNextCompactionStartIndex(0);
// cleanup local variables // cleanup local variables
document->setCompactionStatus(ReasonNothingToCompact); collection->setCompactionStatus(ReasonNothingToCompact);
LOG_TOPIC(DEBUG, Logger::COMPACTOR) << "inspecting datafiles of collection yielded: " << ReasonNothingToCompact; LOG_TOPIC(DEBUG, Logger::COMPACTOR) << "inspecting datafiles of collection yielded: " << ReasonNothingToCompact;
return false; return false;
} }
@ -808,9 +807,8 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo
// handle datafiles with dead objects // handle datafiles with dead objects
TRI_ASSERT(toCompact.size() >= 1); TRI_ASSERT(toCompact.size() >= 1);
TRI_ASSERT(reason != nullptr); TRI_ASSERT(reason != nullptr);
document->setCompactionStatus(reason); collection->setCompactionStatus(reason);
collection->setNextCompactionStartIndex(start);
document->setNextCompactionStartIndex(start);
compactDatafiles(collection, toCompact); compactDatafiles(collection, toCompact);
return true; return true;
@ -882,7 +880,7 @@ void MMFilesCompactorThread::run() {
try { try {
double const now = TRI_microtime(); double const now = TRI_microtime();
if (document->lastCompaction() + compactionCollectionInterval() <= now) { if (collection->lastCompactionStamp() + compactionCollectionInterval() <= now) {
auto ce = collection->ditches()->createCompactionDitch(__FILE__, auto ce = collection->ditches()->createCompactionDitch(__FILE__,
__LINE__); __LINE__);
@ -896,7 +894,7 @@ void MMFilesCompactorThread::run() {
if (!worked && !wasBlocked) { if (!worked && !wasBlocked) {
// set compaction stamp // set compaction stamp
document->lastCompaction(now); collection->lastCompactionStamp(now);
} }
// if we worked or were blocked, then we don't set the compaction stamp to // if we worked or were blocked, then we don't set the compaction stamp to
// force another round of compaction // force another round of compaction
@ -962,7 +960,7 @@ uint64_t MMFilesCompactorThread::getNumberOfDocuments(LogicalCollection* collect
return 16384; // assume some positive value return 16384; // assume some positive value
} }
return static_cast<int64_t>(collection->_numberDocuments); return collection->numberDocuments();
} }
/// @brief write a copy of the marker into the datafile /// @brief write a copy of the marker into the datafile

View File

@ -1961,7 +1961,7 @@ int MMFilesEngine::transferMarkersWorker(LogicalCollection* collection,
// used only for crash / recovery tests // used only for crash / recovery tests
int numMarkers = 0; int numMarkers = 0;
TRI_voc_tick_t const minTransferTick = collection->_collection->_tickMax; TRI_voc_tick_t const minTransferTick = collection->maxTick();
TRI_ASSERT(!operations.empty()); TRI_ASSERT(!operations.empty());
for (auto it2 = operations.begin(); it2 != operations.end(); ++it2) { for (auto it2 = operations.begin(); it2 != operations.end(); ++it2) {
@ -2080,8 +2080,8 @@ void MMFilesEngine::finishMarker(char const* walPosition,
// update ticks // update ticks
TRI_UpdateTicksDatafile(datafile, marker); TRI_UpdateTicksDatafile(datafile, marker);
TRI_ASSERT(collection->_collection->_tickMax < tick); TRI_ASSERT(collection->maxTick() < tick);
collection->_collection->_tickMax = tick; collection->maxTick(tick);
cache->operations->emplace_back(wal::CollectorOperation( cache->operations->emplace_back(wal::CollectorOperation(
datafilePosition, marker->getSize(), walPosition, cache->lastFid)); datafilePosition, marker->getSize(), walPosition, cache->lastFid));

View File

@ -90,7 +90,7 @@ void CollectionExport::run(uint64_t maxWaitTime, size_t limit) {
uint64_t const maxTries = maxWaitTime / SleepTime; uint64_t const maxTries = maxWaitTime / SleepTime;
while (++tries < maxTries) { while (++tries < maxTries) {
if (_document->isFullyCollected()) { if (_collection->isFullyCollected()) {
break; break;
} }
usleep(SleepTime); usleep(SleepTime);

View File

@ -31,8 +31,9 @@
#include "Utils/StandaloneTransactionContext.h" #include "Utils/StandaloneTransactionContext.h"
#include "VocBase/DatafileHelper.h" #include "VocBase/DatafileHelper.h"
#include "VocBase/Ditch.h" #include "VocBase/Ditch.h"
#include "VocBase/collection.h"
#include "VocBase/LogicalCollection.h" #include "VocBase/LogicalCollection.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/collection.h"
#include "VocBase/ticks.h" #include "VocBase/ticks.h"
#include "VocBase/vocbase.h" #include "VocBase/vocbase.h"
#include "Wal/LogfileManager.h" #include "Wal/LogfileManager.h"

View File

@ -2645,7 +2645,7 @@ OperationResult Transaction::countLocal(std::string const& collectionName) {
// TODO Temporary until the move to LogicalCollection is completed // TODO Temporary until the move to LogicalCollection is completed
LogicalCollection* collection = documentCollection(trxCollection(cid)); LogicalCollection* collection = documentCollection(trxCollection(cid));
uint64_t num = collection->_numberDocuments; uint64_t num = collection->numberDocuments();
res = unlock(trxCollection(cid), TRI_TRANSACTION_READ); res = unlock(trxCollection(cid), TRI_TRANSACTION_READ);

View File

@ -32,6 +32,7 @@
#include "Basics/StaticStrings.h" #include "Basics/StaticStrings.h"
#include "Basics/VelocyPackHelper.h" #include "Basics/VelocyPackHelper.h"
#include "Basics/WriteLocker.h" #include "Basics/WriteLocker.h"
#include "Cluster/ClusterInfo.h"
#include "Cluster/ClusterMethods.h" #include "Cluster/ClusterMethods.h"
#include "Indexes/PrimaryIndex.h" #include "Indexes/PrimaryIndex.h"
#include "RestServer/DatabaseFeature.h" #include "RestServer/DatabaseFeature.h"

View File

@ -27,6 +27,7 @@
#include "Basics/StringUtils.h" #include "Basics/StringUtils.h"
#include "Basics/tri-strings.h" #include "Basics/tri-strings.h"
#include "Basics/VelocyPackHelper.h" #include "Basics/VelocyPackHelper.h"
#include "Cluster/ClusterInfo.h"
#include "Cluster/ClusterMethods.h" #include "Cluster/ClusterMethods.h"
#include "FulltextIndex/fulltext-index.h" #include "FulltextIndex/fulltext-index.h"
#include "Indexes/EdgeIndex.h" #include "Indexes/EdgeIndex.h"

View File

@ -24,7 +24,7 @@
#include "Ditch.h" #include "Ditch.h"
#include "Logger/Logger.h" #include "Logger/Logger.h"
#include "Basics/MutexLocker.h" #include "Basics/MutexLocker.h"
#include "VocBase/collection.h" #include "VocBase/datafile.h"
using namespace arangodb; using namespace arangodb;

View File

@ -325,9 +325,13 @@ LogicalCollection::LogicalCollection(
_masterPointers(), _masterPointers(),
_useSecondaryIndexes(true), _useSecondaryIndexes(true),
_numberDocuments(0), _numberDocuments(0),
_maxTick(0),
_keyGenerator(), _keyGenerator(),
_collection(nullptr), _collection(nullptr),
_lock() { _nextCompactionStartIndex(0),
_lastCompactionStatus(nullptr),
_lastCompactionStamp(0.0),
_uncollectedLogfileEntries(0) {
_keyGenerator.reset(KeyGenerator::factory(other->keyOptions())); _keyGenerator.reset(KeyGenerator::factory(other->keyOptions()));
@ -343,6 +347,8 @@ LogicalCollection::LogicalCollection(
for (auto const& idx : other->_indexes) { for (auto const& idx : other->_indexes) {
_indexes.emplace_back(idx); _indexes.emplace_back(idx);
} }
setCompactionStatus("compaction not yet started");
} }
// @brief Constructor used in coordinator case. // @brief Constructor used in coordinator case.
@ -384,9 +390,13 @@ LogicalCollection::LogicalCollection(TRI_vocbase_t* vocbase, VPackSlice info)
_masterPointers(), _masterPointers(),
_useSecondaryIndexes(true), _useSecondaryIndexes(true),
_numberDocuments(0), _numberDocuments(0),
_maxTick(0),
_keyGenerator(), _keyGenerator(),
_collection(nullptr), _collection(nullptr),
_lock() { _nextCompactionStartIndex(0),
_lastCompactionStatus(nullptr),
_lastCompactionStamp(0.0),
_uncollectedLogfileEntries(0) {
if (!IsAllowedName(info)) { if (!IsAllowedName(info)) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_ARANGO_ILLEGAL_NAME); THROW_ARANGO_EXCEPTION(TRI_ERROR_ARANGO_ILLEGAL_NAME);
@ -472,6 +482,8 @@ LogicalCollection::LogicalCollection(TRI_vocbase_t* vocbase, VPackSlice info)
if (ServerState::instance()->isDBServer()) { if (ServerState::instance()->isDBServer()) {
_followers.reset(new FollowerInfo(this)); _followers.reset(new FollowerInfo(this));
} }
setCompactionStatus("compaction not yet started");
} }
LogicalCollection::~LogicalCollection() { LogicalCollection::~LogicalCollection() {
@ -520,6 +532,30 @@ bool LogicalCollection::IsAllowedName(VPackSlice parameters) {
return true; return true;
} }
/// @brief whether or not a collection is fully collected
bool LogicalCollection::isFullyCollected() {
int64_t uncollected = _uncollectedLogfileEntries.load();
return (uncollected == 0);
}
void LogicalCollection::setNextCompactionStartIndex(size_t index) {
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
_nextCompactionStartIndex = index;
}
size_t LogicalCollection::getNextCompactionStartIndex() {
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
return _nextCompactionStartIndex;
}
void LogicalCollection::setCompactionStatus(char const* reason) {
TRI_ASSERT(reason != nullptr);
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
_lastCompactionStatus = reason;
}
size_t LogicalCollection::journalSize() const { size_t LogicalCollection::journalSize() const {
return _journalSize; return _journalSize;
} }
@ -970,9 +1006,6 @@ std::shared_ptr<arangodb::velocypack::Builder> LogicalCollection::figures() {
auto builder = std::make_shared<VPackBuilder>(); auto builder = std::make_shared<VPackBuilder>();
if (ServerState::instance()->isCoordinator()) { if (ServerState::instance()->isCoordinator()) {
builder->openObject();
builder->close();
int res = figuresOnCoordinator(dbName(), cid_as_string(), builder); int res = figuresOnCoordinator(dbName(), cid_as_string(), builder);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
@ -980,9 +1013,7 @@ std::shared_ptr<arangodb::velocypack::Builder> LogicalCollection::figures() {
} }
} else { } else {
TRI_ASSERT(_collection != nullptr); TRI_ASSERT(_collection != nullptr);
// add figures from TRI_collection_t
builder->openObject(); builder->openObject();
_collection->figures(builder);
// add index information // add index information
size_t sizeIndexes = _masterPointers.memory(); size_t sizeIndexes = _masterPointers.memory();
@ -997,6 +1028,34 @@ std::shared_ptr<arangodb::velocypack::Builder> LogicalCollection::figures() {
builder->add("size", VPackValue(sizeIndexes)); builder->add("size", VPackValue(sizeIndexes));
builder->close(); // indexes builder->close(); // indexes
builder->add("lastTick", VPackValue(_maxTick));
builder->add("uncollectedLogfileEntries", VPackValue(_uncollectedLogfileEntries));
// fills in compaction status
char const* lastCompactionStatus = "-";
char lastCompactionStampString[21];
lastCompactionStampString[0] = '-';
lastCompactionStampString[1] = '\0';
double lastCompactionStamp;
{
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
lastCompactionStatus = _lastCompactionStatus;
lastCompactionStamp = _lastCompactionStamp;
}
if (lastCompactionStatus != nullptr) {
struct tm tb;
time_t tt = static_cast<time_t>(lastCompactionStamp);
TRI_gmtime(tt, &tb);
strftime(&lastCompactionStampString[0], sizeof(lastCompactionStampString), "%Y-%m-%dT%H:%M:%SZ", &tb);
}
builder->add("compactionStatus", VPackValue(VPackValueType::Object));
builder->add("message", VPackValue(lastCompactionStatus));
builder->add("time", VPackValue(&lastCompactionStampString[0]));
builder->close(); // compactionStatus
// add engine-specific figures // add engine-specific figures
getPhysical()->figures(builder); getPhysical()->figures(builder);
@ -2098,6 +2157,7 @@ int LogicalCollection::remove(arangodb::Transaction* trx,
} }
operation.indexed(); operation.indexed();
TRI_ASSERT(_numberDocuments > 0);
_numberDocuments--; _numberDocuments--;
TRI_IF_FAILURE("RemoveDocumentNoOperation") { return TRI_ERROR_DEBUG; } TRI_IF_FAILURE("RemoveDocumentNoOperation") { return TRI_ERROR_DEBUG; }

View File

@ -89,6 +89,28 @@ class LogicalCollection {
static bool IsAllowedName(arangodb::velocypack::Slice parameters); static bool IsAllowedName(arangodb::velocypack::Slice parameters);
// TODO: MOVE TO PHYSICAL?
bool isFullyCollected();
int64_t uncollectedLogfileEntries() const { return _uncollectedLogfileEntries.load(); }
void increaseUncollectedLogfileEntries(int64_t value) {
_uncollectedLogfileEntries += value;
}
void decreaseUncollectedLogfileEntries(int64_t value) {
_uncollectedLogfileEntries -= value;
if (_uncollectedLogfileEntries < 0) {
_uncollectedLogfileEntries = 0;
}
}
void setNextCompactionStartIndex(size_t);
size_t getNextCompactionStartIndex();
void setCompactionStatus(char const*);
double lastCompactionStamp() const { return _lastCompactionStamp; }
void lastCompactionStamp(double value) { _lastCompactionStamp = value; }
// SECTION: Meta Information // SECTION: Meta Information
uint32_t version() const { uint32_t version() const {
return _version; return _version;
@ -120,6 +142,19 @@ class LogicalCollection {
TRI_vocbase_col_status_e tryFetchStatus(bool&); TRI_vocbase_col_status_e tryFetchStatus(bool&);
std::string statusString(); std::string statusString();
TRI_voc_tick_t maxTick() const { return _maxTick; }
void maxTick(TRI_voc_tick_t value) { _maxTick = value; }
uint64_t numberDocuments() const { return _numberDocuments; }
// TODO: REMOVE THESE OR MAKE PRIVATE
void incNumberDocuments() { ++_numberDocuments; }
void decNumberDocuments() {
TRI_ASSERT(_numberDocuments > 0);
--_numberDocuments;
}
// TODO this should be part of physical collection! // TODO this should be part of physical collection!
size_t journalSize() const; size_t journalSize() const;
@ -489,11 +524,10 @@ class LogicalCollection {
// whether or not secondary indexes should be filled // whether or not secondary indexes should be filled
bool _useSecondaryIndexes; bool _useSecondaryIndexes;
// FIXME Both of them are not initialized properly! uint64_t _numberDocuments;
public:
// FIXME Must be private. OpenIterator uses this. TRI_voc_tick_t _maxTick;
int64_t _numberDocuments;
private:
std::unique_ptr<arangodb::KeyGenerator> _keyGenerator; std::unique_ptr<arangodb::KeyGenerator> _keyGenerator;
// TODO REMOVE ME! // TODO REMOVE ME!
@ -502,10 +536,20 @@ class LogicalCollection {
mutable arangodb::basics::ReadWriteLock mutable arangodb::basics::ReadWriteLock
_lock; // lock protecting the status and name _lock; // lock protecting the status and name
private:
mutable arangodb::basics::ReadWriteLock mutable arangodb::basics::ReadWriteLock
_idxLock; // lock protecting the indexes _idxLock; // lock protecting the indexes
mutable arangodb::basics::ReadWriteLock mutable arangodb::basics::ReadWriteLock
_infoLock; // lock protecting the info _infoLock; // lock protecting the info
arangodb::Mutex _compactionStatusLock;
size_t _nextCompactionStartIndex;
char const* _lastCompactionStatus;
double _lastCompactionStamp;
std::atomic<int64_t> _uncollectedLogfileEntries;
}; };
} // namespace arangodb } // namespace arangodb

View File

@ -85,81 +85,10 @@ int TRI_AddOperationTransaction(TRI_transaction_t*,
arangodb::wal::DocumentOperation&, bool&); arangodb::wal::DocumentOperation&, bool&);
TRI_collection_t::TRI_collection_t(TRI_vocbase_t* vocbase) TRI_collection_t::TRI_collection_t(TRI_vocbase_t* vocbase)
: _vocbase(vocbase), : _vocbase(vocbase) {}
_tickMax(0),
_uncollectedLogfileEntries(0),
_nextCompactionStartIndex(0),
_lastCompactionStatus(nullptr),
_lastCompaction(0.0) {
setCompactionStatus("compaction not yet started");
}
TRI_collection_t::~TRI_collection_t() {} TRI_collection_t::~TRI_collection_t() {}
/// @brief whether or not a collection is fully collected
bool TRI_collection_t::isFullyCollected() {
int64_t uncollected = _uncollectedLogfileEntries.load();
return (uncollected == 0);
}
void TRI_collection_t::setNextCompactionStartIndex(size_t index) {
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
_nextCompactionStartIndex = index;
}
size_t TRI_collection_t::getNextCompactionStartIndex() {
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
return _nextCompactionStartIndex;
}
void TRI_collection_t::setCompactionStatus(char const* reason) {
TRI_ASSERT(reason != nullptr);
struct tm tb;
time_t tt = time(nullptr);
TRI_gmtime(tt, &tb);
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
_lastCompactionStatus = reason;
strftime(&_lastCompactionStamp[0], sizeof(_lastCompactionStamp),
"%Y-%m-%dT%H:%M:%SZ", &tb);
}
void TRI_collection_t::getCompactionStatus(char const*& reason,
char* dst, size_t maxSize) {
memset(dst, 0, maxSize);
if (maxSize > sizeof(_lastCompactionStamp)) {
maxSize = sizeof(_lastCompactionStamp);
}
MUTEX_LOCKER(mutexLocker, _compactionStatusLock);
reason = _lastCompactionStatus;
memcpy(dst, &_lastCompactionStamp[0], maxSize);
}
void TRI_collection_t::figures(std::shared_ptr<arangodb::velocypack::Builder>& builder) {
builder->add("uncollectedLogfileEntries", VPackValue(_uncollectedLogfileEntries));
builder->add("lastTick", VPackValue(_tickMax));
// fills in compaction status
char const* lastCompactionStatus = nullptr;
char lastCompactionStamp[21];
getCompactionStatus(lastCompactionStatus,
&lastCompactionStamp[0],
sizeof(lastCompactionStamp));
if (lastCompactionStatus == nullptr) {
lastCompactionStatus = "-";
lastCompactionStamp[0] = '-';
lastCompactionStamp[1] = '\0';
}
builder->add("compactionStatus", VPackValue(VPackValueType::Object));
builder->add("message", VPackValue(lastCompactionStatus));
builder->add("time", VPackValue(&lastCompactionStamp[0]));
builder->close(); // compactionStatus
}
/// @brief checks if a collection name is allowed /// @brief checks if a collection name is allowed
/// Returns true if the name is allowed and false otherwise /// Returns true if the name is allowed and false otherwise
bool TRI_collection_t::IsAllowedName(bool allowSystem, std::string const& name) { bool TRI_collection_t::IsAllowedName(bool allowSystem, std::string const& name) {
@ -309,7 +238,8 @@ static int OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* marker,
return res; return res;
} }
++collection->_numberDocuments;
collection->incNumberDocuments();
// update the datafile info // update the datafile info
state->_dfi->numberAlive++; state->_dfi->numberAlive++;
@ -409,8 +339,7 @@ static int OpenIteratorHandleDeletionMarker(TRI_df_marker_t const* marker,
state->_dfi->numberDeletions++; state->_dfi->numberDeletions++;
collection->deletePrimaryIndex(trx, found); collection->deletePrimaryIndex(trx, found);
collection->decNumberDocuments();
--collection->_numberDocuments;
// free the header // free the header
collection->_masterPointers.release(found); collection->_masterPointers.release(found);
@ -422,7 +351,6 @@ static int OpenIteratorHandleDeletionMarker(TRI_df_marker_t const* marker,
/// @brief iterator for open /// @brief iterator for open
static bool OpenIterator(TRI_df_marker_t const* marker, OpenIteratorState* data, static bool OpenIterator(TRI_df_marker_t const* marker, OpenIteratorState* data,
TRI_datafile_t* datafile) { TRI_datafile_t* datafile) {
TRI_collection_t* document = data->_document;
TRI_voc_tick_t const tick = marker->getTick(); TRI_voc_tick_t const tick = marker->getTick();
TRI_df_marker_type_t const type = marker->getType(); TRI_df_marker_type_t const type = marker->getType();
@ -459,12 +387,12 @@ static bool OpenIterator(TRI_df_marker_t const* marker, OpenIteratorState* data,
datafile->_tickMax = tick; datafile->_tickMax = tick;
} }
if (tick > document->_tickMax) { if (tick > data->_collection->maxTick()) {
if (type != TRI_DF_MARKER_HEADER && if (type != TRI_DF_MARKER_HEADER &&
type != TRI_DF_MARKER_FOOTER && type != TRI_DF_MARKER_FOOTER &&
type != TRI_DF_MARKER_COL_HEADER && type != TRI_DF_MARKER_COL_HEADER &&
type != TRI_DF_MARKER_PROLOGUE) { type != TRI_DF_MARKER_PROLOGUE) {
document->_tickMax = tick; data->_collection->maxTick(tick);
} }
} }

View File

@ -25,22 +25,8 @@
#define ARANGOD_VOC_BASE_COLLECTION_H 1 #define ARANGOD_VOC_BASE_COLLECTION_H 1
#include "Basics/Common.h" #include "Basics/Common.h"
#include "Cluster/ClusterInfo.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/MasterPointers.h"
#include "VocBase/vocbase.h" #include "VocBase/vocbase.h"
namespace arangodb {
namespace velocypack {
template <typename T>
class Buffer;
class Slice;
}
namespace wal {
struct DocumentOperation;
}
}
/// @brief predefined collection name for users /// @brief predefined collection name for users
#define TRI_COL_NAME_USERS "_users" #define TRI_COL_NAME_USERS "_users"
@ -64,32 +50,8 @@ struct TRI_collection_t {
/// returns true if the name is allowed and false otherwise /// returns true if the name is allowed and false otherwise
static bool IsAllowedName(bool isSystem, std::string const& name); static bool IsAllowedName(bool isSystem, std::string const& name);
bool isFullyCollected();
void setNextCompactionStartIndex(size_t);
size_t getNextCompactionStartIndex();
void setCompactionStatus(char const*);
void getCompactionStatus(char const*&, char*, size_t);
void figures(std::shared_ptr<arangodb::velocypack::Builder>& result);
double lastCompaction() const { return _lastCompaction; }
void lastCompaction(double value) { _lastCompaction = value; }
public: public:
TRI_vocbase_t* _vocbase; TRI_vocbase_t* _vocbase;
TRI_voc_tick_t _tickMax;
public:
std::atomic<int64_t> _uncollectedLogfileEntries;
private:
arangodb::Mutex _compactionStatusLock;
size_t _nextCompactionStartIndex;
char const* _lastCompactionStatus;
char _lastCompactionStamp[21];
double _lastCompaction;
}; };
#endif #endif

View File

@ -23,6 +23,7 @@
#include "replication-dump.h" #include "replication-dump.h"
#include "Basics/ReadLocker.h" #include "Basics/ReadLocker.h"
#include "Basics/StaticStrings.h"
#include "Basics/VPackStringBufferAdapter.h" #include "Basics/VPackStringBufferAdapter.h"
#include "Logger/Logger.h" #include "Logger/Logger.h"
#include "VocBase/CompactionLocker.h" #include "VocBase/CompactionLocker.h"

View File

@ -185,7 +185,6 @@ static void FreeOperations(TRI_transaction_t* trx) {
} }
arangodb::LogicalCollection* collection = trxCollection->_collection; arangodb::LogicalCollection* collection = trxCollection->_collection;
TRI_collection_t* document = collection->_collection;
if (mustRollback) { if (mustRollback) {
// revert all operations // revert all operations
@ -236,8 +235,7 @@ static void FreeOperations(TRI_transaction_t* trx) {
collection->setRevision(trxCollection->_originalRevision, true); collection->setRevision(trxCollection->_originalRevision, true);
} else if (!collection->isVolatile() && !isSingleOperation) { } else if (!collection->isVolatile() && !isSingleOperation) {
// only count logfileEntries if the collection is durable // only count logfileEntries if the collection is durable
document->_uncollectedLogfileEntries += collection->increaseUncollectedLogfileEntries(trxCollection->_operations->size());
trxCollection->_operations->size();
} }
delete trxCollection->_operations; delete trxCollection->_operations;
@ -1074,8 +1072,7 @@ int TRI_AddOperationTransaction(TRI_transaction_t* trx,
arangodb::aql::QueryCache::instance()->invalidate( arangodb::aql::QueryCache::instance()->invalidate(
trx->_vocbase, collection->name()); trx->_vocbase, collection->name());
// FIXME collection->increaseUncollectedLogfileEntries(1);
++(collection->_collection->_uncollectedLogfileEntries);
if (operation.type == TRI_VOC_DOCUMENT_OPERATION_UPDATE || if (operation.type == TRI_VOC_DOCUMENT_OPERATION_UPDATE ||
operation.type == TRI_VOC_DOCUMENT_OPERATION_REPLACE || operation.type == TRI_VOC_DOCUMENT_OPERATION_REPLACE ||

View File

@ -56,6 +56,7 @@
#include "VocBase/Ditch.h" #include "VocBase/Ditch.h"
#include "VocBase/collection.h" #include "VocBase/collection.h"
#include "VocBase/LogicalCollection.h" #include "VocBase/LogicalCollection.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/replication-applier.h" #include "VocBase/replication-applier.h"
#include "VocBase/ticks.h" #include "VocBase/ticks.h"
#include "VocBase/transaction.h" #include "VocBase/transaction.h"

View File

@ -670,10 +670,7 @@ int CollectorThread::processCollectionOperations(CollectorCache* cache) {
<< collection->name() << "'"; << collection->name() << "'";
updateDatafileStatistics(collection, cache); updateDatafileStatistics(collection, cache);
document->_uncollectedLogfileEntries -= cache->totalOperationsCount; collection->decreaseUncollectedLogfileEntries(cache->totalOperationsCount);
if (document->_uncollectedLogfileEntries < 0) {
document->_uncollectedLogfileEntries = 0;
}
res = TRI_ERROR_NO_ERROR; res = TRI_ERROR_NO_ERROR;
} catch (arangodb::basics::Exception const& ex) { } catch (arangodb::basics::Exception const& ex) {

View File

@ -4,6 +4,7 @@
#include "Basics/Common.h" #include "Basics/Common.h"
#include "VocBase/LogicalCollection.h" #include "VocBase/LogicalCollection.h"
#include "VocBase/MasterPointer.h"
#include "VocBase/MasterPointers.h" #include "VocBase/MasterPointers.h"
#include "VocBase/voc-types.h" #include "VocBase/voc-types.h"
#include "Wal/Marker.h" #include "Wal/Marker.h"

View File

@ -30,7 +30,6 @@
#include "VocBase/voc-types.h" #include "VocBase/voc-types.h"
#include <velocypack/Slice.h> #include <velocypack/Slice.h>
#include <velocypack/velocypack-aliases.h>
namespace arangodb { namespace arangodb {
namespace wal { namespace wal {

View File

@ -261,8 +261,8 @@ int RecoverState::executeSingleOperation(
return TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND; return TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND;
} }
TRI_voc_tick_t tickMax = collection->_collection->_tickMax; TRI_voc_tick_t maxTick = collection->maxTick();
if (marker->getTick() <= tickMax) { if (marker->getTick() <= maxTick) {
// already transferred this marker // already transferred this marker
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }