54
54
#include < velocypack/velocypack-aliases.h>
55
55
56
56
namespace {
57
- arangodb::Result writeCounterValue (
58
- std::unordered_map<uint64_t , rocksdb::SequenceNumber>& syncedSeqNums,
59
- rocksdb::Transaction* rtrx, VPackBuilder& b,
60
- std::pair<uint64_t , arangodb::RocksDBSettingsManager::CMValue> const &
61
- pair ) {
57
+ std::pair< arangodb::Result, rocksdb::SequenceNumber>
58
+ writeCounterValue ( std::unordered_map<uint64_t , rocksdb::SequenceNumber> const & syncedSeqNums,
59
+ rocksdb::Transaction* rtrx, VPackBuilder& b,
60
+ std::pair<uint64_t , arangodb::RocksDBSettingsManager::CMValue> const & pair,
61
+ rocksdb::SequenceNumber baseSeq ) {
62
62
using arangodb::Logger;
63
63
using arangodb::Result;
64
64
using arangodb::RocksDBColumnFamily;
65
65
using arangodb::RocksDBKey;
66
66
using arangodb::rocksutils::convertStatus;
67
67
68
+ rocksdb::SequenceNumber returnSeq = baseSeq;
69
+
68
70
// Skip values which we did not change
69
71
auto const & it = syncedSeqNums.find (pair.first );
70
-
71
72
if (it != syncedSeqNums.end () && it->second == pair.second ._sequenceNum ) {
72
- return Result ();
73
+ // implication: no-one update the collection since the last sync,
74
+ // we do not need to keep the log entries for this counter
75
+ return std::make_pair (Result (), returnSeq);
73
76
}
74
-
77
+
75
78
b.clear ();
76
79
pair.second .serialize (b);
77
80
@@ -81,14 +84,14 @@ arangodb::Result writeCounterValue(
81
84
rocksdb::Status s =
82
85
rtrx->Put (RocksDBColumnFamily::definitions (), key.string (), value);
83
86
if (!s.ok ()) {
84
- rtrx->Rollback ();
85
- auto rStatus = convertStatus (s);
86
87
LOG_TOPIC (WARN, Logger::ENGINES)
87
- << " writing counters failed: " << rStatus.errorMessage ();
88
- return rStatus;
88
+ << " writing counter for collection with objectId '" << pair.first << " ' failed: "
89
+ << s.ToString ();
90
+ return std::make_pair (convertStatus (s), returnSeq);
89
91
}
90
92
91
- return Result ();
93
+ returnSeq = std::min (returnSeq, pair.second ._sequenceNum );
94
+ return std::make_pair (Result (), returnSeq);
92
95
}
93
96
} // namespace
94
97
@@ -124,11 +127,8 @@ arangodb::Result writeSettings(rocksdb::Transaction* rtrx, VPackBuilder& b,
124
127
rtrx->Put (RocksDBColumnFamily::definitions (), key.string (), value);
125
128
126
129
if (!s.ok ()) {
127
- auto rStatus = arangodb::rocksutils::convertStatus (s);
128
- LOG_TOPIC (WARN, Logger::ENGINES)
129
- << " writing settings failed: " << rStatus.errorMessage ();
130
- rtrx->Rollback ();
131
- return rStatus;
130
+ LOG_TOPIC (WARN, Logger::ENGINES) << " writing settings failed: " << s.ToString ();
131
+ return arangodb::rocksutils::convertStatus (s);
132
132
}
133
133
134
134
return Result ();
@@ -455,17 +455,22 @@ Result RocksDBSettingsManager::sync(bool force) {
455
455
_builder.clear ();
456
456
457
457
for (std::pair<uint64_t , CMValue> const & pair : copy) {
458
- Result res = writeCounterValue (_syncedSeqNums, rtrx.get (), _builder, pair);
458
+ Result res;
459
+ rocksdb::SequenceNumber returnSeq;
460
+
461
+ std::tie (res, returnSeq) = writeCounterValue (_syncedSeqNums, rtrx.get (),
462
+ _builder, pair, seqNumber);
459
463
if (res.fail ()) {
460
464
return res;
461
465
}
466
+ seqNumber = std::min (seqNumber, returnSeq);
462
467
463
- auto writeResult =
468
+ std::tie (res, returnSeq) =
464
469
writeIndexEstimatorsAndKeyGenerator (rtrx.get (), pair, seqNumber);
465
- if (writeResult. first .fail ()) {
466
- return writeResult. first ;
470
+ if (res .fail ()) {
471
+ return res ;
467
472
}
468
- seqNumber = std::min (seqNumber, writeResult. second );
473
+ seqNumber = std::min (seqNumber, returnSeq );
469
474
}
470
475
471
476
Result res = writeSettings (rtrx.get (), _builder, seqNumber);
0 commit comments