Skip to content

Commit

Permalink
CCBC-1406: fill in prepared statement handle on retry
Browse files Browse the repository at this point in the history
Change-Id: I351254f9d08ac56a7e07c4fd9a42454d98908fbe
Reviewed-on: http://review.couchbase.org/c/libcouchbase/+/154636
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Brett Lawson <brett19@gmail.com>
  • Loading branch information
avsej committed May 28, 2021
1 parent 752d765 commit c485d65
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
10 changes: 10 additions & 0 deletions src/n1ql/n1ql.cc
Expand Up @@ -336,6 +336,16 @@ typedef struct lcb_QUERY_HANDLE_ : lcb::jsparse::Parser::Actions {
btimer.cancel();
delete parser;
parser = new lcb::jsparse::Parser(lcb::jsparse::Parser::MODE_N1QL, this);
if (use_prepcache()) {
const Plan *cached = cache().get_entry(statement);
if (cached != nullptr) {
lasterr = apply_plan(*cached);
} else {
lcb_log(LOGARGS(this, DEBUG), LOGFMT "No cached plan found. Issuing prepare", LOGID(this));
lasterr = request_plan();
}
return;
}
lasterr = issue_htreq();
}
lcb::io::Timer<lcb_QUERY_HANDLE_, &lcb_QUERY_HANDLE_::on_backoff> btimer;
Expand Down
6 changes: 4 additions & 2 deletions tests/iotests/t_n1ql.cc
Expand Up @@ -445,6 +445,7 @@ TEST_F(QueryUnitTest, testCollectionQuery)
lcb_cmdquery_create(&cmd);
string query = "SELECT * FROM `" + collection + "` where meta().id=\"" + id + "\"";
lcb_cmdquery_statement(cmd, query.c_str(), query.size());
lcb_cmdquery_consistency(cmd, LCB_QUERY_CONSISTENCY_REQUEST);
lcb_cmdquery_callback(cmd, rowcb);
lcb_cmdquery_scope_name(cmd, scope.c_str(), scope.size());

Expand All @@ -455,6 +456,7 @@ TEST_F(QueryUnitTest, testCollectionQuery)
ASSERT_TRUE(handle != nullptr);
lcb_wait(instance, LCB_WAIT_DEFAULT);
ASSERT_TRUE(res.called);
ASSERT_EQ(LCB_SUCCESS, res.rc);
ASSERT_EQ(1, res.rows.size());
}

Expand Down Expand Up @@ -652,7 +654,7 @@ TEST_F(QueryUnitTest, testRetryOnAuthenticationFailure)
SKIP_IF_MOCK()
SKIP_IF_CLUSTER_VERSION_IS_LOWER_THAN(MockEnvironment::VERSION_50)
createConnection(hw, &instance);
lcb_cntl_setu32(instance, LCB_CNTL_QUERY_TIMEOUT, LCB_MS2US(100)); // 100ms before timeout
lcb_cntl_setu32(instance, LCB_CNTL_QUERY_TIMEOUT, LCB_MS2US(200)); // 200ms before timeout

string valid_username = MockEnvironment::getInstance()->getUsername();
string valid_password = MockEnvironment::getInstance()->getPassword();
Expand Down Expand Up @@ -757,7 +759,7 @@ TEST_F(QueryUnitTest, testRetryOnAuthenticationFailure)
ASSERT_EQ(LCB_SUCCESS, rc);
lcb_wait(instance, LCB_WAIT_DEFAULT);
ASSERT_TRUE(res.called);
ASSERT_EQ(LCB_ERR_TIMEOUT, res.rc); // timeout because of retrying
ASSERT_EQ(LCB_ERR_TIMEOUT, res.rc) << lcb_strerror_short(res.rc); // timeout because of retrying
}

// send query with valid password
Expand Down

0 comments on commit c485d65

Please sign in to comment.