1
0
Fork 0

added support for OOM errors

This commit is contained in:
Frank Celler 2012-04-24 16:16:31 +02:00
parent 88d84bcbf7
commit 7435a80778
7 changed files with 46 additions and 37 deletions

View File

@ -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@

View File

@ -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());

View File

@ -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

View 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);
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -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);
}

View File

@ -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

4
configure vendored
View File

@ -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"