From 7c4b13f19dfc1bd00d143821738a456066c370db Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Mon, 17 Sep 2012 09:05:13 +0200 Subject: [PATCH 1/6] slightly simplified locking --- arangod/VocBase/document-collection.c | 77 ++++++++++++--------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/arangod/VocBase/document-collection.c b/arangod/VocBase/document-collection.c index fd37f18104..f4e1da709e 100644 --- a/arangod/VocBase/document-collection.c +++ b/arangod/VocBase/document-collection.c @@ -3371,17 +3371,16 @@ TRI_index_t* TRI_EnsureCapConstraintDocumentCollection (TRI_document_collection_ TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); idx = CreateCapConstraintDocumentCollection(sim, size, 0, created); - - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -3737,17 +3736,16 @@ TRI_index_t* TRI_EnsureGeoIndex1DocumentCollection (TRI_document_collection_t* s TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); idx = CreateGeoIndexDocumentCollection(sim, location, NULL, NULL, geoJson, constraint, ignoreNull, 0, created); - - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -3779,17 +3777,16 @@ TRI_index_t* TRI_EnsureGeoIndex2DocumentCollection (TRI_document_collection_t* s TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); idx = CreateGeoIndexDocumentCollection(sim, NULL, latitude, longitude, false, constraint, ignoreNull, 0, created); - - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -3987,16 +3984,15 @@ TRI_index_t* TRI_EnsureHashIndexDocumentCollection (TRI_document_collection_t* s // given the list of attributes (as strings) idx = CreateHashIndexDocumentCollection(sim, attributes, 0, unique, created); - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - + // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -4189,16 +4185,15 @@ TRI_index_t* TRI_EnsureSkiplistIndexDocumentCollection (TRI_document_collection_ idx = CreateSkiplistIndexDocumentCollection(sim, attributes, 0, unique, created); - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - + // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -4439,16 +4434,15 @@ TRI_index_t* TRI_EnsurePriorityQueueIndexDocumentCollection(TRI_document_collect // Given the list of attributes (as strings) idx = CreatePriorityQueueIndexDocumentCollection(sim, attributes, 0, unique, created); - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - + // ............................................................................. // outside write-lock // ............................................................................. + + if (idx == NULL) { + return NULL; + } if (created) { res = TRI_SaveIndex(&sim->base, idx); @@ -4686,17 +4680,16 @@ TRI_index_t* TRI_EnsureBitarrayIndexDocumentCollection (TRI_document_collection_ idx = CreateBitarrayIndexDocumentCollection(sim, attributes, values, 0, supportUndef, created); - if (idx == NULL) { - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - return NULL; - } - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - + // ............................................................................. // outside write-lock // ............................................................................. + if (idx == NULL) { + return NULL; + } + if (created) { res = TRI_SaveIndex(&sim->base, idx); From 1ef037ce8ce8884239eeff476634886adcb4468b Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Mon, 17 Sep 2012 09:54:12 +0200 Subject: [PATCH 2/6] renamed indexes to secondaryIndexes --- arangod/Ahuacatl/ahuacatl-optimiser.c | 2 +- arangod/VocBase/document-collection.c | 67 ++++++++++++--------------- arangod/VocBase/document-collection.h | 5 +- arangod/VocBase/index.c | 8 ++-- 4 files changed, 38 insertions(+), 44 deletions(-) diff --git a/arangod/Ahuacatl/ahuacatl-optimiser.c b/arangod/Ahuacatl/ahuacatl-optimiser.c index c6c32aef61..aa52550d6f 100755 --- a/arangod/Ahuacatl/ahuacatl-optimiser.c +++ b/arangod/Ahuacatl/ahuacatl-optimiser.c @@ -109,7 +109,7 @@ static void AttachCollectionHint (TRI_aql_context_t* const context, hint->_collection = collection; - availableIndexes = &(((TRI_document_collection_t*) collection->_collection->_collection)->_indexes); + availableIndexes = &(((TRI_document_collection_t*) collection->_collection->_collection)->_secondaryIndexes); if (availableIndexes == NULL) { TRI_SetErrorContextAql(context, TRI_ERROR_OUT_OF_MEMORY, NULL); diff --git a/arangod/VocBase/document-collection.c b/arangod/VocBase/document-collection.c index f4e1da709e..818b1b54ee 100644 --- a/arangod/VocBase/document-collection.c +++ b/arangod/VocBase/document-collection.c @@ -1716,7 +1716,7 @@ static bool InitDocumentCollection (TRI_document_collection_t* collection, TRI_InitCondition(&collection->_journalsCondition); - TRI_InitVectorPointer(&collection->_indexes, TRI_UNKNOWN_MEM_ZONE); + TRI_InitVectorPointer(&collection->_secondaryIndexes, TRI_UNKNOWN_MEM_ZONE); TRI_InitVectorString(&primary->_fields, TRI_UNKNOWN_MEM_ZONE); TRI_PushBackVectorString(&primary->_fields, id); @@ -1730,7 +1730,7 @@ static bool InitDocumentCollection (TRI_document_collection_t* collection, primary->update = UpdatePrimary; primary->json = JsonPrimary; - TRI_PushBackVectorPointer(&collection->_indexes, primary); + TRI_PushBackVectorPointer(&collection->_secondaryIndexes, primary); // setup methods collection->base.createHeader = CreateHeader; @@ -1866,14 +1866,14 @@ void TRI_DestroyDocumentCollection (TRI_document_collection_t* collection) { TRI_DestroyReadWriteLock(&collection->_lock); // free memory allocated for index field names - n = collection->_indexes._length; + n = collection->_secondaryIndexes._length; for (i = 0 ; i < n ; ++i) { - TRI_index_t* idx = (TRI_index_t*) collection->_indexes._buffer[i]; + TRI_index_t* idx = (TRI_index_t*) collection->_secondaryIndexes._buffer[i]; TRI_FreeIndex(idx); } // free index vector - TRI_DestroyVectorPointer(&collection->_indexes); + TRI_DestroyVectorPointer(&collection->_secondaryIndexes); TRI_DestroyPrimaryCollection(&collection->base); } @@ -2294,7 +2294,7 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, // update all the other indices // ............................................................................. - n = sim->_indexes._length; + n = sim->_secondaryIndexes._length; result = TRI_ERROR_NO_ERROR; constraint = false; @@ -2302,7 +2302,7 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, TRI_index_t* idx; int res; - idx = sim->_indexes._buffer[i]; + idx = sim->_secondaryIndexes._buffer[i]; res = idx->insert(idx, header); // in case of no-memory, return immediately @@ -2366,7 +2366,7 @@ static int UpdateImmediateIndexes (TRI_document_collection_t* collection, // update all the other indices // ............................................................................. - n = collection->_indexes._length; + n = collection->_secondaryIndexes._length; result = TRI_ERROR_NO_ERROR; constraint = false; @@ -2374,7 +2374,7 @@ static int UpdateImmediateIndexes (TRI_document_collection_t* collection, TRI_index_t* idx; int res; - idx = collection->_indexes._buffer[i]; + idx = collection->_secondaryIndexes._buffer[i]; res = idx->update(idx, header, &old); // in case of no-memory, return immediately @@ -2490,14 +2490,14 @@ static int DeleteImmediateIndexes (TRI_document_collection_t* collection, // remove from all other indexes // ............................................................................. - n = collection->_indexes._length; + n = collection->_secondaryIndexes._length; result = TRI_ERROR_NO_ERROR; for (i = 0; i < n; ++i) { TRI_index_t* idx; int res; - idx = collection->_indexes._buffer[i]; + idx = collection->_secondaryIndexes._buffer[i]; res = idx->remove(idx, header); if (res != TRI_ERROR_NO_ERROR) { @@ -2585,8 +2585,8 @@ static TRI_index_t* LookupPathIndexDocumentCollection (TRI_document_collection_t // go through every index and see if we have a match // ........................................................................... - for (j = 0; j < collection->_indexes._length; ++j) { - TRI_index_t* idx = collection->_indexes._buffer[j]; + for (j = 0; j < collection->_secondaryIndexes._length; ++j) { + TRI_index_t* idx = collection->_secondaryIndexes._buffer[j]; bool found = true; // ......................................................................... @@ -2934,13 +2934,13 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); } - n = sim->_indexes._length; + n = sim->_secondaryIndexes._length; for (i = 0; i < n; ++i) { TRI_index_t* idx; TRI_json_t* json; - idx = sim->_indexes._buffer[i]; + idx = sim->_secondaryIndexes._buffer[i]; json = idx->json(idx, &sim->base); @@ -2982,15 +2982,15 @@ bool TRI_DropIndexDocumentCollection (TRI_document_collection_t* sim, TRI_idx_ii TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - n = sim->_indexes._length; + n = sim->_secondaryIndexes._length; for (i = 0; i < n; ++i) { TRI_index_t* idx; - idx = sim->_indexes._buffer[i]; + idx = sim->_secondaryIndexes._buffer[i]; if (idx->_iid == iid) { - found = TRI_RemoveVectorPointer(&sim->_indexes, i); + found = TRI_RemoveVectorPointer(&sim->_secondaryIndexes, i); if (found != NULL) { found->removeIndex(found, &sim->base); @@ -3301,7 +3301,7 @@ static TRI_index_t* CreateCapConstraintDocumentCollection (TRI_document_collecti } // and store index - TRI_PushBackVectorPointer(&sim->_indexes, idx); + TRI_PushBackVectorPointer(&sim->_secondaryIndexes, idx); sim->base._capConstraint = (TRI_cap_constraint_t*) idx; if (created != NULL) { @@ -3516,7 +3516,7 @@ static TRI_index_t* CreateGeoIndexDocumentCollection (TRI_document_collection_t* } // and store index - TRI_PushBackVectorPointer(&sim->_indexes, idx); + TRI_PushBackVectorPointer(&sim->_secondaryIndexes, idx); if (created != NULL) { *created = true; @@ -3662,12 +3662,12 @@ TRI_index_t* TRI_LookupGeoIndex1DocumentCollection (TRI_document_collection_t* c size_t n; size_t i; - n = collection->_indexes._length; + n = collection->_secondaryIndexes._length; for (i = 0; i < n; ++i) { TRI_index_t* idx; - idx = collection->_indexes._buffer[i]; + idx = collection->_secondaryIndexes._buffer[i]; if (idx->_type == TRI_IDX_TYPE_GEO1_INDEX) { TRI_geo_index_t* geo = (TRI_geo_index_t*) idx; @@ -3695,12 +3695,12 @@ TRI_index_t* TRI_LookupGeoIndex2DocumentCollection (TRI_document_collection_t* c size_t n; size_t i; - n = collection->_indexes._length; + n = collection->_secondaryIndexes._length; for (i = 0; i < n; ++i) { TRI_index_t* idx; - idx = collection->_indexes._buffer[i]; + idx = collection->_secondaryIndexes._buffer[i]; if (idx->_type == TRI_IDX_TYPE_GEO2_INDEX) { TRI_geo_index_t* geo = (TRI_geo_index_t*) idx; @@ -3888,7 +3888,7 @@ static TRI_index_t* CreateHashIndexDocumentCollection (TRI_document_collection_t } // store index and return - TRI_PushBackVectorPointer(&collection->_indexes, idx); + TRI_PushBackVectorPointer(&collection->_secondaryIndexes, idx); if (created != NULL) { *created = true; @@ -4090,7 +4090,7 @@ static TRI_index_t* CreateSkiplistIndexDocumentCollection (TRI_document_collecti } // store index and return - TRI_PushBackVectorPointer(&collection->_indexes, idx); + TRI_PushBackVectorPointer(&collection->_secondaryIndexes, idx); if (created != NULL) { *created = true; @@ -4310,7 +4310,7 @@ static TRI_index_t* CreatePriorityQueueIndexDocumentCollection (TRI_document_col // store index // ........................................................................... - TRI_PushBackVectorPointer(&collection->_indexes, idx); + TRI_PushBackVectorPointer(&collection->_secondaryIndexes, idx); // ........................................................................... // release memory allocated to vector @@ -4357,19 +4357,12 @@ TRI_index_t* TRI_LookupPriorityQueueIndexDocumentCollection (TRI_document_collec TRI_index_t* matchedIndex = NULL; size_t j, k; - // ........................................................................... - // Note: This function does NOT differentiate between non-unique and unique - // skiplist indexes. The first index which matches the attributes - // (paths parameter) will be returned. - // ........................................................................... - - // ........................................................................... // go through every index and see if we have a match // ........................................................................... - for (j = 0; j < collection->_indexes._length; ++j) { - TRI_index_t* idx = collection->_indexes._buffer[j]; + for (j = 0; j < collection->_secondaryIndexes._length; ++j) { + TRI_index_t* idx = collection->_secondaryIndexes._buffer[j]; TRI_priorityqueue_index_t* pqIndex = (TRI_priorityqueue_index_t*) idx; bool found = true; @@ -4574,7 +4567,7 @@ static TRI_index_t* CreateBitarrayIndexDocumentCollection (TRI_document_collecti // store index within the collection and return // ........................................................................... - TRI_PushBackVectorPointer(&collection->_indexes, idx); + TRI_PushBackVectorPointer(&collection->_secondaryIndexes, idx); if (created != NULL) { *created = true; diff --git a/arangod/VocBase/document-collection.h b/arangod/VocBase/document-collection.h index 621bb4d49f..db175bd16a 100644 --- a/arangod/VocBase/document-collection.h +++ b/arangod/VocBase/document-collection.h @@ -220,11 +220,12 @@ typedef struct TRI_document_collection_s { // ............................................................................. TRI_read_write_lock_t _lock; - + TRI_headers_t* _headers; TRI_associative_pointer_t _primaryIndex; + + TRI_vector_pointer_t _secondaryIndexes; TRI_multi_pointer_t _edgesIndex; - TRI_vector_pointer_t _indexes; // ............................................................................. // this condition variable protects the _journalsCondition diff --git a/arangod/VocBase/index.c b/arangod/VocBase/index.c index 512fcb0dba..63573640aa 100755 --- a/arangod/VocBase/index.c +++ b/arangod/VocBase/index.c @@ -193,7 +193,7 @@ int TRI_SaveIndex (TRI_primary_collection_t* collection, TRI_index_t* idx) { //////////////////////////////////////////////////////////////////////////////// TRI_index_t* TRI_LookupIndex (TRI_primary_collection_t* collection, TRI_idx_iid_t iid) { - TRI_document_collection_t* sim; + TRI_document_collection_t* doc; TRI_index_t* idx; size_t i; @@ -202,10 +202,10 @@ TRI_index_t* TRI_LookupIndex (TRI_primary_collection_t* collection, TRI_idx_iid_ return NULL; } - sim = (TRI_document_collection_t*) collection; + doc = (TRI_document_collection_t*) collection; - for (i = 0; i < sim->_indexes._length; ++i) { - idx = sim->_indexes._buffer[i]; + for (i = 0; i < doc->_secondaryIndexes._length; ++i) { + idx = doc->_secondaryIndexes._buffer[i]; if (idx->_iid == iid) { return idx; From 76674bad52fe65435c2569774350b4ece2632160 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Mon, 17 Sep 2012 11:43:48 +0200 Subject: [PATCH 3/6] moved primaryIndex and lock from document-collection to primary-collection --- arangod/RestHandler/RestDocumentHandler.cpp | 8 +- arangod/V8Server/v8-query.cpp | 7 +- arangod/V8Server/v8-vocbase.cpp | 8 +- arangod/VocBase/auth.c | 7 +- arangod/VocBase/compactor.c | 66 ++-- arangod/VocBase/document-collection.c | 326 ++++++++++---------- arangod/VocBase/document-collection.h | 47 +-- arangod/VocBase/primary-collection.c | 46 ++- arangod/VocBase/primary-collection.h | 56 +++- arangod/VocBase/synchroniser.c | 2 +- 10 files changed, 315 insertions(+), 258 deletions(-) diff --git a/arangod/RestHandler/RestDocumentHandler.cpp b/arangod/RestHandler/RestDocumentHandler.cpp index 99a43926ef..750782cc6f 100644 --- a/arangod/RestHandler/RestDocumentHandler.cpp +++ b/arangod/RestHandler/RestDocumentHandler.cpp @@ -517,11 +517,11 @@ bool RestDocumentHandler::readAllDocuments () { ReadTransaction trx(&ca); - const TRI_document_collection_t* sim = (TRI_document_collection_t*) trx.primary(); + const TRI_primary_collection_t* primary = trx.primary(); - if (0 < sim->_primaryIndex._nrUsed) { - void** ptr = sim->_primaryIndex._table; - void** end = sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc; + if (0 < primary->_primaryIndex._nrUsed) { + void** ptr = primary->_primaryIndex._table; + void** end = ptr + primary->_primaryIndex._nrAlloc; for (; ptr < end; ++ptr) { if (*ptr) { diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index b93295ff49..8e79c8ac3f 100755 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -1648,6 +1648,7 @@ static v8::Handle AllQuery (TRI_document_collection_t* sim, // extract skip and limit TRI_voc_ssize_t skip; TRI_voc_size_t limit; + TRI_primary_collection_t* primary = &sim->base; ExtractSkipAndLimit(argv, 0, skip, limit); @@ -1657,15 +1658,15 @@ static v8::Handle AllQuery (TRI_document_collection_t* sim, v8::Handle documents = v8::Array::New(); result->Set(v8::String::New("documents"), documents); - size_t total = sim->_primaryIndex._nrUsed; + size_t total = primary->_primaryIndex._nrUsed; uint32_t count = 0; bool error = false; if (0 < total && 0 < limit) { TRI_barrier_t* barrier = 0; - void** beg = sim->_primaryIndex._table; - void** end = sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc; + void** beg = primary->_primaryIndex._table; + void** end = beg + primary->_primaryIndex._nrAlloc; void** ptr = beg; // skip from the beginning diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index c2f0c30f89..3f84d22c52 100755 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -4121,14 +4121,14 @@ static v8::Handle JS_TruncateVocbaseCol (v8::Arguments const& argv) { TRI_vector_pointer_t documents; TRI_InitVectorPointer(&documents, TRI_UNKNOWN_MEM_ZONE); - - primary->beginWrite(collection->_collection); TRI_doc_mptr_t const** ptr; TRI_doc_mptr_t const** end; - ptr = (TRI_doc_mptr_t const**) (sim->_primaryIndex._table); - end = (TRI_doc_mptr_t const**) (sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc); + primary->beginWrite(collection->_collection); + + ptr = (TRI_doc_mptr_t const**) (primary->_primaryIndex._table); + end = (TRI_doc_mptr_t const**) ptr + primary->_primaryIndex._nrAlloc; // first, collect all document pointers by traversing the primary index for (; ptr < end; ++ptr) { diff --git a/arangod/VocBase/auth.c b/arangod/VocBase/auth.c index 0f04d68751..07a851ff70 100644 --- a/arangod/VocBase/auth.c +++ b/arangod/VocBase/auth.c @@ -230,7 +230,6 @@ static TRI_vocbase_auth_t* ConvertAuthInfo (TRI_vocbase_t* vocbase, void TRI_LoadAuthInfo (TRI_vocbase_t* vocbase) { TRI_vocbase_col_t* collection; TRI_primary_collection_t* primary; - TRI_document_collection_t* sim; void** beg; void** end; void** ptr; @@ -259,16 +258,14 @@ void TRI_LoadAuthInfo (TRI_vocbase_t* vocbase) { return; } - sim = (TRI_document_collection_t*) primary; - // ............................................................................. // inside a read transaction // ............................................................................. collection->_collection->beginRead(collection->_collection); - beg = sim->_primaryIndex._table; - end = sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc; + beg = primary->_primaryIndex._table; + end = beg + primary->_primaryIndex._nrAlloc; ptr = beg; for (; ptr < end; ++ptr) { diff --git a/arangod/VocBase/compactor.c b/arangod/VocBase/compactor.c index 2a0692417f..0fc5221237 100644 --- a/arangod/VocBase/compactor.c +++ b/arangod/VocBase/compactor.c @@ -209,11 +209,13 @@ static bool Compactifier (TRI_df_marker_t const* marker, void* data, TRI_datafil TRI_doc_datafile_info_t* dfi; TRI_doc_mptr_t const* found; TRI_document_collection_t* sim; + TRI_primary_collection_t* primary; TRI_voc_fid_t fid; bool deleted; int res; sim = data; + primary = &sim->base; // new or updated document if (marker->_type == TRI_DOC_MARKER_DOCUMENT || @@ -236,12 +238,12 @@ static bool Compactifier (TRI_df_marker_t const* marker, void* data, TRI_datafil d = (TRI_doc_document_marker_t const*) marker; // check if the document is still active - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); - found = TRI_LookupByKeyAssociativePointer(&sim->_primaryIndex, &d->_did); + found = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &d->_did); deleted = found == NULL || found->_deletion != 0; - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); if (deleted) { LOG_TRACE("found a stale document: %lu", d->_did); @@ -257,24 +259,24 @@ static bool Compactifier (TRI_df_marker_t const* marker, void* data, TRI_datafil } // check if the document is still active - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); - found = TRI_LookupByKeyAssociativePointer(&sim->_primaryIndex, &d->_did); + found = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &d->_did); deleted = found == NULL || found->_deletion != 0; - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // update datafile - TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(primary); - dfi = TRI_FindDatafileInfoPrimaryCollection(&sim->base, fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, fid); if (deleted) { dfi->_numberDead += 1; dfi->_sizeDead += marker->_size - markerSize; LOG_DEBUG("found a stale document after copying: %lu", d->_did); - TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(primary); return true; } @@ -287,7 +289,7 @@ static bool Compactifier (TRI_df_marker_t const* marker, void* data, TRI_datafil dfi->_numberAlive += 1; dfi->_sizeAlive += marker->_size - markerSize; - TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(primary); } // deletion @@ -303,12 +305,12 @@ static bool Compactifier (TRI_df_marker_t const* marker, void* data, TRI_datafil } // update datafile info - TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(primary); - dfi = TRI_FindDatafileInfoPrimaryCollection(&sim->base, fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, fid); dfi->_numberDeletion += 1; - TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(primary); } return true; @@ -334,24 +336,27 @@ static void WaitCompactSync (TRI_document_collection_t* collection, TRI_datafile static void CompactifyDatafile (TRI_document_collection_t* sim, TRI_voc_fid_t fid) { TRI_datafile_t* df; + TRI_primary_collection_t* primary; bool ok; size_t n; size_t i; - // locate the datafile - TRI_READ_LOCK_DATAFILES_DOC_COLLECTION(sim); + primary = &sim->base; - n = sim->base.base._datafiles._length; + // locate the datafile + TRI_READ_LOCK_DATAFILES_DOC_COLLECTION(primary); + + n = primary->base._datafiles._length; for (i = 0; i < n; ++i) { - df = sim->base.base._datafiles._buffer[i]; + df = primary->base._datafiles._buffer[i]; if (df->_fid == fid) { break; } } - TRI_READ_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DATAFILES_DOC_COLLECTION(primary); if (i == n) { return; @@ -371,20 +376,20 @@ static void CompactifyDatafile (TRI_document_collection_t* sim, TRI_voc_fid_t fi WaitCompactSync(sim, df); // remove the datafile from the list of datafiles - TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DATAFILES_DOC_COLLECTION(primary); - n = sim->base.base._datafiles._length; + n = primary->base._datafiles._length; for (i = 0; i < n; ++i) { - df = sim->base.base._datafiles._buffer[i]; + df = primary->base._datafiles._buffer[i]; if (df->_fid == fid) { - TRI_RemoveVectorPointer(&sim->base.base._datafiles, i); + TRI_RemoveVectorPointer(&primary->base._datafiles, i); break; } } - TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DATAFILES_DOC_COLLECTION(primary); if (i == n) { LOG_WARNING("failed to locate the datafile '%lu'", (unsigned long) df->_fid); @@ -392,7 +397,7 @@ static void CompactifyDatafile (TRI_document_collection_t* sim, TRI_voc_fid_t fi } // add a deletion marker to the result set container - TRI_CreateBarrierDatafile(&sim->base._barrierList, df, RemoveDatafileCallback, &sim->base.base); + TRI_CreateBarrierDatafile(&primary->_barrierList, df, RemoveDatafileCallback, &primary->base); } //////////////////////////////////////////////////////////////////////////////// @@ -400,34 +405,37 @@ static void CompactifyDatafile (TRI_document_collection_t* sim, TRI_voc_fid_t fi //////////////////////////////////////////////////////////////////////////////// static bool CompactifyDocumentCollection (TRI_document_collection_t* sim) { + TRI_primary_collection_t* primary; TRI_vector_t vector; size_t n; size_t i; bool worked = false; + primary = &sim->base; + // if we cannot acquire the read lock instantly, we will exit directly. // otherwise we'll risk a multi-thread deadlock between synchroniser, // compactor and data-modification threads (e.g. POST /_api/document) - if (! TRI_TRY_READ_LOCK_DATAFILES_DOC_COLLECTION(sim)) { + if (! TRI_TRY_READ_LOCK_DATAFILES_DOC_COLLECTION(primary)) { return worked; } // copy datafile information TRI_InitVector(&vector, TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_doc_datafile_info_t)); - n = sim->base.base._datafiles._length; + n = primary->base._datafiles._length; for (i = 0; i < n; ++i) { TRI_datafile_t* df; TRI_doc_datafile_info_t* dfi; - df = sim->base.base._datafiles._buffer[i]; - dfi = TRI_FindDatafileInfoPrimaryCollection(&sim->base, df->_fid); + df = primary->base._datafiles._buffer[i]; + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, df->_fid); TRI_PushBackVector(&vector, dfi); } - TRI_READ_UNLOCK_DATAFILES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DATAFILES_DOC_COLLECTION(primary); // handle datafiles with dead objects for (i = 0; i < vector._length; ++i) { diff --git a/arangod/VocBase/document-collection.c b/arangod/VocBase/document-collection.c index 818b1b54ee..f8b4345aad 100644 --- a/arangod/VocBase/document-collection.c +++ b/arangod/VocBase/document-collection.c @@ -78,12 +78,6 @@ static int DeleteShapedJson (TRI_primary_collection_t* doc, TRI_doc_update_policy_e policy, bool release); -static uint64_t HashKeyHeader (TRI_associative_pointer_t* array, void const* key); - -static uint64_t HashElementDocument (TRI_associative_pointer_t* array, void const* element); - -static bool IsEqualKeyDocument (TRI_associative_pointer_t* array, void const* key, void const* element); - static int InsertPrimary (TRI_index_t* idx, TRI_doc_mptr_t const* doc); static int UpdatePrimary (TRI_index_t* idx, TRI_doc_mptr_t const* doc, TRI_shaped_json_t const* old); static int RemovePrimary (TRI_index_t* idx, TRI_doc_mptr_t const* doc); @@ -741,15 +735,18 @@ static int DeleteDocument (TRI_document_collection_t* collection, TRI_datafile_t* journal; TRI_df_marker_t* result; TRI_doc_mptr_t const* header; + TRI_primary_collection_t* primary; TRI_voc_size_t total; int res; + primary = &collection->base; + // get an existing header pointer - header = TRI_LookupByKeyAssociativePointer(&collection->_primaryIndex, &marker->_did); + header = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &marker->_did); if (header == NULL || header->_deletion != 0) { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } return TRI_set_errno(TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND); @@ -765,7 +762,7 @@ static int DeleteDocument (TRI_document_collection_t* collection, if (rid != 0) { if (rid != header->_rid) { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } return TRI_set_errno(TRI_ERROR_ARANGO_CONFLICT); @@ -779,14 +776,14 @@ static int DeleteDocument (TRI_document_collection_t* collection, case TRI_DOC_UPDATE_CONFLICT: if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } return TRI_set_errno(TRI_ERROR_NOT_IMPLEMENTED); case TRI_DOC_UPDATE_ILLEGAL: if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } return TRI_set_errno(TRI_ERROR_INTERNAL); @@ -820,7 +817,7 @@ static int DeleteDocument (TRI_document_collection_t* collection, TRI_doc_datafile_info_t* dfi; // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, header->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, header->_fid); if (dfi != NULL) { size_t length = TRI_LengthDataMasterPointer(header); @@ -831,7 +828,7 @@ static int DeleteDocument (TRI_document_collection_t* collection, dfi->_sizeDead += length; } - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, journal->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, journal->_fid); if (dfi != NULL) { dfi->_numberDeletion += 1; } @@ -841,7 +838,7 @@ static int DeleteDocument (TRI_document_collection_t* collection, // release lock if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } // wait for sync @@ -849,7 +846,7 @@ static int DeleteDocument (TRI_document_collection_t* collection, } else { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } LOG_ERROR("cannot delete element"); @@ -879,11 +876,11 @@ static int DeleteDocument (TRI_document_collection_t* collection, /// @brief debug output for datafile information //////////////////////////////////////////////////////////////////////////////// -static void DebugDatafileInfoDatafile (TRI_primary_collection_t* collection, +static void DebugDatafileInfoDatafile (TRI_primary_collection_t* primary, TRI_datafile_t* datafile) { TRI_doc_datafile_info_t* dfi; - dfi = TRI_FindDatafileInfoPrimaryCollection(collection, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); printf("DATAFILE '%s'\n", datafile->_filename); @@ -938,12 +935,14 @@ static void DebugDatafileInfoPrimaryCollection (TRI_primary_collection_t* collec //////////////////////////////////////////////////////////////////////////////// static void DebugHeaderDocumentCollection (TRI_document_collection_t* collection) { + TRI_primary_collection_t* primary; void** end; void** ptr; - // update index - ptr = collection->_primaryIndex._table; - end = collection->_primaryIndex._table + collection->_primaryIndex._nrAlloc; + primary = &collection->base; + + ptr = primary->_primaryIndex._table; + end = ptr + primary->_primaryIndex._nrAlloc; for (; ptr < end; ++ptr) { if (*ptr) { @@ -965,7 +964,7 @@ static void DebugHeaderDocumentCollection (TRI_document_collection_t* collection /// @brief creates a new document in the collection from shaped json //////////////////////////////////////////////////////////////////////////////// -static TRI_doc_mptr_t CreateShapedJson (TRI_primary_collection_t* document, +static TRI_doc_mptr_t CreateShapedJson (TRI_primary_collection_t* primary, TRI_df_marker_type_e type, TRI_shaped_json_t const* json, void const* data, @@ -975,7 +974,7 @@ static TRI_doc_mptr_t CreateShapedJson (TRI_primary_collection_t* document, TRI_df_marker_t* result; TRI_document_collection_t* collection; - collection = (TRI_document_collection_t*) document; + collection = (TRI_document_collection_t*) primary; if (type == TRI_DOC_MARKER_DOCUMENT) { TRI_doc_document_marker_t marker; @@ -1036,15 +1035,12 @@ static TRI_doc_mptr_t CreateShapedJson (TRI_primary_collection_t* document, /// @brief reads an element from the simple collection //////////////////////////////////////////////////////////////////////////////// -static TRI_doc_mptr_t ReadShapedJson (TRI_primary_collection_t* document, +static TRI_doc_mptr_t ReadShapedJson (TRI_primary_collection_t* primary, TRI_voc_did_t did) { - TRI_document_collection_t* collection; TRI_doc_mptr_t result; TRI_doc_mptr_t const* header; - collection = (TRI_document_collection_t*) document; - - header = TRI_LookupByKeyAssociativePointer(&collection->_primaryIndex, &did); + header = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &did); if (header == NULL || header->_deletion != 0) { memset(&result, 0, sizeof(result)); @@ -1059,7 +1055,7 @@ static TRI_doc_mptr_t ReadShapedJson (TRI_primary_collection_t* document, /// @brief updates a document in the collection from shaped json //////////////////////////////////////////////////////////////////////////////// -static TRI_doc_mptr_t UpdateShapedJson (TRI_primary_collection_t* document, +static TRI_doc_mptr_t UpdateShapedJson (TRI_primary_collection_t* primary, TRI_shaped_json_t const* json, TRI_voc_did_t did, TRI_voc_rid_t rid, @@ -1068,18 +1064,18 @@ static TRI_doc_mptr_t UpdateShapedJson (TRI_primary_collection_t* document, bool release) { TRI_df_marker_t const* original; TRI_df_marker_t* result; + TRI_document_collection_t* collection; TRI_doc_mptr_t mptr; TRI_doc_mptr_t const* header; - TRI_document_collection_t* collection; - collection = (TRI_document_collection_t*) document; + collection = (TRI_document_collection_t*) primary; // get an existing header pointer - header = TRI_LookupByKeyAssociativePointer(&collection->_primaryIndex, &did); + header = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &did); if (header == NULL || header->_deletion != 0) { if (release) { - document->endWrite(&collection->base); + primary->endWrite(primary); } TRI_set_errno(TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND); @@ -1152,7 +1148,7 @@ static TRI_doc_mptr_t UpdateShapedJson (TRI_primary_collection_t* document, // do not know else { if (release) { - document->endWrite(&collection->base); + primary->endWrite(primary); } LOG_FATAL("unknown marker type %lu", (unsigned long) original->_type); @@ -1171,10 +1167,10 @@ static int DeleteShapedJson (TRI_primary_collection_t* primary, TRI_voc_rid_t* oldRid, TRI_doc_update_policy_e policy, bool release) { - TRI_document_collection_t* sim; + TRI_document_collection_t* document; TRI_doc_deletion_marker_t marker; - sim = (TRI_document_collection_t*) primary; + document = (TRI_document_collection_t*) primary; memset(&marker, 0, sizeof(marker)); @@ -1184,7 +1180,7 @@ static int DeleteShapedJson (TRI_primary_collection_t* primary, marker._did = did; marker._sid = 0; - return DeleteDocument(sim, &marker, rid, oldRid, policy, release); + return DeleteDocument(document, &marker, rid, oldRid, policy, release); } //////////////////////////////////////////////////////////////////////////////// @@ -1192,10 +1188,7 @@ static int DeleteShapedJson (TRI_primary_collection_t* primary, //////////////////////////////////////////////////////////////////////////////// static int BeginRead (TRI_primary_collection_t* primary) { - TRI_document_collection_t* sim; - - sim = (TRI_document_collection_t*) primary; - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); return TRI_ERROR_NO_ERROR; } @@ -1205,10 +1198,7 @@ static int BeginRead (TRI_primary_collection_t* primary) { //////////////////////////////////////////////////////////////////////////////// static int EndRead (TRI_primary_collection_t* primary) { - TRI_document_collection_t* sim; - - sim = (TRI_document_collection_t*) primary; - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); return TRI_ERROR_NO_ERROR; } @@ -1218,10 +1208,7 @@ static int EndRead (TRI_primary_collection_t* primary) { //////////////////////////////////////////////////////////////////////////////// static int BeginWrite (TRI_primary_collection_t* primary) { - TRI_document_collection_t* sim; - - sim = (TRI_document_collection_t*) primary; - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); return TRI_ERROR_NO_ERROR; } @@ -1230,11 +1217,8 @@ static int BeginWrite (TRI_primary_collection_t* primary) { /// @brief write unlocks a collection //////////////////////////////////////////////////////////////////////////////// -static int EndWrite (TRI_primary_collection_t* document) { - TRI_document_collection_t* sim; - - sim = (TRI_document_collection_t*) document; - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); +static int EndWrite (TRI_primary_collection_t* primary) { + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); return TRI_ERROR_NO_ERROR; } @@ -1245,17 +1229,14 @@ static int EndWrite (TRI_primary_collection_t* document) { static TRI_voc_size_t SizeDocumentCollection (TRI_primary_collection_t* primary) { TRI_doc_mptr_t const* mptr; - TRI_document_collection_t* sim; TRI_voc_size_t result; void** end; void** ptr; - sim = (TRI_document_collection_t*) primary; + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); - - ptr = sim->_primaryIndex._table; - end = sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc; + ptr = primary->_primaryIndex._table; + end = ptr + primary->_primaryIndex._nrAlloc; result = 0; for (; ptr < end; ++ptr) { @@ -1268,7 +1249,7 @@ static TRI_voc_size_t SizeDocumentCollection (TRI_primary_collection_t* primary) } } - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); return result; } @@ -1278,7 +1259,7 @@ static TRI_voc_size_t SizeDocumentCollection (TRI_primary_collection_t* primary) //////////////////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------------------- -// --SECTION-- SIMPLE COLLECTION +// --SECTION-- DOCUMENT COLLECTION // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- @@ -1296,9 +1277,12 @@ static TRI_voc_size_t SizeDocumentCollection (TRI_primary_collection_t* primary) static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafile_t* datafile, bool journal) { TRI_document_collection_t* collection = data; + TRI_primary_collection_t* primary; TRI_doc_mptr_t const* found; TRI_doc_datafile_info_t* dfi; + primary = &collection->base; + // new or updated document if (marker->_type == TRI_DOC_MARKER_DOCUMENT || marker->_type == TRI_DOC_MARKER_EDGE) { @@ -1333,11 +1317,11 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil exit(EXIT_FAILURE); } - if (collection->base.base._maximumMarkerSize < markerSize) { - collection->base.base._maximumMarkerSize = markerSize; + if (primary->base._maximumMarkerSize < markerSize) { + primary->base._maximumMarkerSize = markerSize; } - found = TRI_LookupByKeyAssociativePointer(&collection->_primaryIndex, &d->_did); + found = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &d->_did); // it is a new entry if (found == NULL) { @@ -1348,10 +1332,10 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil header = collection->_headers->verify(collection->_headers, header); // fill the header - collection->base.createHeader(&collection->base, datafile, marker, markerSize, header, 0); + primary->createHeader(primary, datafile, marker, markerSize, header, 0); // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); if (dfi != NULL) { dfi->_numberAlive += 1; @@ -1372,10 +1356,10 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil TRI_doc_mptr_t update; // update the header info - collection->base.updateHeader(&collection->base, datafile, marker, markerSize, found, &update); + primary->updateHeader(primary, datafile, marker, markerSize, found, &update); // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, found->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, found->_fid); if (dfi != NULL) { size_t length = TRI_LengthDataMasterPointer(found); @@ -1387,7 +1371,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil dfi->_sizeDead += length; } - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); if (dfi != NULL) { dfi->_numberAlive += 1; @@ -1400,7 +1384,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil // it is a stale update else { - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); if (dfi != NULL) { dfi->_numberDead += 1; @@ -1421,7 +1405,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil (unsigned long) d->_rid, (unsigned long) marker->_tick); - found = TRI_LookupByKeyAssociativePointer(&collection->_primaryIndex, &d->_did); + found = TRI_LookupByKeyAssociativePointer(&primary->_primaryIndex, &d->_did); // it is a new entry, so we missed the create if (found == NULL) { @@ -1440,7 +1424,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil CreateImmediateIndexes(collection, header); // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); if (dfi != NULL) { dfi->_numberDeletion += 1; @@ -1456,7 +1440,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil change.v->_deletion = marker->_tick; // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, found->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, found->_fid); if (dfi != NULL) { size_t length = TRI_LengthDataMasterPointer(found); @@ -1467,7 +1451,7 @@ static bool OpenIterator (TRI_df_marker_t const* marker, void* data, TRI_datafil dfi->_numberDead += 1; dfi->_sizeDead += length; } - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, datafile->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, datafile->_fid); if (dfi != NULL) { dfi->_numberDeletion += 1; @@ -1503,9 +1487,6 @@ static bool OpenIndexIterator (char const* filename, void* data) { // load json description of the index json = TRI_JsonFile(TRI_CORE_MEM_ZONE, filename, &error); - // simple collection of the index - sim = (TRI_document_collection_t*) data; - // json must be a index description if (json == NULL) { LOG_ERROR("cannot read index definition from '%s': %s", filename, error); @@ -1542,6 +1523,9 @@ static bool OpenIndexIterator (char const* filename, void* data) { LOG_ERROR("ignoring index, index identifier could not be located"); return false; } + + // document collection of the index + sim = (TRI_document_collection_t*) data; // ........................................................................... // CAP CONSTRAINT @@ -1690,23 +1674,13 @@ static bool InitDocumentCollection (TRI_document_collection_t* collection, TRI_InitPrimaryCollection(&collection->base, shaper); - TRI_InitReadWriteLock(&collection->_lock); - collection->_headers = TRI_CreateSimpleHeaders(sizeof(TRI_doc_mptr_t)); if (collection->_headers == NULL) { TRI_DestroyPrimaryCollection(&collection->base); - TRI_DestroyReadWriteLock(&collection->_lock); return false; } - TRI_InitAssociativePointer(&collection->_primaryIndex, - TRI_UNKNOWN_MEM_ZONE, - HashKeyHeader, - HashElementDocument, - IsEqualKeyDocument, - 0); - TRI_InitMultiPointer(&collection->_edgesIndex, TRI_UNKNOWN_MEM_ZONE, HashElementEdge, @@ -1849,8 +1823,6 @@ void TRI_DestroyDocumentCollection (TRI_document_collection_t* collection) { TRI_DestroyCondition(&collection->_journalsCondition); - TRI_DestroyAssociativePointer(&collection->_primaryIndex); - // free all elements in the edges index n = collection->_edgesIndex._nrAlloc; for (i = 0; i < n; ++i) { @@ -1863,8 +1835,6 @@ void TRI_DestroyDocumentCollection (TRI_document_collection_t* collection) { TRI_FreeSimpleHeaders(collection->_headers); - TRI_DestroyReadWriteLock(&collection->_lock); - // free memory allocated for index field names n = collection->_secondaryIndexes._length; for (i = 0 ; i < n ; ++i) { @@ -2197,18 +2167,21 @@ static TRI_json_t* ExtractFieldValues (TRI_json_t* jsonIndex, size_t* fieldCount static int CreateImmediateIndexes (TRI_document_collection_t* sim, TRI_doc_mptr_t* header) { TRI_df_marker_t const* marker; + TRI_primary_collection_t* primary; TRI_doc_mptr_t* found; size_t n; size_t i; int result; bool constraint; + primary = &sim->base; + // ............................................................................. // update primary index // ............................................................................. // add a new header - found = TRI_InsertKeyAssociativePointer(&sim->_primaryIndex, &header->_did, header, false); + found = TRI_InsertKeyAssociativePointer(&primary->_primaryIndex, &header->_did, header, false); // TODO: if TRI_InsertKeyAssociativePointer fails with OOM, it returns NULL. // in case the call succeeds but does not find any previous value, it also returns NULL @@ -2406,6 +2379,7 @@ static int DeleteImmediateIndexes (TRI_document_collection_t* collection, TRI_doc_mptr_t const* header, TRI_voc_tick_t deletion) { union { TRI_doc_mptr_t const* c; TRI_doc_mptr_t* v; } change; + TRI_primary_collection_t* primary; TRI_df_marker_t const* marker; TRI_doc_mptr_t* found; size_t n; @@ -2416,11 +2390,13 @@ static int DeleteImmediateIndexes (TRI_document_collection_t* collection, change.c = header; change.v->_deletion = deletion; + primary = &collection->base; + // ............................................................................. // remove from main index // ............................................................................. - found = TRI_RemoveKeyAssociativePointer(&collection->_primaryIndex, &header->_did); + found = TRI_RemoveKeyAssociativePointer(&primary->_primaryIndex, &header->_did); if (found == NULL) { return TRI_set_errno(TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND); @@ -2518,6 +2494,7 @@ static int DeleteImmediateIndexes (TRI_document_collection_t* collection, static int FillIndex (TRI_document_collection_t* collection, TRI_index_t* idx) { TRI_doc_mptr_t const* mptr; + TRI_primary_collection_t* primary; size_t n; size_t scanned; size_t inserted; @@ -2525,10 +2502,12 @@ static int FillIndex (TRI_document_collection_t* collection, TRI_index_t* idx) { void** ptr; int res; + primary = &collection->base; + // update index - n = collection->_primaryIndex._nrUsed; - ptr = collection->_primaryIndex._table; - end = collection->_primaryIndex._table + collection->_primaryIndex._nrAlloc; + n = primary->_primaryIndex._nrUsed; + ptr = primary->_primaryIndex._table; + end = ptr + primary->_primaryIndex._nrAlloc; scanned = 0; inserted = 0; @@ -2544,7 +2523,7 @@ static int FillIndex (TRI_document_collection_t* collection, TRI_index_t* idx) { if (res != TRI_ERROR_NO_ERROR) { LOG_WARNING("failed to insert document '%lu:%lu' for index '%lu'", - (unsigned long) collection->base.base._cid, + (unsigned long) primary->base._cid, (unsigned long) mptr->_did, (unsigned long) idx->_iid); @@ -2554,12 +2533,12 @@ static int FillIndex (TRI_document_collection_t* collection, TRI_index_t* idx) { ++inserted; if (inserted % 10000 == 0) { - LOG_DEBUG("indexed %ld documents of collection %lu", inserted, (unsigned long) collection->base.base._cid); + LOG_DEBUG("indexed %ld documents of collection %lu", inserted, (unsigned long) primary->base._cid); } } if (scanned % 10000 == 0) { - LOG_TRACE("scanned %ld of %ld datafile entries of collection %lu", scanned, n, (unsigned long) collection->base.base._cid); + LOG_TRACE("scanned %ld of %ld datafile entries of collection %lu", scanned, n, (unsigned long) primary->base._cid); } } } @@ -2916,6 +2895,7 @@ static int ComparePidName (void const* left, void const* right) { TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* sim, const bool lock) { TRI_vector_pointer_t* vector; + TRI_primary_collection_t* primary; size_t n; size_t i; @@ -2924,6 +2904,8 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* return NULL; } + primary = &sim->base; + TRI_InitVectorPointer(vector, TRI_UNKNOWN_MEM_ZONE); // ............................................................................. @@ -2931,7 +2913,7 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* // ............................................................................. if (lock) { - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); } n = sim->_secondaryIndexes._length; @@ -2942,7 +2924,7 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* idx = sim->_secondaryIndexes._buffer[i]; - json = idx->json(idx, &sim->base); + json = idx->json(idx, primary); if (json != NULL) { TRI_PushBackVectorPointer(vector, json); @@ -2950,7 +2932,7 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* } if (lock) { - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); } // ............................................................................. @@ -2966,6 +2948,7 @@ TRI_vector_pointer_t* TRI_IndexesDocumentCollection (TRI_document_collection_t* bool TRI_DropIndexDocumentCollection (TRI_document_collection_t* sim, TRI_idx_iid_t iid) { TRI_index_t* found; + TRI_primary_collection_t* primary; bool removeResult; size_t n; size_t i; @@ -2975,12 +2958,13 @@ bool TRI_DropIndexDocumentCollection (TRI_document_collection_t* sim, TRI_idx_ii } found = NULL; + primary = &sim->base; // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); n = sim->_secondaryIndexes._length; @@ -2993,21 +2977,21 @@ bool TRI_DropIndexDocumentCollection (TRI_document_collection_t* sim, TRI_idx_ii found = TRI_RemoveVectorPointer(&sim->_secondaryIndexes, i); if (found != NULL) { - found->removeIndex(found, &sim->base); + found->removeIndex(found, primary); } break; } } - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock // ............................................................................. if (found != NULL) { - removeResult = TRI_RemoveIndexFile(&sim->base, found); + removeResult = TRI_RemoveIndexFile(primary, found); TRI_FreeIndex(found); return removeResult; } @@ -3117,37 +3101,6 @@ int TRI_PidNamesByAttributeNames (TRI_vector_pointer_t const* attributes, /// @{ //////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -/// @brief hashs the document id -//////////////////////////////////////////////////////////////////////////////// - -static uint64_t HashKeyHeader (TRI_associative_pointer_t* array, void const* key) { - TRI_voc_did_t const* k = key; - - return TRI_FnvHashPointer(k, sizeof(TRI_voc_did_t)); -} - -//////////////////////////////////////////////////////////////////////////////// -/// @brief hashs the document header -//////////////////////////////////////////////////////////////////////////////// - -static uint64_t HashElementDocument (TRI_associative_pointer_t* array, void const* element) { - TRI_doc_mptr_t const* e = element; - - return TRI_FnvHashPointer(&e->_did, sizeof(TRI_voc_did_t)); -} - -//////////////////////////////////////////////////////////////////////////////// -/// @brief compares a document id and a document -//////////////////////////////////////////////////////////////////////////////// - -static bool IsEqualKeyDocument (TRI_associative_pointer_t* array, void const* key, void const* element) { - TRI_voc_did_t const* k = key; - TRI_doc_mptr_t const* e = element; - - return *k == e->_did; -} - //////////////////////////////////////////////////////////////////////////////// /// @brief insert methods does nothing //////////////////////////////////////////////////////////////////////////////// @@ -3362,17 +3315,20 @@ TRI_index_t* TRI_EnsureCapConstraintDocumentCollection (TRI_document_collection_ size_t size, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + primary = &sim->base; + // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = CreateCapConstraintDocumentCollection(sim, size, 0, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -3383,7 +3339,7 @@ TRI_index_t* TRI_EnsureCapConstraintDocumentCollection (TRI_document_collection_ } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -3727,17 +3683,20 @@ TRI_index_t* TRI_EnsureGeoIndex1DocumentCollection (TRI_document_collection_t* s bool ignoreNull, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + primary = &sim->base; + // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = CreateGeoIndexDocumentCollection(sim, location, NULL, NULL, geoJson, constraint, ignoreNull, 0, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -3748,7 +3707,7 @@ TRI_index_t* TRI_EnsureGeoIndex1DocumentCollection (TRI_document_collection_t* s } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -3768,17 +3727,20 @@ TRI_index_t* TRI_EnsureGeoIndex2DocumentCollection (TRI_document_collection_t* s bool ignoreNull, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + primary = &sim->base; + // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = CreateGeoIndexDocumentCollection(sim, NULL, latitude, longitude, false, constraint, ignoreNull, 0, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -3789,7 +3751,7 @@ TRI_index_t* TRI_EnsureGeoIndex2DocumentCollection (TRI_document_collection_t* s } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -3928,13 +3890,16 @@ TRI_index_t* TRI_LookupHashIndexDocumentCollection (TRI_document_collection_t* s TRI_vector_pointer_t const* attributes, bool unique) { TRI_index_t* idx; + TRI_primary_collection_t* primary; TRI_vector_pointer_t fields; TRI_vector_t paths; int res; + primary = &sim->base; + // determine the sorted shape ids for the attributes res = TRI_PidNamesByAttributeNames(attributes, - sim->base._shaper, + primary->_shaper, &paths, &fields, true); @@ -3947,11 +3912,11 @@ TRI_index_t* TRI_LookupHashIndexDocumentCollection (TRI_document_collection_t* s // inside write-lock // ............................................................................. - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = LookupPathIndexDocumentCollection(sim, &paths, TRI_IDX_TYPE_HASH_INDEX, unique); - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -3973,18 +3938,21 @@ TRI_index_t* TRI_EnsureHashIndexDocumentCollection (TRI_document_collection_t* s bool unique, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + + primary = &sim->base; // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // given the list of attributes (as strings) idx = CreateHashIndexDocumentCollection(sim, attributes, 0, unique, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -3995,7 +3963,7 @@ TRI_index_t* TRI_EnsureHashIndexDocumentCollection (TRI_document_collection_t* s } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -4130,13 +4098,16 @@ TRI_index_t* TRI_LookupSkiplistIndexDocumentCollection (TRI_document_collection_ TRI_vector_pointer_t const* attributes, bool unique) { TRI_index_t* idx; + TRI_primary_collection_t* primary; TRI_vector_pointer_t fields; TRI_vector_t paths; int res; + primary = &sim->base; + // determine the unsorted shape ids for the attributes res = TRI_PidNamesByAttributeNames(attributes, - sim->base._shaper, + primary->_shaper, &paths, &fields, false); @@ -4149,11 +4120,11 @@ TRI_index_t* TRI_LookupSkiplistIndexDocumentCollection (TRI_document_collection_ // inside write-lock // ............................................................................. - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = LookupPathIndexDocumentCollection(sim, &paths, TRI_IDX_TYPE_SKIPLIST_INDEX, unique); - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -4175,17 +4146,20 @@ TRI_index_t* TRI_EnsureSkiplistIndexDocumentCollection (TRI_document_collection_ bool unique, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + + primary = &sim->base; // ............................................................................. // inside write-lock the collection // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = CreateSkiplistIndexDocumentCollection(sim, attributes, 0, unique, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -4196,7 +4170,7 @@ TRI_index_t* TRI_EnsureSkiplistIndexDocumentCollection (TRI_document_collection_ } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -4416,18 +4390,21 @@ TRI_index_t* TRI_EnsurePriorityQueueIndexDocumentCollection(TRI_document_collect bool unique, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + primary = &sim->base; + // ............................................................................. // inside write-lock // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // Given the list of attributes (as strings) idx = CreatePriorityQueueIndexDocumentCollection(sim, attributes, 0, unique, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -4438,7 +4415,7 @@ TRI_index_t* TRI_EnsurePriorityQueueIndexDocumentCollection(TRI_document_collect } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -4606,15 +4583,18 @@ static int BitarrayIndexFromJson (TRI_document_collection_t* sim, TRI_index_t* TRI_LookupBitarrayIndexDocumentCollection (TRI_document_collection_t* sim, const TRI_vector_pointer_t* attributes) { TRI_index_t* idx; + TRI_primary_collection_t* primary; TRI_vector_pointer_t fields; TRI_vector_t paths; int result; + primary = &sim->base; + // ........................................................................... // determine the unsorted shape ids for the attributes // ........................................................................... - result = TRI_PidNamesByAttributeNames(attributes, sim->base._shaper, &paths, + result = TRI_PidNamesByAttributeNames(attributes, primary->_shaper, &paths, &fields, false); if (result != TRI_ERROR_NO_ERROR) { @@ -4626,7 +4606,7 @@ TRI_index_t* TRI_LookupBitarrayIndexDocumentCollection (TRI_document_collection_ // inside write-lock // ............................................................................. - TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. @@ -4637,7 +4617,7 @@ TRI_index_t* TRI_LookupBitarrayIndexDocumentCollection (TRI_document_collection_ idx = LookupPathIndexDocumentCollection(sim, &paths, TRI_IDX_TYPE_SKIPLIST_INDEX, false); - TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -4663,17 +4643,20 @@ TRI_index_t* TRI_EnsureBitarrayIndexDocumentCollection (TRI_document_collection_ bool supportUndef, bool* created) { TRI_index_t* idx; + TRI_primary_collection_t* primary; int res; + + primary = &sim->base; // ............................................................................. // inside write-lock the collection // ............................................................................. - TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); idx = CreateBitarrayIndexDocumentCollection(sim, attributes, values, 0, supportUndef, created); - TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(sim); + TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(primary); // ............................................................................. // outside write-lock @@ -4684,7 +4667,7 @@ TRI_index_t* TRI_EnsureBitarrayIndexDocumentCollection (TRI_document_collection_ } if (created) { - res = TRI_SaveIndex(&sim->base, idx); + res = TRI_SaveIndex(primary, idx); return res == TRI_ERROR_NO_ERROR ? idx : NULL; } @@ -4784,18 +4767,21 @@ TRI_vector_t TRI_SelectByExample (TRI_document_collection_t* sim, TRI_shape_pid_t* pids, TRI_shaped_json_t** values) { TRI_shaper_t* shaper; + TRI_primary_collection_t* primary; TRI_doc_mptr_t const** ptr; TRI_doc_mptr_t const** end; TRI_vector_t filtered; + primary = &sim->base; + // use filtered to hold copies of the master pointer TRI_InitVector(&filtered, TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_doc_mptr_t)); // do a full scan - shaper = sim->base._shaper; + shaper = primary->_shaper; - ptr = (TRI_doc_mptr_t const**) (sim->_primaryIndex._table); - end = (TRI_doc_mptr_t const**) (sim->_primaryIndex._table + sim->_primaryIndex._nrAlloc); + ptr = (TRI_doc_mptr_t const**) (primary->_primaryIndex._table); + end = (TRI_doc_mptr_t const**) ptr + primary->_primaryIndex._nrAlloc; for (; ptr < end; ++ptr) { if (*ptr && (*ptr)->_deletion == 0) { diff --git a/arangod/VocBase/document-collection.h b/arangod/VocBase/document-collection.h index db175bd16a..0c98786f7b 100644 --- a/arangod/VocBase/document-collection.h +++ b/arangod/VocBase/document-collection.h @@ -1,5 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// -/// @brief primary collection with global read-write lock +/// @brief document collection with global read-write lock, derived from +/// TRI_primary_collection_t /// /// @file /// @@ -94,38 +95,6 @@ extern "C" { TRI_LOCK_CHECK_TRACE("write-unlocking datafiles %p", a); \ TRI_WriteUnlockReadWriteLock(&(a)->_lock) -//////////////////////////////////////////////////////////////////////////////// -/// @brief read locks the documents and indexes -//////////////////////////////////////////////////////////////////////////////// - -#define TRI_READ_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(a) \ - TRI_LOCK_CHECK_TRACE("read-locking collection index %p", a); \ - TRI_ReadLockReadWriteLock(&(a)->_lock) - -//////////////////////////////////////////////////////////////////////////////// -/// @brief read unlocks the documents and indexes -//////////////////////////////////////////////////////////////////////////////// - -#define TRI_READ_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(a) \ - TRI_LOCK_CHECK_TRACE("read-unlocking collection index %p", a); \ - TRI_ReadUnlockReadWriteLock(&(a)->_lock) - -//////////////////////////////////////////////////////////////////////////////// -/// @brief write locks the documents and indexes -//////////////////////////////////////////////////////////////////////////////// - -#define TRI_WRITE_LOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(a) \ - TRI_LOCK_CHECK_TRACE("write-locking collection index %p", a); \ - TRI_WriteLockReadWriteLock(&(a)->_lock) - -//////////////////////////////////////////////////////////////////////////////// -/// @brief write unlocks the documents and indexes -//////////////////////////////////////////////////////////////////////////////// - -#define TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_DOC_COLLECTION(a) \ - TRI_LOCK_CHECK_TRACE("write-unlocking collection index %p", a); \ - TRI_WriteUnlockReadWriteLock(&(a)->_lock) - //////////////////////////////////////////////////////////////////////////////// /// @brief locks the journal entries //////////////////////////////////////////////////////////////////////////////// @@ -214,15 +183,13 @@ extern "C" { typedef struct TRI_document_collection_s { TRI_primary_collection_t base; - - // ............................................................................. - // this lock protects the _next pointer, _headers, _indexes, and _primaryIndex - // ............................................................................. - - TRI_read_write_lock_t _lock; + // ............................................................................. + // the collection does not have a lock of its own. it is protected by the + // _lock of its base type, TRI_primary_collection_t. + // ............................................................................. + TRI_headers_t* _headers; - TRI_associative_pointer_t _primaryIndex; TRI_vector_pointer_t _secondaryIndexes; TRI_multi_pointer_t _edgesIndex; diff --git a/arangod/VocBase/primary-collection.c b/arangod/VocBase/primary-collection.c index 3dabdcb84c..de9af8981d 100644 --- a/arangod/VocBase/primary-collection.c +++ b/arangod/VocBase/primary-collection.c @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -43,6 +44,37 @@ /// @{ //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +/// @brief hashs the document id +//////////////////////////////////////////////////////////////////////////////// + +static uint64_t HashKeyHeader (TRI_associative_pointer_t* array, void const* key) { + TRI_voc_did_t const* k = key; + + return TRI_FnvHashPointer(k, sizeof(TRI_voc_did_t)); +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief hashs the document header +//////////////////////////////////////////////////////////////////////////////// + +static uint64_t HashElementDocument (TRI_associative_pointer_t* array, void const* element) { + TRI_doc_mptr_t const* e = element; + + return TRI_FnvHashPointer(&e->_did, sizeof(TRI_voc_did_t)); +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief compares a document id and a document +//////////////////////////////////////////////////////////////////////////////// + +static bool IsEqualKeyDocument (TRI_associative_pointer_t* array, void const* key, void const* element) { + TRI_voc_did_t const* k = key; + TRI_doc_mptr_t const* e = element; + + return *k == e->_did; +} + //////////////////////////////////////////////////////////////////////////////// /// @brief creates a new document in the collection from shaped json //////////////////////////////////////////////////////////////////////////////// @@ -496,6 +528,15 @@ void TRI_InitPrimaryCollection (TRI_primary_collection_t* collection, HashElementDatafile, IsEqualKeyElementDatafile, NULL); + + TRI_InitAssociativePointer(&collection->_primaryIndex, + TRI_UNKNOWN_MEM_ZONE, + HashKeyHeader, + HashElementDocument, + IsEqualKeyDocument, + 0); + + TRI_InitReadWriteLock(&collection->_lock); } //////////////////////////////////////////////////////////////////////////////// @@ -503,10 +544,13 @@ void TRI_InitPrimaryCollection (TRI_primary_collection_t* collection, //////////////////////////////////////////////////////////////////////////////// void TRI_DestroyPrimaryCollection (TRI_primary_collection_t* collection) { + TRI_DestroyReadWriteLock(&collection->_lock); + TRI_DestroyAssociativePointer(&collection->_primaryIndex); + if (collection->_shaper != NULL) { TRI_FreeVocShaper(collection->_shaper); } - + FreeDatafileInfo(&collection->_datafileInfo); TRI_DestroyBarrierList(&collection->_barrierList); diff --git a/arangod/VocBase/primary-collection.h b/arangod/VocBase/primary-collection.h index baf76cad0b..d1019e9cd0 100644 --- a/arangod/VocBase/primary-collection.h +++ b/arangod/VocBase/primary-collection.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -/// @brief primary collection +/// @brief primary collection with global read-write lock /// /// @file /// @@ -44,6 +44,51 @@ extern "C" { struct TRI_cap_constraint_s; +// ----------------------------------------------------------------------------- +// --SECTION-- public macros +// ----------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////// +/// @addtogroup VocBase +/// @{ +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +/// @brief read locks the documents and indexes +//////////////////////////////////////////////////////////////////////////////// + +#define TRI_READ_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(a) \ + TRI_LOCK_CHECK_TRACE("read-locking collection index %p", a); \ + TRI_ReadLockReadWriteLock(&(a)->_lock) + +//////////////////////////////////////////////////////////////////////////////// +/// @brief read unlocks the documents and indexes +//////////////////////////////////////////////////////////////////////////////// + +#define TRI_READ_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(a) \ + TRI_LOCK_CHECK_TRACE("read-unlocking collection index %p", a); \ + TRI_ReadUnlockReadWriteLock(&(a)->_lock) + +//////////////////////////////////////////////////////////////////////////////// +/// @brief write locks the documents and indexes +//////////////////////////////////////////////////////////////////////////////// + +#define TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(a) \ + TRI_LOCK_CHECK_TRACE("write-locking collection index %p", a); \ + TRI_WriteLockReadWriteLock(&(a)->_lock) + +//////////////////////////////////////////////////////////////////////////////// +/// @brief write unlocks the documents and indexes +//////////////////////////////////////////////////////////////////////////////// + +#define TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(a) \ + TRI_LOCK_CHECK_TRACE("write-unlocking collection index %p", a); \ + TRI_WriteUnlockReadWriteLock(&(a)->_lock) + +//////////////////////////////////////////////////////////////////////////////// +/// @} +//////////////////////////////////////////////////////////////////////////////// + // ----------------------------------------------------------------------------- // --SECTION-- public types // ----------------------------------------------------------------------------- @@ -259,10 +304,19 @@ TRI_doc_collection_info_t; typedef struct TRI_primary_collection_s { TRI_collection_t base; + + // ............................................................................. + // this lock protects the _primaryIndex plus the _secondaryIndexes, _edgesIndex, + // and _headers attributes in derived types + // ............................................................................. + + TRI_read_write_lock_t _lock; TRI_shaper_t* _shaper; TRI_barrier_list_t _barrierList; TRI_associative_pointer_t _datafileInfo; + + TRI_associative_pointer_t _primaryIndex; struct TRI_cap_constraint_s* _capConstraint; diff --git a/arangod/VocBase/synchroniser.c b/arangod/VocBase/synchroniser.c index 2865c8fb3e..ad9df79f0c 100644 --- a/arangod/VocBase/synchroniser.c +++ b/arangod/VocBase/synchroniser.c @@ -377,7 +377,7 @@ void TRI_SynchroniserVocBase (void* data) { // if we cannot acquire the read lock instantly, we will continue. // otherwise we'll risk a multi-thread deadlock between synchroniser, // compactor and data-modification threads (e.g. POST /_api/document) - if (! TRI_TRY_READ_LOCK_DATAFILES_DOC_COLLECTION(collection)) { + if (! TRI_TRY_READ_LOCK_STATUS_VOCBASE_COL(collection)) { continue; } From 3d6dfb60429b3200aaf3b057df41b9034ca4dbbd Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Mon, 17 Sep 2012 11:54:52 +0200 Subject: [PATCH 4/6] indentation --- arangod/VocBase/document-collection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arangod/VocBase/document-collection.c b/arangod/VocBase/document-collection.c index f8b4345aad..6195dfc2ed 100644 --- a/arangod/VocBase/document-collection.c +++ b/arangod/VocBase/document-collection.c @@ -2376,8 +2376,8 @@ static int UpdateImmediateIndexes (TRI_document_collection_t* collection, //////////////////////////////////////////////////////////////////////////////// static int DeleteImmediateIndexes (TRI_document_collection_t* collection, - TRI_doc_mptr_t const* header, - TRI_voc_tick_t deletion) { + TRI_doc_mptr_t const* header, + TRI_voc_tick_t deletion) { union { TRI_doc_mptr_t const* c; TRI_doc_mptr_t* v; } change; TRI_primary_collection_t* primary; TRI_df_marker_t const* marker; From b8cc79296b7e1730273ce8e1857c1742e913d3bd Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Mon, 17 Sep 2012 12:15:01 +0200 Subject: [PATCH 5/6] some simplification --- arangod/VocBase/document-collection.c | 77 +++++++++++++++++---------- 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/arangod/VocBase/document-collection.c b/arangod/VocBase/document-collection.c index 6195dfc2ed..a0137b0679 100644 --- a/arangod/VocBase/document-collection.c +++ b/arangod/VocBase/document-collection.c @@ -309,11 +309,14 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, bool release) { TRI_datafile_t* journal; + TRI_primary_collection_t* primary; TRI_doc_mptr_t* header; TRI_doc_mptr_t mptr; TRI_voc_size_t total; TRI_doc_datafile_info_t* dfi; int res; + + primary = &sim->base; // ............................................................................. // create header @@ -341,7 +344,7 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, if (journal == NULL) { if (release) { - sim->base.endWrite(&sim->base); + primary->endWrite(primary); } memset(&mptr, 0, sizeof(mptr)); @@ -369,10 +372,10 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, if (res == TRI_ERROR_NO_ERROR) { // fill the header - sim->base.createHeader(&sim->base, journal, *result, markerSize, header, 0); + primary->createHeader(primary, journal, *result, markerSize, header, 0); // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&sim->base, journal->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, journal->_fid); if (dfi != NULL) { dfi->_numberAlive += 1; dfi->_sizeAlive += TRI_LengthDataMasterPointer(header); @@ -388,7 +391,7 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, LOG_DEBUG("encountered index violation during create, deleting newly created document"); // rollback, ignore any additional errors - resRollback = DeleteShapedJson(&sim->base, header->_did, header->_rid, 0, TRI_DOC_UPDATE_LAST_WRITE, false); + resRollback = DeleteShapedJson(primary, header->_did, header->_rid, 0, TRI_DOC_UPDATE_LAST_WRITE, false); if (resRollback != TRI_ERROR_NO_ERROR) { LOG_ERROR("encountered error '%s' during rollback of create", TRI_last_error()); @@ -405,23 +408,23 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, mptr = *header; // check cap constraint - if (sim->base._capConstraint != NULL) { - while (sim->base._capConstraint->_size < sim->base._capConstraint->_array._array._nrUsed) { + if (primary->_capConstraint != NULL) { + while (primary->_capConstraint->_size < primary->_capConstraint->_array._array._nrUsed) { TRI_doc_mptr_t const* oldest; int remRes; - oldest = TRI_PopFrontLinkedArray(&sim->base._capConstraint->_array); + oldest = TRI_PopFrontLinkedArray(&primary->_capConstraint->_array); if (oldest == NULL) { LOG_WARNING("cap collection is empty, but collection '%ld' contains elements", - (unsigned long) sim->base.base._cid); + (unsigned long) primary->base._cid); break; } LOG_DEBUG("removing document '%lu' because of cap constraint", (unsigned long) oldest->_did); - remRes = DeleteShapedJson(&sim->base, oldest->_did, 0, NULL, TRI_DOC_UPDATE_LAST_WRITE, false); + remRes = DeleteShapedJson(primary, oldest->_did, 0, NULL, TRI_DOC_UPDATE_LAST_WRITE, false); if (remRes != TRI_ERROR_NO_ERROR) { LOG_WARNING("cannot cap collection: %s", TRI_last_error()); @@ -432,7 +435,7 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, // release lock, header might be invalid after this if (release) { - sim->base.endWrite(&sim->base); + primary->endWrite(primary); } // wait for sync @@ -443,7 +446,7 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, } else { if (release) { - sim->base.endWrite(&sim->base); + primary->endWrite(primary); } mptr._did = 0; @@ -453,7 +456,7 @@ static TRI_doc_mptr_t CreateDocument (TRI_document_collection_t* sim, } else { if (release) { - sim->base.endWrite(&sim->base); + primary->endWrite(primary); } LOG_ERROR("cannot write element: %s", TRI_last_error()); @@ -551,12 +554,15 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, bool release, bool allowRollback) { TRI_doc_mptr_t mptr; + TRI_primary_collection_t* primary; TRI_datafile_t* journal; TRI_df_marker_t const* originalMarker; TRI_doc_mptr_t resUpd; TRI_voc_size_t total; int res; + primary = &collection->base; + originalMarker = header->_data; // ............................................................................. @@ -572,7 +578,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, if (rid != 0) { if (rid != header->_rid) { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } TRI_set_errno(TRI_ERROR_ARANGO_CONFLICT); @@ -588,7 +594,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, case TRI_DOC_UPDATE_CONFLICT: if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } TRI_set_errno(TRI_ERROR_NOT_IMPLEMENTED); @@ -597,7 +603,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, case TRI_DOC_UPDATE_ILLEGAL: if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } TRI_set_errno(TRI_ERROR_INTERNAL); @@ -617,10 +623,10 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, journal = SelectJournal(collection, total, result); if (journal == NULL) { - collection->base.base._lastError = TRI_set_errno(TRI_ERROR_ARANGO_NO_JOURNAL); + primary->base._lastError = TRI_set_errno(TRI_ERROR_ARANGO_NO_JOURNAL); if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } mptr._did = 0; @@ -647,10 +653,10 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, TRI_doc_datafile_info_t* dfi; // update the header - collection->base.updateHeader(&collection->base, journal, *result, markerSize, header, &update); + primary->updateHeader(primary, journal, *result, markerSize, header, &update); // update the datafile info - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, header->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, header->_fid); if (dfi != NULL) { size_t length = TRI_LengthDataMasterPointer(header); @@ -661,7 +667,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, dfi->_sizeDead += length; } - dfi = TRI_FindDatafileInfoPrimaryCollection(&collection->base, journal->_fid); + dfi = TRI_FindDatafileInfoPrimaryCollection(primary, journal->_fid); if (dfi != NULL) { dfi->_numberAlive += 1; dfi->_sizeAlive += TRI_LengthDataMasterPointer(&update); @@ -692,7 +698,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, // release lock, header might be invalid after this if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } // wait for sync @@ -703,7 +709,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, } else { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } mptr._did = 0; @@ -713,7 +719,7 @@ static TRI_doc_mptr_t UpdateDocument (TRI_document_collection_t* collection, } else { if (release) { - collection->base.endWrite(&collection->base); + primary->endWrite(primary); } LOG_ERROR("cannot write element"); @@ -2219,7 +2225,11 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, // IN entry = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_edge_header_t), true); - /* TODO FIXME: memory allocation might fail */ + if (entry == NULL) { + // OOM + // TODO: do we have to release the header and remove the entry from the primaryIndex? + return TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY); + } entry->_mptr = header; entry->_direction = TRI_EDGE_IN; @@ -2230,7 +2240,11 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, // OUT entry = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_edge_header_t), true); - /* TODO FIXME: memory allocation might fail */ + if (entry == NULL) { + // OOM + // TODO: do we have to release the header and remove the entry from the primaryIndex? + return TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY); + } entry->_mptr = header; entry->_direction = TRI_EDGE_OUT; @@ -2241,7 +2255,11 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, // ANY entry = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_edge_header_t), true); - /* TODO FIXME: memory allocation might fail */ + if (entry == NULL) { + // OOM + // TODO: do we have to release the header and remove the entry from the primaryIndex? + return TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY); + } entry->_mptr = header; entry->_direction = TRI_EDGE_ANY; @@ -2252,7 +2270,11 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, if (edge->_toCid != edge->_fromCid || edge->_toDid != edge->_fromDid) { entry = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_edge_header_t), true); - /* TODO FIXME: memory allocation might fail */ + if (entry == NULL) { + // OOM + // TODO: do we have to release the header and remove the entry from the primaryIndex? + return TRI_set_errno(TRI_ERROR_OUT_OF_MEMORY); + } entry->_mptr = header; entry->_direction = TRI_EDGE_ANY; @@ -2280,6 +2302,7 @@ static int CreateImmediateIndexes (TRI_document_collection_t* sim, // in case of no-memory, return immediately if (res == TRI_ERROR_OUT_OF_MEMORY) { + // TODO: do we have to cleanup? return res; } From 3864f418563b5968ccf4319975bb5df0feaba3dc Mon Sep 17 00:00:00 2001 From: Heiko Kernbach Date: Mon, 17 Sep 2012 12:48:13 +0200 Subject: [PATCH 6/6] changed statistics design --- html/admin/css/layout.css | 2 +- html/admin/js/master.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/html/admin/css/layout.css b/html/admin/css/layout.css index 63e508bea1..2f700a9761 100644 --- a/html/admin/css/layout.css +++ b/html/admin/css/layout.css @@ -79,7 +79,7 @@ img.externalLink { .placeholderBox, .placeholderBoxSettings { margin-left: 7px; - margin-right: 7px; + margin-right: 20px; margin-top: 7px; margin-bottom: 20px; font-size: 0.8em; diff --git a/html/admin/js/master.js b/html/admin/js/master.js index d0258cba01..6b362f5d40 100644 --- a/html/admin/js/master.js +++ b/html/admin/js/master.js @@ -2531,6 +2531,7 @@ function drawConnections (placeholder, granularity) { }, xaxis: { mode: "time", + timeformat: "%h:%M", twelveHourClock: false }, //crosshair: { mode: "x" }, @@ -2617,7 +2618,7 @@ function drawRequests (placeholder, granularity) { arraySent.push([data.start[i]*1000,data.bytesSent.mean[i]]); arrayReceived.push([data.start[i]*1000,data.bytesReceived.mean[i]]); } - var stack = 0, bars = true, lines = true, steps = true; + var stack = 0, bars = false, lines = false, steps = false; var options = { legend: { show: true, @@ -2626,7 +2627,6 @@ function drawRequests (placeholder, granularity) { backgroundOpacity: 0.4 }, series: { - stack: stack, lines: { show: true, steps: false, fill: true, @@ -2636,6 +2636,7 @@ function drawRequests (placeholder, granularity) { }, xaxis: { mode: "time", + timeformat: "%h:%M", twelveHourClock: false }, //crosshair: { mode: "x" },