diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-10-12 20:29:41 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-10-12 20:29:41 +0200 |
commit | 28417962f66859828ffc366cdd8c0974dbb6fbe2 (patch) | |
tree | 2b3d138091fa5e169fddf35afa0a1927769554f3 /searchcore | |
parent | 4130c7302a59f3cea0845fb1825600cc1549bc4a (diff) |
Avoid using 2 different mechanisms for allowing a only one reply.
Diffstat (limited to 'searchcore')
6 files changed, 14 insertions, 19 deletions
diff --git a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp index 30c0556e812..b0b06a238c9 100644 --- a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp +++ b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp @@ -580,8 +580,7 @@ TEST_F("require that remove of unknown document with known data type stores remo EXPECT_EQUAL(1, f.tls_writer.store_count); } -TEST_F("require that partial update for non-existing document is tagged as such", - FeedHandlerFixture) +TEST_F("require that partial update for non-existing document is tagged as such", FeedHandlerFixture) { UpdateContext upCtx("id:test:searchdocument::foo", *f.schema.builder); FeedOperation::UP op(new UpdateOperation(upCtx.bucketId, Timestamp(10), upCtx.update)); @@ -596,8 +595,7 @@ TEST_F("require that partial update for non-existing document is tagged as such" EXPECT_EQUAL(0, f.tls_writer.store_count); } -TEST_F("require that partial update for non-existing document is created if specified", - FeedHandlerFixture) +TEST_F("require that partial update for non-existing document is created if specified", FeedHandlerFixture) { f.handler.setSerialNum(15); UpdateContext upCtx("id:test:searchdocument::foo", *f.schema.builder); diff --git a/searchcore/src/tests/proton/feedtoken/feedtoken.cpp b/searchcore/src/tests/proton/feedtoken/feedtoken.cpp index 301f21d04a1..530c9ebef39 100644 --- a/searchcore/src/tests/proton/feedtoken/feedtoken.cpp +++ b/searchcore/src/tests/proton/feedtoken/feedtoken.cpp @@ -55,7 +55,7 @@ Test::testFail() { LocalTransport transport; FeedToken token(transport); - token.fail(69, "6699"); + token.fail(); EXPECT_EQUAL(1u, transport.getReceivedCount()); } diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp index 0a4f00ef6e0..008fafa332b 100644 --- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp +++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp @@ -13,8 +13,7 @@ FeedToken::State::State(ITransport & transport, uint32_t numAcksRequired) : _transport(transport), _result(new storage::spi::Result()), _documentWasFound(false), - _unAckedCount(numAcksRequired), - _lock() + _unAckedCount(numAcksRequired) { assert(_unAckedCount > 0); } @@ -43,11 +42,12 @@ FeedToken::State::incNeededAcks() } void -FeedToken::State::fail(uint32_t, const vespalib::string &) +FeedToken::State::fail() { - _unAckedCount = 0; - vespalib::LockGuard guard(_lock); - _transport.send(std::move(_result), _documentWasFound); + uint32_t prev = _unAckedCount.exchange(0); + if (prev > 0) { + _transport.send(std::move(_result), _documentWasFound); + } } } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h index 8f6b315f803..856c8a22652 100644 --- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h +++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h @@ -32,7 +32,7 @@ private: ~State(); void incNeededAcks(); void ack(); - void fail(uint32_t errNum, const vespalib::string &errMsg); + void fail(); void setResult(ResultUP result, bool documentWasFound) { _documentWasFound = documentWasFound; _result = std::move(result); @@ -43,7 +43,6 @@ private: ResultUP _result; bool _documentWasFound; std::atomic<uint32_t> _unAckedCount; - vespalib::Lock _lock; }; std::shared_ptr<State> _state; @@ -86,7 +85,7 @@ public: * @param errNum A numerical representation of the error. * @param errMsg A readable string detailing the error. */ - void fail(uint32_t errNum, const vespalib::string &errMsg) const { _state->fail(errNum, errMsg); } + void fail() const { _state->fail(); } /** * Gives you access to the underlying result. diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp index 16813d1b56c..e0d512ae6e0 100644 --- a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp +++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp @@ -20,7 +20,7 @@ TransportLatch::send(ResultUP result, bool documentWasFound) { { vespalib::LockGuard guard(_lock); - if (!_result.get()) { + if (!_result) { _result = std::move(result); } else if (result->hasError()) { _result.reset(new Result(mergeErrorResults(*_result, *result))); @@ -35,9 +35,7 @@ Result TransportLatch::mergeErrorResults(const Result &lhs, const Result &rhs) { Result::ErrorType error = (lhs.getErrorCode() > rhs.getErrorCode() ? lhs : rhs).getErrorCode(); - return Result(error, vespalib::make_string("%s, %s", - lhs.getErrorMessage().c_str(), - rhs.getErrorMessage().c_str())); + return Result(error, vespalib::make_string("%s, %s", lhs.getErrorMessage().c_str(), rhs.getErrorMessage().c_str())); } } // proton diff --git a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp index 7aeaea1d1a7..9300af5c3f0 100644 --- a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp @@ -473,7 +473,7 @@ void feedOperationRejected(FeedToken *token, const vespalib::string &opType, con auto message = make_string("%s operation rejected for document '%s' of type '%s': '%s'", opType.c_str(), docId.c_str(), docTypeName.toString().c_str(), rejectMessage.c_str()); token->setResult(ResultUP(new ResultType(Result::RESOURCE_EXHAUSTED, message)), false); - token->fail(documentapi::DocumentProtocol::ERROR_REJECTED, message); + token->fail(); } } |