1
0
Fork 0

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

This commit is contained in:
Kaveh Vahedipour 2016-09-13 11:05:10 +02:00
commit 805a64994f
8 changed files with 120 additions and 85 deletions

View File

@ -266,7 +266,7 @@ while [ $# -gt 0 ]; do
;;
--jemalloc)
CONFIGURE_OPTIONS="${CONFIGURE_OPTIONS} -DUSE_JEMALLOC=On"
USE_JEMALLOC=1
shift
;;
@ -318,6 +318,8 @@ while [ $# -gt 0 ]; do
done
if test -n "$LASTREV"; then
lines=`git diff ${LASTREV}: ${COMPILE_MATTERS} | wc -l`
@ -341,6 +343,7 @@ elif [ "$CLANG36" == 1 ]; then
CXX=/usr/bin/clang++-3.6
CXXFLAGS="${CXXFLAGS} -std=c++11"
elif [ "${CXGCC}" = 1 ]; then
USE_JEMALLOC=0
if [ "${ARMV8}" = 1 ]; then
export TOOL_PREFIX=aarch64-linux-gnu
BUILD_DIR="${BUILD_DIR}-ARMV8"
@ -352,6 +355,7 @@ elif [ "${CXGCC}" = 1 ]; then
exit 1;
fi
CONFIGURE_OPTIONS="${CONFIGURE_OPTIONS} -DCROSS_COMPILING=true" # -DCMAKE_LIBRARY_ARCHITECTURE=${TOOL_PREFIX} "
export CXX=$TOOL_PREFIX-g++
export AR=$TOOL_PREFIX-ar
export RANLIB=$TOOL_PREFIX-ranlib
@ -359,11 +363,20 @@ elif [ "${CXGCC}" = 1 ]; then
export LD=$TOOL_PREFIX-g++
export LINK=$TOOL_PREFIX-g++
export STRIP=$TOOL_PREFIX-strip
# we need ARM LD:
GOLD=0;
# tell cmake we're cross compiling:
CONFIGURE_OPTIONS="${CONFIGURE_OPTIONS} -DCROSS_COMPILING=true"
# V8's mksnapshot won't work - ignore it:
MAKE_PARAMS="${MAKE_PARAMS} -i"
fi
if [ "${USE_JEMALLOC}" = 1 ]; then
CONFIGURE_OPTIONS="${CONFIGURE_OPTIONS} -DUSE_JEMALLOC=On"
fi
if [ "$SANITIZE" == 1 ]; then
if [ "$GCC5" == 1 ]; then
@ -451,6 +464,7 @@ if [ ! -f Makefile -o ! -f CMakeCache.txt ]; then
fi
${MAKE_CMD_PREFIX} ${MAKE} ${MAKE_PARAMS}
(cd ${SOURCE_DIR}; git rev-parse HEAD > last_compiled_version.sha)
if [ -n "$CPACK" -a -n "${TARGET_DIR}" ]; then

View File

@ -546,7 +546,7 @@ static void UnsetOrKeep(arangodb::Transaction* trx,
for (auto const& entry : VPackObjectIterator(value, false)) {
TRI_ASSERT(entry.key.isString());
std::string key = entry.key.copyString();
if (!((names.find(key) == names.end()) ^ unset)) {
if ((names.find(key) == names.end()) == unset) {
// not found and unset or found and keep
if (recursive && entry.value.isObject()) {
result.add(entry.key); // Add the key

View File

@ -31,6 +31,7 @@
using namespace arangodb::traverser;
#ifndef USE_ENTERPRISE
TraverserEngineRegistry::EngineInfo::EngineInfo(TRI_vocbase_t* vocbase,
VPackSlice info)
: _isInUse(false),
@ -40,6 +41,7 @@ TraverserEngineRegistry::EngineInfo::EngineInfo(TRI_vocbase_t* vocbase,
TraverserEngineRegistry::EngineInfo::~EngineInfo() {
}
#endif
TraverserEngineRegistry::~TraverserEngineRegistry() {
WRITE_LOCKER(writeLocker, _lock);

View File

@ -53,10 +53,11 @@ bool DepthFirstEnumerator::next() {
_edgeCursors.emplace(cursor);
}
} else {
TRI_ASSERT(!_enumeratedPath.edges.empty());
// This path is at the end. cut the last step
_enumeratedPath.vertices.pop_back();
_enumeratedPath.edges.pop_back();
if (!_enumeratedPath.edges.empty()) {
// This path is at the end. cut the last step
_enumeratedPath.vertices.pop_back();
_enumeratedPath.edges.pop_back();
}
}
while (!_edgeCursors.empty()) {

View File

@ -44,6 +44,22 @@ using namespace arangodb::basics;
namespace {
static std::string hexValue(uint64_t value) {
static const uint64_t Bits[] = { 56, 48, 40, 32, 24, 16, 8, 0 };
std::string line("0x");
for (uint64_t i = 0; i < 8; ++i) {
uint8_t c = static_cast<uint8_t>((static_cast<uint64_t>(value) >> Bits[i]) & 0xFFULL);
uint8_t n1 = c >> 4;
uint8_t n2 = c & 0x0F;
line.push_back((n1 < 10) ? ('0' + n1) : 'A' + n1 - 10);
line.push_back((n2 < 10) ? ('0' + n2) : 'A' + n2 - 10);
}
return line;
}
/// @brief check if a marker appears to be created by ArangoDB 28
static TRI_voc_crc_t Crc28(TRI_voc_crc_t crc, void const* data, size_t length) {
static TRI_voc_crc_t const CrcPolynomial = 0xEDB88320;
@ -445,7 +461,7 @@ char const* TRI_NameMarkerDatafile(TRI_df_marker_t const* marker) {
return "abort transaction";
default:
return "unused/unknown";
return "unknown";
}
}
@ -472,7 +488,7 @@ bool TRI_IsValidMarkerDatafile(TRI_df_marker_t const* marker) {
}
if (marker->getSize() >= DatafileHelper::MaximalMarkerSize()) {
// a single marker bigger than 256 MB seems unreasonable
// a single marker bigger than this limit seems unreasonable
// note: this is an arbitrary limit
return false;
}
@ -1184,8 +1200,9 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
// this function must not be called for non-physical datafiles
TRI_ASSERT(isPhysical());
char* ptr = _data;
char* end = _data + _currentSize;
char const* ptr = _data;
char const* end = _data + _currentSize;
char const* lastGood = nullptr;
TRI_voc_size_t currentSize = 0;
if (_currentSize == 0) {
@ -1200,7 +1217,7 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
[](TRI_voc_tick_t maxTick) -> void { TRI_UpdateTickServer(maxTick); };
while (ptr < end) {
TRI_df_marker_t* marker = reinterpret_cast<TRI_df_marker_t*>(ptr);
TRI_df_marker_t const* marker = reinterpret_cast<TRI_df_marker_t const*>(ptr);
TRI_voc_size_t const size = marker->getSize();
TRI_voc_tick_t const tick = marker->getTick();
TRI_df_marker_type_t const type = marker->getType();
@ -1249,6 +1266,10 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
_state = TRI_DF_STATE_OPEN_ERROR;
LOG(WARN) << "marker in datafile '" << getName() << "' points with size " << size << " beyond end of file";
if (lastGood != nullptr) {
LOG(INFO) << "last good marker found at: " << hexValue(static_cast<uint64_t>(static_cast<uintptr_t>(lastGood - _data)));
}
printMarker(marker, end - ptr, _data, end);
updateTick(maxTick);
@ -1256,8 +1277,7 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
}
// the following sanity check offers some, but not 100% crash-protection
// when reading
// totally corrupted datafiles
// when reading totally corrupted datafiles
if (!TRI_IsValidMarkerDatafile(marker)) {
if (type == 0 && size < 128) {
// ignore markers with type 0 and a small size
@ -1273,6 +1293,10 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
_state = TRI_DF_STATE_OPEN_ERROR;
LOG(WARN) << "marker in datafile '" << getName() << "' is corrupt: type: " << type << ", size: " << size;
if (lastGood != nullptr) {
LOG(INFO) << "last good marker found at: " << hexValue(static_cast<uint64_t>(static_cast<uintptr_t>(lastGood - _data)));
}
printMarker(marker, size, _data, end);
updateTick(maxTick);
@ -1347,70 +1371,11 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
LOG(WARN) << "crc mismatch found inside marker of type '" << TRI_NameMarkerDatafile(marker)
<< "' and size " << size
<< ". expected crc: " << CalculateCrcValue(marker) << ", actual crc: " << marker->getCrc();
{
LOG(INFO) << "raw marker data following:";
char const* p = reinterpret_cast<char const*>(marker);
char const* e = reinterpret_cast<char const*>(marker) + DatafileHelper::AlignedSize<size_t>(size);
if (e + 16 < end) {
// add some extra bytes for following data
e += 16;
}
std::string line;
std::string raw;
size_t printed = 0;
while (p < e) {
// print offset
line.append("0x");
static const uint64_t Bits[] = { 56, 48, 40, 32, 24, 16, 8, 0 };
uint64_t offset = static_cast<uint64_t>(static_cast<uintptr_t>(p - _data));
for (uint64_t i = 0; i < 8; ++i) {
uint8_t c = static_cast<uint8_t>((static_cast<uint64_t>(offset) >> Bits[i]) & 0xFFULL);
uint8_t n1 = c >> 4;
uint8_t n2 = c & 0x0F;
line.push_back((n1 < 10) ? ('0' + n1) : 'A' + n1 - 10);
line.push_back((n2 < 10) ? ('0' + n2) : 'A' + n2 - 10);
}
// print data
line.append(": ");
for (size_t i = 0; i < 16; ++i) {
if (i == 8) {
// separate groups of 8 bytes
line.push_back(' ');
raw.push_back(' ');
}
if (p >= e) {
line.append(" ");
} else {
uint8_t c = static_cast<uint8_t>(*p++);
uint8_t n1 = c >> 4;
uint8_t n2 = c & 0x0F;
line.push_back((n1 < 10) ? ('0' + n1) : 'A' + n1 - 10);
line.push_back((n2 < 10) ? ('0' + n2) : 'A' + n2 - 10);
line.push_back(' ');
raw.push_back((c < 32 || c >= 127) ? '.' : static_cast<unsigned char>(c));
++printed;
}
}
LOG(INFO) << line << " " << raw;
line.clear();
raw.clear();
if (printed >= 2048) {
LOG(INFO) << "(output truncated due to excessive length)";
break;
}
}
if (lastGood != nullptr) {
LOG(INFO) << "last good marker found at: " << hexValue(static_cast<uint64_t>(static_cast<uintptr_t>(lastGood - _data)));
}
printMarker(marker, size, _data, end);
if (nextMarkerOk) {
LOG(INFO) << "data directly following this marker looks ok so repairing the marker may recover it";
@ -1443,6 +1408,7 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
return true;
}
lastGood = ptr;
ptr += alignedSize;
}
@ -1450,6 +1416,62 @@ bool TRI_datafile_t::check(bool ignoreFailures) {
return true;
}
void TRI_datafile_t::printMarker(TRI_df_marker_t const* marker, TRI_voc_size_t size, char const* begin, char const* end) const {
LOG(INFO) << "raw marker data following:";
LOG(INFO) << "type: " << TRI_NameMarkerDatafile(marker) << ", size: " << marker->getSize() << ", crc: " << marker->getCrc();
LOG(INFO) << "(expected layout: size (4 bytes), crc (4 bytes), type and tick (8 bytes), payload following)";
char const* p = reinterpret_cast<char const*>(marker);
char const* e = reinterpret_cast<char const*>(marker) + DatafileHelper::AlignedSize<size_t>(size);
if (e + 16 < end) {
// add some extra bytes for following data
e += 16;
}
std::string line;
std::string raw;
size_t printed = 0;
while (p < e) {
// print offset
line.append(hexValue(static_cast<uint64_t>(static_cast<uintptr_t>(p - begin))));
// print data
line.append(": ");
for (size_t i = 0; i < 16; ++i) {
if (i == 8) {
// separate groups of 8 bytes
line.push_back(' ');
raw.push_back(' ');
}
if (p >= e) {
line.append(" ");
} else {
uint8_t c = static_cast<uint8_t>(*p++);
uint8_t n1 = c >> 4;
uint8_t n2 = c & 0x0F;
line.push_back((n1 < 10) ? ('0' + n1) : 'A' + n1 - 10);
line.push_back((n2 < 10) ? ('0' + n2) : 'A' + n2 - 10);
line.push_back(' ');
raw.push_back((c < 32 || c >= 127) ? '.' : static_cast<unsigned char>(c));
++printed;
}
}
LOG(INFO) << line << " " << raw;
line.clear();
raw.clear();
if (printed >= 2048) {
LOG(INFO) << "(output truncated due to excessive length)";
break;
}
}
}
/// @brief fixes a corrupted datafile
bool TRI_datafile_t::fix(TRI_voc_size_t currentSize) {
LOG(WARN) << "datafile '" << getName() << "' is corrupted at position " << currentSize;

View File

@ -263,6 +263,8 @@ struct TRI_datafile_t {
/// @brief tries to repair a datafile
bool tryRepair();
void printMarker(TRI_df_marker_t const* marker, TRI_voc_size_t size, char const* begin, char const* end) const;
private:
std::string _filename; // underlying filename
TRI_voc_fid_t const _fid; // datafile identifier

View File

@ -56,7 +56,7 @@
if (UNIX)
find_package(PkgConfig QUIET)
pkg_check_modules(_OPENSSL QUIET openssl)
pkg_check_modules(_OPENSSL openssl)
endif ()
# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
@ -355,7 +355,6 @@ if(WIN32 AND NOT CYGWIN)
set(OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
endif()
else()
find_library(OPENSSL_SSL_LIBRARY
NAMES
ssl

View File

@ -32,14 +32,9 @@ set(CPACK_RPM_PACKAGE_RELOCATABLE FALSE)
set(CPACK_TEMPORARY_DIRECTORY "${PROJECT_BINARY_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/RPM/RPMS/${ARANGODB_PACKAGE_ARCHITECTURE}")
set(CPACK_TEMPORARY_PACKAGE_FILE_NAME "${CPACK_TEMPORARY_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}.rpm")
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
add_custom_target(package-arongodb-server
COMMAND ${CMAKE_COMMAND} .
COMMAND ${CMAKE_CPACK_COMMAND} -V -G RPM
COMMAND ${CMAKE_CPACK_COMMAND} -G RPM
COMMAND cp "${CPACK_TEMPORARY_DIRECTORY}/${CPACK_CLIENT_PACKAGE_FILE_NAME}.rpm" "${PROJECT_BINARY_DIR}"
WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
list(APPEND PACKAGES_LIST package-arongodb-server)