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@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
TRI_BITS = @TRI_BITS@
|
||||
V8_CPPFLAGS = @V8_CPPFLAGS@
|
||||
V8_LDFLAGS = @V8_LDFLAGS@
|
||||
V8_LIBS = @V8_LIBS@
|
||||
|
|
|
@ -78,8 +78,14 @@ static bool CreateJournal (TRI_blob_collection_t* collection) {
|
|||
|
||||
// check that a journal was created
|
||||
if (journal == NULL) {
|
||||
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
||||
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
||||
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._state = TRI_COL_STATE_WRITE_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);
|
||||
|
||||
if (data == MAP_FAILED) {
|
||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||
if (errno == ENOMEM) {
|
||||
TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||
}
|
||||
else {
|
||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
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);
|
||||
|
||||
if (data == MAP_FAILED) {
|
||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||
if (errno == ENOMEM) {
|
||||
TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY_MMAP);
|
||||
}
|
||||
else {
|
||||
TRI_set_errno(TRI_ERROR_SYS_ERROR);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
// 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
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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_datafile_t* journal;
|
||||
TRI_df_marker_t* position;
|
||||
|
@ -224,33 +224,16 @@ static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collect
|
|||
|
||||
// construct a suitable filename
|
||||
number = TRI_StringUInt32(TRI_NewTickVocBase());
|
||||
if (number == NULL) {
|
||||
LOG_ERROR("out of memory when creating journal number");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (compactor) {
|
||||
jname = TRI_Concatenate3String("journal-", number, ".db");
|
||||
/* TODO FIXME: memory allocation might fail */
|
||||
}
|
||||
else {
|
||||
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);
|
||||
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(jname);
|
||||
|
||||
|
@ -258,8 +241,14 @@ static TRI_datafile_t* CreateJournalDocCollection (TRI_doc_collection_t* collect
|
|||
journal = TRI_CreateDatafile(filename, collection->base._maximalSize);
|
||||
|
||||
if (journal == NULL) {
|
||||
collection->base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
||||
collection->base._state = TRI_COL_STATE_WRITE_ERROR;
|
||||
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._state = TRI_COL_STATE_WRITE_ERROR;
|
||||
}
|
||||
|
||||
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);
|
||||
/* TODO FIXME: memory allocation might fail */
|
||||
|
||||
TRI_FreeString(number);
|
||||
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) {
|
||||
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) {
|
||||
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);
|
||||
|
||||
while (true) {
|
||||
while (sim->base.base._state == TRI_COL_STATE_WRITE) {
|
||||
n = sim->base.base._journals._length;
|
||||
|
||||
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);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -323,12 +324,6 @@ static TRI_doc_mptr_t CreateDocument (TRI_sim_collection_t* sim,
|
|||
|
||||
// get a new header pointer
|
||||
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
|
||||
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);
|
||||
|
||||
if (journal == NULL) {
|
||||
sim->base.base._lastError = TRI_set_errno(TRI_ERROR_AVOCADO_NO_JOURNAL);
|
||||
|
||||
if (release) {
|
||||
sim->base.endWrite(&sim->base);
|
||||
}
|
||||
|
|
|
@ -142,6 +142,10 @@ static bool CheckJournalSimCollection (TRI_sim_collection_t* sim) {
|
|||
worked = false;
|
||||
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,
|
||||
// therefore no locking is required to access the _journals
|
||||
|
|
|
@ -668,6 +668,7 @@ ENABLE_LOGGER_TIMING_FALSE
|
|||
ENABLE_LOGGER_TIMING_TRUE
|
||||
ENABLE_LOGGER_FALSE
|
||||
ENABLE_LOGGER_TRUE
|
||||
TRI_BITS
|
||||
ENABLE_FORCE_32BIT_FALSE
|
||||
ENABLE_FORCE_32BIT_TRUE
|
||||
ENABLE_32BIT_FALSE
|
||||
|
@ -5682,6 +5683,9 @@ else
|
|||
fi
|
||||
|
||||
|
||||
TRI_BITS="$tr_BITS"
|
||||
|
||||
|
||||
|
||||
if test "x$tr_32BIT" = xyes; then
|
||||
BASIC_INFO="$BASIC_INFO|32bit: enabled"
|
||||
|
|
Loading…
Reference in New Issue