mirror of https://gitee.com/bigwinds/arangodb
sync last write of replication
This commit is contained in:
parent
bba497a76c
commit
ec9589b44c
|
@ -56,18 +56,6 @@
|
||||||
/// @{
|
/// @{
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief number of pre-allocated string buffers for logging
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define NUM_BUFFERS 8
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// @brief pre-allocated size for each log buffer
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 256
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief shortcut function
|
/// @brief shortcut function
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -111,6 +99,31 @@
|
||||||
/// @}
|
/// @}
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTION-- private variables
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @addtogroup VocBase
|
||||||
|
/// @{
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief number of pre-allocated string buffers for logging
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static size_t NumBuffers = 8;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief pre-allocated size for each log buffer
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static size_t BufferSize = 256;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @}
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- private types
|
// --SECTION-- private types
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -119,6 +132,10 @@
|
||||||
/// @addtogroup VocBase
|
/// @addtogroup VocBase
|
||||||
/// @{
|
/// @{
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief a datafile descriptor
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
TRI_datafile_t* _data;
|
TRI_datafile_t* _data;
|
||||||
|
@ -279,7 +296,7 @@ static void ReturnBuffer (TRI_replication_logger_t* logger,
|
||||||
|
|
||||||
// make the buffer usable again
|
// make the buffer usable again
|
||||||
if (buffer->_buffer == NULL) {
|
if (buffer->_buffer == NULL) {
|
||||||
TRI_InitSizedStringBuffer(buffer, TRI_CORE_MEM_ZONE, BUFFER_SIZE);
|
TRI_InitSizedStringBuffer(buffer, TRI_CORE_MEM_ZONE, BufferSize);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TRI_ResetStringBuffer(buffer);
|
TRI_ResetStringBuffer(buffer);
|
||||||
|
@ -290,7 +307,7 @@ static void ReturnBuffer (TRI_replication_logger_t* logger,
|
||||||
TRI_LockSpin(&logger->_bufferLock);
|
TRI_LockSpin(&logger->_bufferLock);
|
||||||
|
|
||||||
TRI_PushBackVectorPointer(&logger->_buffers, buffer);
|
TRI_PushBackVectorPointer(&logger->_buffers, buffer);
|
||||||
assert(logger->_buffers._length <= NUM_BUFFERS);
|
assert(logger->_buffers._length <= NumBuffers);
|
||||||
|
|
||||||
TRI_UnlockSpin(&logger->_bufferLock);
|
TRI_UnlockSpin(&logger->_bufferLock);
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
|
@ -304,7 +321,7 @@ static void ReturnBuffer (TRI_replication_logger_t* logger,
|
||||||
|
|
||||||
static int LogEvent (TRI_replication_logger_t* logger,
|
static int LogEvent (TRI_replication_logger_t* logger,
|
||||||
TRI_voc_tid_t tid,
|
TRI_voc_tid_t tid,
|
||||||
bool lock,
|
bool isStandaloneOperation,
|
||||||
TRI_replication_operation_e type,
|
TRI_replication_operation_e type,
|
||||||
TRI_string_buffer_t* buffer) {
|
TRI_string_buffer_t* buffer) {
|
||||||
TRI_primary_collection_t* primary;
|
TRI_primary_collection_t* primary;
|
||||||
|
@ -313,6 +330,7 @@ static int LogEvent (TRI_replication_logger_t* logger,
|
||||||
TRI_doc_mptr_t mptr;
|
TRI_doc_mptr_t mptr;
|
||||||
size_t len;
|
size_t len;
|
||||||
int res;
|
int res;
|
||||||
|
bool forceSync;
|
||||||
bool withTid;
|
bool withTid;
|
||||||
|
|
||||||
assert(logger != NULL);
|
assert(logger != NULL);
|
||||||
|
@ -327,7 +345,11 @@ static int LogEvent (TRI_replication_logger_t* logger,
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// do we have a transaction id?
|
||||||
withTid = (tid > 0);
|
withTid = (tid > 0);
|
||||||
|
|
||||||
|
// this type of operation will be synced. all other operations will not be synced.
|
||||||
|
forceSync = (type == REPLICATION_STOP);
|
||||||
|
|
||||||
// TODO: instead of using JSON here, we could directly use ShapedJson.
|
// TODO: instead of using JSON here, we could directly use ShapedJson.
|
||||||
// this will be a performance optimisation
|
// this will be a performance optimisation
|
||||||
|
@ -390,8 +412,8 @@ static int LogEvent (TRI_replication_logger_t* logger,
|
||||||
TRI_DOC_MARKER_KEY_DOCUMENT,
|
TRI_DOC_MARKER_KEY_DOCUMENT,
|
||||||
shaped,
|
shaped,
|
||||||
NULL,
|
NULL,
|
||||||
lock,
|
isStandaloneOperation,
|
||||||
false);
|
forceSync);
|
||||||
|
|
||||||
TRI_FreeShapedJson(primary->_shaper, shaped);
|
TRI_FreeShapedJson(primary->_shaper, shaped);
|
||||||
|
|
||||||
|
@ -1472,7 +1494,7 @@ static int StopReplicationLogger (TRI_replication_logger_t* logger) {
|
||||||
}
|
}
|
||||||
|
|
||||||
res = LogEvent(logger, 0, true, REPLICATION_STOP, buffer);
|
res = LogEvent(logger, 0, true, REPLICATION_STOP, buffer);
|
||||||
|
|
||||||
TRI_CommitTransaction(logger->_trx, 0);
|
TRI_CommitTransaction(logger->_trx, 0);
|
||||||
TRI_FreeTransaction(logger->_trx);
|
TRI_FreeTransaction(logger->_trx);
|
||||||
|
|
||||||
|
@ -1548,18 +1570,18 @@ static int InitBuffers (TRI_replication_logger_t* logger) {
|
||||||
size_t i;
|
size_t i;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
assert(NUM_BUFFERS > 0);
|
assert(NumBuffers > 0);
|
||||||
|
|
||||||
LOG_TRACE("initialising buffers");
|
LOG_TRACE("initialising buffers");
|
||||||
|
|
||||||
res = TRI_InitVectorPointer2(&logger->_buffers, TRI_CORE_MEM_ZONE, NUM_BUFFERS);
|
res = TRI_InitVectorPointer2(&logger->_buffers, TRI_CORE_MEM_ZONE, NumBuffers);
|
||||||
|
|
||||||
if (res != TRI_ERROR_NO_ERROR) {
|
if (res != TRI_ERROR_NO_ERROR) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < NUM_BUFFERS; ++i) {
|
for (i = 0; i < NumBuffers; ++i) {
|
||||||
TRI_string_buffer_t* buffer = TRI_CreateSizedStringBuffer(TRI_CORE_MEM_ZONE, BUFFER_SIZE);
|
TRI_string_buffer_t* buffer = TRI_CreateSizedStringBuffer(TRI_CORE_MEM_ZONE, BufferSize);
|
||||||
|
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
FreeBuffers(logger);
|
FreeBuffers(logger);
|
||||||
|
@ -1570,7 +1592,7 @@ static int InitBuffers (TRI_replication_logger_t* logger) {
|
||||||
TRI_PushBackVectorPointer(&logger->_buffers, buffer);
|
TRI_PushBackVectorPointer(&logger->_buffers, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(logger->_buffers._length == NUM_BUFFERS);
|
assert(logger->_buffers._length == NumBuffers);
|
||||||
|
|
||||||
return TRI_ERROR_NO_ERROR;
|
return TRI_ERROR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -1853,6 +1875,8 @@ int TRI_LogTransactionReplication (TRI_vocbase_t* vocbase,
|
||||||
|
|
||||||
primary = logger->_trxCollection->_collection->_collection;
|
primary = logger->_trxCollection->_collection->_collection;
|
||||||
|
|
||||||
|
assert(primary != NULL);
|
||||||
|
|
||||||
// set a lock around all individual operations
|
// set a lock around all individual operations
|
||||||
// so a transaction is logged as an uninterrupted sequence
|
// so a transaction is logged as an uninterrupted sequence
|
||||||
primary->beginWrite(primary);
|
primary->beginWrite(primary);
|
||||||
|
|
Loading…
Reference in New Issue