mirror of https://gitee.com/bigwinds/arangodb
added support for OOM errors
This commit is contained in:
parent
88d84bcbf7
commit
7435a80778
|
@ -203,6 +203,7 @@ READLINE_LIBS = @READLINE_LIBS@
|
||||||
SET_MAKE = @SET_MAKE@
|
SET_MAKE = @SET_MAKE@
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
TRI_BITS = @TRI_BITS@
|
||||||
V8_CPPFLAGS = @V8_CPPFLAGS@
|
V8_CPPFLAGS = @V8_CPPFLAGS@
|
||||||
V8_LDFLAGS = @V8_LDFLAGS@
|
V8_LDFLAGS = @V8_LDFLAGS@
|
||||||
V8_LIBS = @V8_LIBS@
|
V8_LIBS = @V8_LIBS@
|
||||||
|
|
|
@ -78,8 +78,14 @@ static bool CreateJournal (TRI_blob_collection_t* collection) {
|
||||||
|
|
||||||
// check that a journal was created
|
// check that a journal was created
|
||||||
if (journal == NULL) {
|
if (journal == NULL) {
|
||||||
|
if (TRI_errno() == TRI_ERROR_OUT_OF_MEMORY_MMAP) {
|
||||||
|
collection->base._lastError = TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||||
|
collection->base._state = TRI_COL_STATE_READ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
||||||
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_ERROR("cannot create new journal '%s': %s", filename, TRI_last_error());
|
LOG_ERROR("cannot create new journal '%s': %s", filename, TRI_last_error());
|
||||||
|
|
||||||
|
|
|
@ -293,7 +293,13 @@ static TRI_datafile_t* OpenDatafile (char const* filename, bool ignoreErrors) {
|
||||||
data = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
data = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||||
|
|
||||||
if (data == MAP_FAILED) {
|
if (data == MAP_FAILED) {
|
||||||
|
if (errno == ENOMEM) {
|
||||||
|
TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||||
|
}
|
||||||
|
else {
|
||||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
LOG_ERROR("cannot memory map file '%s': '%s'", filename, TRI_last_error());
|
LOG_ERROR("cannot memory map file '%s': '%s'", filename, TRI_last_error());
|
||||||
|
@ -400,7 +406,13 @@ TRI_datafile_t* TRI_CreateDatafile (char const* filename, TRI_voc_size_t maximal
|
||||||
data = mmap(0, maximalSize, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
|
data = mmap(0, maximalSize, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
|
||||||
|
|
||||||
if (data == MAP_FAILED) {
|
if (data == MAP_FAILED) {
|
||||||
|
if (errno == ENOMEM) {
|
||||||
|
TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||||
|
}
|
||||||
|
else {
|
||||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
// remove empty file
|
// remove empty file
|
||||||
|
|
|
@ -212,7 +212,7 @@ static bool IsEqualKeyElementDatafile (TRI_associative_pointer_t* array, void co
|
||||||
/// @brief creates a journal or a compactor journal
|
/// @brief creates a journal or a compactor journal
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collection, bool compactor) {
|
static TRI_datafile_t* CreateJournal (TRI_doc_collection_t* collection, bool compactor) {
|
||||||
TRI_col_header_marker_t cm;
|
TRI_col_header_marker_t cm;
|
||||||
TRI_datafile_t* journal;
|
TRI_datafile_t* journal;
|
||||||
TRI_df_marker_t* position;
|
TRI_df_marker_t* position;
|
||||||
|
@ -224,33 +224,16 @@ static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collect
|
||||||
|
|
||||||
// construct a suitable filename
|
// construct a suitable filename
|
||||||
number = TRI_StringUInt32(TRI_NewTickVocBase());
|
number = TRI_StringUInt32(TRI_NewTickVocBase());
|
||||||
if (number == NULL) {
|
|
||||||
LOG_ERROR("out of memory when creating journal number");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (compactor) {
|
if (compactor) {
|
||||||
jname = TRI_Concatenate3String("journal-", number, ".db");
|
jname = TRI_Concatenate3String("journal-", number, ".db");
|
||||||
/* TODO FIXME: memory allocation might fail */
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
jname = TRI_Concatenate3String("compactor-", number, ".db");
|
jname = TRI_Concatenate3String("compactor-", number, ".db");
|
||||||
/* TODO FIXME: memory allocation might fail */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jname == NULL) {
|
|
||||||
TRI_FreeString(number);
|
|
||||||
LOG_ERROR("out of memory when creating journal name");
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = TRI_Concatenate2File(collection->base._directory, jname);
|
filename = TRI_Concatenate2File(collection->base._directory, jname);
|
||||||
if (filename == NULL) {
|
|
||||||
TRI_FreeString(number);
|
|
||||||
TRI_FreeString(jname);
|
|
||||||
LOG_ERROR("out of memory when creating journal filename");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
TRI_FreeString(number);
|
TRI_FreeString(number);
|
||||||
TRI_FreeString(jname);
|
TRI_FreeString(jname);
|
||||||
|
|
||||||
|
@ -258,8 +241,14 @@ static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collect
|
||||||
journal = TRI_CreateDatafile(filename, collection->base._maximalSize);
|
journal = TRI_CreateDatafile(filename, collection->base._maximalSize);
|
||||||
|
|
||||||
if (journal == NULL) {
|
if (journal == NULL) {
|
||||||
|
if (TRI_errno() == TRI_ERROR_OUT_OF_MEMORY_MMAP) {
|
||||||
|
collection->base._lastError = TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||||
|
collection->base._state = TRI_COL_STATE_READ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
||||||
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_ERROR("cannot create new journal in '%s'", filename);
|
LOG_ERROR("cannot create new journal in '%s'", filename);
|
||||||
|
|
||||||
|
@ -281,7 +270,7 @@ static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collect
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = TRI_Concatenate2File(collection->base._directory, jname);
|
filename = TRI_Concatenate2File(collection->base._directory, jname);
|
||||||
/* TODO FIXME: memory allocation might fail */
|
|
||||||
TRI_FreeString(number);
|
TRI_FreeString(number);
|
||||||
TRI_FreeString(jname);
|
TRI_FreeString(jname);
|
||||||
|
|
||||||
|
@ -539,7 +528,7 @@ TRI_doc_datafile_info_t* TRI_FindDatafileInfoDocCollection (TRI_doc_collection_t
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TRI_datafile_t* TRI_CreateJournalDocCollection (TRI_doc_collection_t* collection) {
|
TRI_datafile_t* TRI_CreateJournalDocCollection (TRI_doc_collection_t* collection) {
|
||||||
return CreateJournalDocCollection(collection, false);
|
return CreateJournal(collection, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -561,7 +550,7 @@ bool TRI_CloseJournalDocCollection (TRI_doc_collection_t* collection,
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TRI_datafile_t* TRI_CreateCompactorDocCollection (TRI_doc_collection_t* collection) {
|
TRI_datafile_t* TRI_CreateCompactorDocCollection (TRI_doc_collection_t* collection) {
|
||||||
return CreateJournalDocCollection(collection, true);
|
return CreateJournal(collection, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -145,7 +145,7 @@ static TRI_datafile_t* SelectJournal (TRI_sim_collection_t* sim,
|
||||||
|
|
||||||
TRI_LOCK_JOURNAL_ENTRIES_SIM_COLLECTION(sim);
|
TRI_LOCK_JOURNAL_ENTRIES_SIM_COLLECTION(sim);
|
||||||
|
|
||||||
while (true) {
|
while (sim->base.base._state == TRI_COL_STATE_WRITE) {
|
||||||
n = sim->base.base._journals._length;
|
n = sim->base.base._journals._length;
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i) {
|
||||||
|
@ -171,6 +171,7 @@ static TRI_datafile_t* SelectJournal (TRI_sim_collection_t* sim,
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_UNLOCK_JOURNAL_ENTRIES_SIM_COLLECTION(sim);
|
TRI_UNLOCK_JOURNAL_ENTRIES_SIM_COLLECTION(sim);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -323,12 +324,6 @@ static TRI_doc_mptr_t CreateDocument (TRI_sim_collection_t* sim,
|
||||||
|
|
||||||
// get a new header pointer
|
// get a new header pointer
|
||||||
header = sim->_headers->request(sim->_headers);
|
header = sim->_headers->request(sim->_headers);
|
||||||
if (!header) {
|
|
||||||
TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY);
|
|
||||||
LOG_ERROR("out of memory");
|
|
||||||
mptr._did = 0;
|
|
||||||
return mptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate a new tick
|
// generate a new tick
|
||||||
marker->_rid = marker->_did = marker->base._tick = TRI_NewTickVocBase();
|
marker->_rid = marker->_did = marker->base._tick = TRI_NewTickVocBase();
|
||||||
|
@ -338,8 +333,6 @@ static TRI_doc_mptr_t CreateDocument (TRI_sim_collection_t* sim,
|
||||||
journal = SelectJournal(sim, total, result);
|
journal = SelectJournal(sim, total, result);
|
||||||
|
|
||||||
if (journal == NULL) {
|
if (journal == NULL) {
|
||||||
sim->base.base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
|
||||||
|
|
||||||
if (release) {
|
if (release) {
|
||||||
sim->base.endWrite(&sim->base);
|
sim->base.endWrite(&sim->base);
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,6 +142,10 @@ static bool CheckJournalSimCollection (TRI_sim_collection_t* sim) {
|
||||||
worked = false;
|
worked = false;
|
||||||
base = &sim->base.base;
|
base = &sim->base.base;
|
||||||
|
|
||||||
|
if (sim->base.base._state != TRI_COL_STATE_WRITE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// .............................................................................
|
// .............................................................................
|
||||||
// the only thread MODIFYING the _journals variable is this thread,
|
// the only thread MODIFYING the _journals variable is this thread,
|
||||||
// therefore no locking is required to access the _journals
|
// therefore no locking is required to access the _journals
|
||||||
|
|
|
@ -668,6 +668,7 @@ ENABLE_LOGGER_TIMING_FALSE
|
||||||
ENABLE_LOGGER_TIMING_TRUE
|
ENABLE_LOGGER_TIMING_TRUE
|
||||||
ENABLE_LOGGER_FALSE
|
ENABLE_LOGGER_FALSE
|
||||||
ENABLE_LOGGER_TRUE
|
ENABLE_LOGGER_TRUE
|
||||||
|
TRI_BITS
|
||||||
ENABLE_FORCE_32BIT_FALSE
|
ENABLE_FORCE_32BIT_FALSE
|
||||||
ENABLE_FORCE_32BIT_TRUE
|
ENABLE_FORCE_32BIT_TRUE
|
||||||
ENABLE_32BIT_FALSE
|
ENABLE_32BIT_FALSE
|
||||||
|
@ -5682,6 +5683,9 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
TRI_BITS="$tr_BITS"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if test "x$tr_32BIT" = xyes; then
|
if test "x$tr_32BIT" = xyes; then
|
||||||
BASIC_INFO="$BASIC_INFO|32bit: enabled"
|
BASIC_INFO="$BASIC_INFO|32bit: enabled"
|
||||||
|
|
Loading…
Reference in New Issue