1
0
Fork 0

Merge branch 'devel' of github.com:arangodb/arangodb into devel

This commit is contained in:
Michael Hackstein 2015-08-26 17:10:14 +02:00
commit 2212be29c0
15 changed files with 167 additions and 12 deletions

View File

@ -16,4 +16,8 @@ configuration of an ArangoDB database's replication applier.
@startDocuBlock JSF_put_api_replication_applier_stop @startDocuBlock JSF_put_api_replication_applier_stop
<!-- arangod/RestHandler/RestReplicationHandler.cpp --> <!-- arangod/RestHandler/RestReplicationHandler.cpp -->
@startDocuBlock JSF_get_api_replication_applier_state @startDocuBlock JSF_get_api_replication_applier_state
<!-- arangod/RestHandler/RestReplicationHandler.cpp -->
@startDocuBlock JSF_put_api_replication_makeSlave

View File

@ -37,6 +37,7 @@
#include "Basics/JsonHelper.h" #include "Basics/JsonHelper.h"
#include "Basics/logging.h" #include "Basics/logging.h"
#include "Basics/tri-strings.h" #include "Basics/tri-strings.h"
#include "Basics/memory-map.h"
#include "VocBase/document-collection.h" #include "VocBase/document-collection.h"
#include "VocBase/server.h" #include "VocBase/server.h"
#include "VocBase/vocbase.h" #include "VocBase/vocbase.h"
@ -738,6 +739,11 @@ static bool IterateDatafilesVector (const TRI_vector_pointer_t* const files,
if (! TRI_IterateDatafile(datafile, iterator, data)) { if (! TRI_IterateDatafile(datafile, iterator, data)) {
return false; return false;
} }
if (datafile->isPhysical(datafile) && datafile->_isSealed) {
TRI_MMFileAdvise(datafile->_data, datafile->_maximalSize,
TRI_MADVISE_RANDOM);
}
} }
return true; return true;

View File

@ -37,6 +37,7 @@
#include "Basics/files.h" #include "Basics/files.h"
#include "Basics/logging.h" #include "Basics/logging.h"
#include "Basics/tri-strings.h" #include "Basics/tri-strings.h"
#include "Basics/memory-map.h"
#include "Utils/transactions.h" #include "Utils/transactions.h"
#include "VocBase/document-collection.h" #include "VocBase/document-collection.h"
#include "VocBase/server.h" #include "VocBase/server.h"
@ -763,6 +764,12 @@ static compaction_initial_context_t InitCompaction (TRI_document_collection_t* d
compaction_info_t* compaction = static_cast<compaction_info_t*>(TRI_AtVector(compactions, i)); compaction_info_t* compaction = static_cast<compaction_info_t*>(TRI_AtVector(compactions, i));
TRI_datafile_t* df = compaction->_datafile; TRI_datafile_t* df = compaction->_datafile;
// We will sequentially scan the logfile for collection:
if (df->isPhysical(df)) {
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_SEQUENTIAL);
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_WILLNEED);
}
if (i == 0) { if (i == 0) {
// extract and store fid // extract and store fid
context._fid = compaction->_datafile->_fid; context._fid = compaction->_datafile->_fid;
@ -772,6 +779,10 @@ static compaction_initial_context_t InitCompaction (TRI_document_collection_t* d
bool ok = TRI_IterateDatafile(df, CalculateSize, &context); bool ok = TRI_IterateDatafile(df, CalculateSize, &context);
if (df->isPhysical(df)) {
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_RANDOM);
}
if (! ok) { if (! ok) {
context._failed = true; context._failed = true;
break; break;

View File

@ -1404,6 +1404,10 @@ TRI_datafile_t* TRI_CreatePhysicalDatafile (char const* filename,
fid, fid,
static_cast<char*>(data)); static_cast<char*>(data));
// Advise OS that sequential access is going to happen:
TRI_MMFileAdvise(datafile->_data, datafile->_maximalSize,
TRI_MADVISE_SEQUENTIAL);
return datafile; return datafile;
} }
@ -1893,6 +1897,12 @@ TRI_datafile_t* TRI_OpenDatafile (char const* filename,
TRI_ProtectMMFile(datafile->_data, datafile->_maximalSize, PROT_READ | PROT_WRITE, datafile->_fd, &datafile->_mmHandle); TRI_ProtectMMFile(datafile->_data, datafile->_maximalSize, PROT_READ | PROT_WRITE, datafile->_fd, &datafile->_mmHandle);
} }
// Advise on sequential use:
TRI_MMFileAdvise(datafile->_data, datafile->_maximalSize,
TRI_MADVISE_SEQUENTIAL);
TRI_MMFileAdvise(datafile->_data, datafile->_maximalSize,
TRI_MADVISE_WILLNEED);
return datafile; return datafile;
} }
@ -2061,6 +2071,12 @@ int TRI_SealDatafile (TRI_datafile_t* datafile) {
return datafile->_lastError; return datafile->_lastError;
} }
if (datafile->isPhysical(datafile)) {
// From now on we predict random access (until collection or compaction):
TRI_MMFileAdvise(datafile->_data, datafile->_maximalSize,
TRI_MADVISE_RANDOM);
}
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }

View File

@ -731,19 +731,19 @@ int TRI_SealDatafile (TRI_datafile_t* datafile) TRI_WARN_UNUSED_RESULT;
bool TRI_RenameDatafile (TRI_datafile_t* datafile, char const* filename); bool TRI_RenameDatafile (TRI_datafile_t* datafile, char const* filename);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief truncates a datafile and seals it /// @brief truncates a datafile and seals it, only called by arango-dfdd
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_TruncateDatafile (char const* path, TRI_voc_size_t position); int TRI_TruncateDatafile (char const* path, TRI_voc_size_t position);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief try to repair a datafile /// @brief try to repair a datafile, only called by arango-dfdd
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool TRI_TryRepairDatafile (char const* path); bool TRI_TryRepairDatafile (char const* path);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief returns information about the datafile /// @brief returns information about the datafile, only called by arango-dfdd
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_df_scan_t TRI_ScanDatafile (char const* path); TRI_df_scan_t TRI_ScanDatafile (char const* path);

View File

@ -32,6 +32,7 @@
#include "Basics/MutexLocker.h" #include "Basics/MutexLocker.h"
#include "Basics/hashes.h" #include "Basics/hashes.h"
#include "Basics/logging.h" #include "Basics/logging.h"
#include "Basics/memory-map.h"
#include "Basics/ConditionLocker.h" #include "Basics/ConditionLocker.h"
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Utils/CollectionGuard.h" #include "Utils/CollectionGuard.h"
@ -739,6 +740,12 @@ int CollectorThread::collect (Logfile* logfile) {
TRI_ASSERT(df != nullptr); TRI_ASSERT(df != nullptr);
// We will sequentially scan the logfile for collection:
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_SEQUENTIAL);
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_WILLNEED);
TRI_DEFER (TRI_MMFileAdvise(df->_data, df->_maximalSize,
TRI_MADVISE_RANDOM));
// create a state for the collector, beginning with the list of failed transactions // create a state for the collector, beginning with the list of failed transactions
CollectorState state; CollectorState state;
state.failedTransactions = _logfileManager->getFailedTransactions(); state.failedTransactions = _logfileManager->getFailedTransactions();

View File

@ -39,6 +39,7 @@
#include "Basics/ReadLocker.h" #include "Basics/ReadLocker.h"
#include "Basics/StringUtils.h" #include "Basics/StringUtils.h"
#include "Basics/WriteLocker.h" #include "Basics/WriteLocker.h"
#include "Basics/memory-map.h"
#include "VocBase/server.h" #include "VocBase/server.h"
#include "Wal/AllocatorThread.h" #include "Wal/AllocatorThread.h"
#include "Wal/CollectorThread.h" #include "Wal/CollectorThread.h"
@ -2064,6 +2065,12 @@ int LogfileManager::inspectLogfiles () {
(unsigned long long) logfile->df()->_tickMin, (unsigned long long) logfile->df()->_tickMin,
(unsigned long long) logfile->df()->_tickMax); (unsigned long long) logfile->df()->_tickMax);
if (logfile->status() == Logfile::StatusType::SEALED) {
// If it is sealed, switch to random access:
TRI_datafile_t* df = logfile->df();
TRI_MMFileAdvise(df->_data, df->_maximalSize, TRI_MADVISE_RANDOM);
}
{ {
MUTEX_LOCKER(_idLock); MUTEX_LOCKER(_idLock);
if (logfile->status() == Logfile::StatusType::SEALED && if (logfile->status() == Logfile::StatusType::SEALED &&

View File

@ -32,6 +32,7 @@
#include "Basics/conversions.h" #include "Basics/conversions.h"
#include "Basics/files.h" #include "Basics/files.h"
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Basics/memory-map.h"
#include "VocBase/collection.h" #include "VocBase/collection.h"
#include "VocBase/replication-applier.h" #include "VocBase/replication-applier.h"
#include "VocBase/VocShaper.h" #include "VocBase/VocShaper.h"
@ -1355,11 +1356,21 @@ int RecoverState::replayLogfile (Logfile* logfile,
LOG_INFO("replaying WAL logfile '%s' (%d of %d)", LOG_INFO("replaying WAL logfile '%s' (%d of %d)",
logfile->filename().c_str(), number + 1, n); logfile->filename().c_str(), number + 1, n);
// Advise on sequential use:
TRI_MMFileAdvise(logfile->df()->_data, logfile->df()->_maximalSize,
TRI_MADVISE_SEQUENTIAL);
TRI_MMFileAdvise(logfile->df()->_data, logfile->df()->_maximalSize,
TRI_MADVISE_WILLNEED);
if (! TRI_IterateDatafile(logfile->df(), &RecoverState::ReplayMarker, static_cast<void*>(this))) { if (! TRI_IterateDatafile(logfile->df(), &RecoverState::ReplayMarker, static_cast<void*>(this))) {
LOG_WARNING("WAL inspection failed when scanning logfile '%s'", logfile->filename().c_str()); LOG_WARNING("WAL inspection failed when scanning logfile '%s'", logfile->filename().c_str());
return TRI_ERROR_ARANGO_RECOVERY; return TRI_ERROR_ARANGO_RECOVERY;
} }
// Advise on random access use:
TRI_MMFileAdvise(logfile->df()->_data, logfile->df()->_maximalSize,
TRI_MADVISE_RANDOM);
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }

View File

@ -41,6 +41,7 @@
#include "Basics/logging.h" #include "Basics/logging.h"
#include "Basics/Mutex.h" #include "Basics/Mutex.h"
#include "Basics/MutexLocker.h" #include "Basics/MutexLocker.h"
#include "Basics/memory-map.h"
namespace triagens { namespace triagens {
namespace basics { namespace basics {
@ -243,6 +244,17 @@ namespace triagens {
// may fail... // may fail...
b._table = new EntryType[b._nrAlloc]; b._table = new EntryType[b._nrAlloc];
#ifdef __linux__
if (b._nrAlloc > 1000000) {
uintptr_t mem = reinterpret_cast<uintptr_t>(b._table);
uintptr_t pageSize = getpagesize();
mem = (mem / pageSize) * pageSize;
void* memptr = reinterpret_cast<void*>(mem);
TRI_MMFileAdvise(memptr, b._nrAlloc * sizeof(EntryType),
TRI_MADVISE_RANDOM);
}
#endif
for (IndexType i = 0; i < b._nrAlloc; i++) { for (IndexType i = 0; i < b._nrAlloc; i++) {
invalidateEntry(b, i); invalidateEntry(b, i);
} }
@ -1032,8 +1044,8 @@ namespace triagens {
/// @brief resize the array /// @brief resize the array
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int resize (IndexType size) throw() { int resize (size_t size) throw() {
size /= static_cast<IndexType>(_buckets.size()); size /= _buckets.size();
for (auto& b : _buckets) { for (auto& b : _buckets) {
if (2 * (2 * size + 1) < 3 * b._nrUsed) { if (2 * (2 * size + 1) < 3 * b._nrUsed) {
return TRI_ERROR_BAD_PARAMETER; return TRI_ERROR_BAD_PARAMETER;
@ -1103,7 +1115,7 @@ namespace triagens {
/// @brief resize the array, internal method /// @brief resize the array, internal method
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void resizeInternal (Bucket& b, IndexType size) { void resizeInternal (Bucket& b, size_t size) {
LOG_ACTION("index-resize %s, target size: %llu", LOG_ACTION("index-resize %s, target size: %llu",
_contextCallback().c_str(), _contextCallback().c_str(),
(unsigned long long) size); (unsigned long long) size);
@ -1112,9 +1124,20 @@ namespace triagens {
EntryType* oldTable = b._table; EntryType* oldTable = b._table;
IndexType oldAlloc = b._nrAlloc; IndexType oldAlloc = b._nrAlloc;
b._nrAlloc = static_cast<IndexType>(TRI_NearPrime(size)); b._nrAlloc = static_cast<IndexType>(TRI_NearPrime(static_cast<uint64_t>(size)));
try { try {
b._table = new EntryType[b._nrAlloc]; b._table = new EntryType[b._nrAlloc];
#ifdef __linux__
if (b._nrAlloc > 1000000) {
uintptr_t mem = reinterpret_cast<uintptr_t>(b._table);
uintptr_t pageSize = getpagesize();
mem = (mem / pageSize) * pageSize;
void* memptr = reinterpret_cast<void*>(mem);
TRI_MMFileAdvise(memptr, b._nrAlloc * sizeof(EntryType),
TRI_MADVISE_RANDOM);
}
#endif
IndexType i; IndexType i;
for (i = 0; i < b._nrAlloc; i++) { for (i = 0; i < b._nrAlloc; i++) {
invalidateEntry(b, i); invalidateEntry(b, i);

View File

@ -47,14 +47,20 @@ namespace triagens {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
struct AttributeName { struct AttributeName {
std::string const name; std::string name;
bool const shouldExpand; bool shouldExpand;
AttributeName (std::string const& pName) AttributeName (std::string const& pName)
: name(pName), shouldExpand(false) { }; : name(pName), shouldExpand(false) {
}
AttributeName (std::string const& pName, bool pExpand) AttributeName (std::string const& pName, bool pExpand)
: name(pName), shouldExpand(pExpand) { }; : name(pName), shouldExpand(pExpand) {
}
AttributeName (const AttributeName& b)
: name(b.name), shouldExpand(b.shouldExpand) {
}
bool operator== (const AttributeName& b) const { bool operator== (const AttributeName& b) const {
return name == b.name && shouldExpand == b.shouldExpand; return name == b.name && shouldExpand == b.shouldExpand;

View File

@ -151,6 +151,30 @@ int TRI_ProtectMMFile (void* memoryAddress,
return TRI_ERROR_SYS_ERROR; return TRI_ERROR_SYS_ERROR;
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief gives hints about upcoming sequential memory usage
////////////////////////////////////////////////////////////////////////////////
int TRI_MMFileAdvise (void* memoryAddress, size_t numOfBytes, int advice) {
#ifdef __linux__
LOG_DEBUG("Doing madvise %d for %lu length %lu", advice,
(uint64_t) memoryAddress, numOfBytes);
char buffer[256];
int res = madvise(memoryAddress, numOfBytes, advice);
if (res == 0) {
return TRI_ERROR_NO_ERROR;
}
else {
char* p = strerror_r(errno, buffer, 256);
LOG_INFO("madvise %d for %lu length %lu failed with: %s ",
advice, (uint64_t) memoryAddress, numOfBytes, p);
return TRI_ERROR_INTERNAL;
}
#else
return TRI_ERROR_NO_ERROR;
#endif
}
#endif #endif
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -49,6 +49,22 @@
#define TRI_MMAP_ANONYMOUS MAP_ANON #define TRI_MMAP_ANONYMOUS MAP_ANON
#endif #endif
////////////////////////////////////////////////////////////////////////////////
/// @brief constants for TRI_MMFileAdvise
////////////////////////////////////////////////////////////////////////////////
#ifdef __linux__
#define TRI_MADVISE_SEQUENTIAL MADV_SEQUENTIAL
#define TRI_MADVISE_RANDOM MADV_RANDOM
#define TRI_MADVISE_WILLNEED MADV_WILLNEED
#define TRI_MADVISE_DONTNEED MADV_DONTNEED
#else
#define TRI_MADVISE_SEQUENTIAL 0
#define TRI_MADVISE_RANDOM 0
#define TRI_MADVISE_WILLNEED 0
#define TRI_MADVISE_DONTNEED 0
#endif
#endif #endif
#endif #endif

View File

@ -335,6 +335,15 @@ int TRI_ProtectMMFile (void* memoryAddress,
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief gives hints about upcoming sequential memory usage
////////////////////////////////////////////////////////////////////////////////
int TRI_MMFileAdvise (void*, size_t, int) {
// Not on Windows
return TRI_ERROR_NO_ERROR;
}
#endif #endif

View File

@ -77,6 +77,15 @@
#endif #endif
////////////////////////////////////////////////////////////////////////////////
/// @brief constants for TRI_MMFileAdvise, not on Windows
////////////////////////////////////////////////////////////////////////////////
#define TRI_MADVISE_SEQUENTIAL 0
#define TRI_MADVISE_RANDOM 0
#define TRI_MADVISE_WILLNEED 0
#define TRI_MADVISE_DONTNEED 0
#endif #endif
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -103,6 +103,12 @@ int TRI_ProtectMMFile (void* memoryAddress,
int fileDescriptor, int fileDescriptor,
void** mmHandle); void** mmHandle);
////////////////////////////////////////////////////////////////////////////////
/// @brief gives hints about upcoming memory usage
////////////////////////////////////////////////////////////////////////////////
int TRI_MMFileAdvise (void* memoryAddress, size_t numOfBytes, int advice);
#endif #endif
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------