Skip to content

Commit 2134463

Browse files
committed
Finished retry policy added error result type
1 parent 3064aae commit 2134463

22 files changed

+705
-95
lines changed

include/cassandra.h

Lines changed: 308 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,13 @@ typedef struct CassPrepared_ CassPrepared;
251251
*/
252252
typedef struct CassResult_ CassResult;
253253

254+
/**
255+
* @struct CassErrorResult
256+
*
257+
* A error result of a request
258+
*/
259+
typedef struct CassErrorResult_ CassErrorResult;
260+
254261
/**
255262
* @struct CassIterator
256263
*
@@ -338,6 +345,11 @@ typedef struct CassSchemaMetaField_ CassSchemaMetaField;
338345
*/
339346
typedef struct CassUuidGen_ CassUuidGen;
340347

348+
/**
349+
* @struct CassRetryPolicy
350+
*/
351+
typedef struct CassRetryPolicy_ CassRetryPolicy;
352+
341353
/**
342354
* @struct CassMetrics
343355
*
@@ -391,6 +403,38 @@ typedef enum CassConsistency_ {
391403
CASS_CONSISTENCY_LOCAL_ONE = 0x000A
392404
} CassConsistency;
393405

406+
#define CASS_CONSISTENCY_MAP(XX) \
407+
XX(CASS_CONSISTENCY_UNKNOWN, "UNKNOWN") \
408+
XX(CASS_CONSISTENCY_ANY, "ANY") \
409+
XX(CASS_CONSISTENCY_ONE, "ONE") \
410+
XX(CASS_CONSISTENCY_TWO, "TWO") \
411+
XX(CASS_CONSISTENCY_THREE, "THREE") \
412+
XX(CASS_CONSISTENCY_QUORUM, "QUORUM") \
413+
XX(CASS_CONSISTENCY_ALL, "ALL") \
414+
XX(CASS_CONSISTENCY_LOCAL_QUORUM, "LOCAL_QUORUM") \
415+
XX(CASS_CONSISTENCY_EACH_QUORUM, "EACH_QUORUM") \
416+
XX(CASS_CONSISTENCY_SERIAL, "SERIAL") \
417+
XX(CASS_CONSISTENCY_LOCAL_SERIAL, "LOCAL_SERIAL") \
418+
XX(CASS_CONSISTENCY_LOCAL_ONE, "LOCAL_ONE")
419+
420+
typedef enum CassWriteType_ {
421+
CASS_WRITE_TYPE_UKNOWN,
422+
CASS_WRITE_TYPE_SIMPLE,
423+
CASS_WRITE_TYPE_BATCH,
424+
CASS_WRITE_TYPE_UNLOGGED_BATCH,
425+
CASS_WRITE_TYPE_COUNTER,
426+
CASS_WRITE_TYPE_BATCH_LOG,
427+
CASS_WRITE_TYPE_CAS
428+
} CassWriteType;
429+
430+
#define CASS_WRITE_TYPE_MAP(XX) \
431+
XX(CASS_WRITE_TYPE_SIMPLE, "SIMPLE") \
432+
XX(CASS_WRITE_TYPE_BATCH, "BATCH") \
433+
XX(CASS_WRITE_TYPE_UNLOGGED_BATCH, "UNLOGGED_BATCH") \
434+
XX(CASS_WRITE_TYPE_COUNTER, "COUNTER") \
435+
XX(CASS_WRITE_TYPE_BATCH_LOG, "BATCH_LOG") \
436+
XX(CASS_WRITE_TYPE_CAS, "CAS")
437+
394438
typedef enum CassValueType_ {
395439
CASS_VALUE_TYPE_UNKNOWN = 0xFFFF,
396440
CASS_VALUE_TYPE_CUSTOM = 0x0000,
@@ -468,9 +512,9 @@ typedef enum CassLogLevel_ {
468512
} CassLogLevel;
469513

470514
typedef enum CassSslVerifyFlags {
471-
CASS_SSL_VERIFY_NONE = 0,
472-
CASS_SSL_VERIFY_PEER_CERT = 1,
473-
CASS_SSL_VERIFY_PEER_IDENTITY = 2
515+
CASS_SSL_VERIFY_NONE,
516+
CASS_SSL_VERIFY_PEER_CERT,
517+
CASS_SSL_VERIFY_PEER_IDENTITY
474518
} CassSslVerifyFlags;
475519

476520
typedef enum CassErrorSource_ {
@@ -1156,6 +1200,23 @@ cass_cluster_set_tcp_keepalive(CassCluster* cluster,
11561200
cass_bool_t enabled,
11571201
unsigned delay_secs);
11581202

1203+
/**
1204+
* Sets the retry policy used for all requests unless overridden by setting
1205+
* a retry policy on a statement.
1206+
*
1207+
* <b>Default:</b> default retry policy.
1208+
*
1209+
* @public @memberof CassCluster
1210+
*
1211+
* @param[in] cluster
1212+
* @param[in] retry_policy
1213+
*
1214+
* @see cass_statement_set_retry_policy()
1215+
*/
1216+
CASS_EXPORT void
1217+
cass_cluster_set_retry_policy(CassCluster* cluster,
1218+
CassRetryPolicy* retry_policy);
1219+
11591220
/***********************************************************************************
11601221
*
11611222
* Session
@@ -1776,6 +1837,23 @@ cass_future_wait_timed(CassFuture* future,
17761837
CASS_EXPORT const CassResult*
17771838
cass_future_get_result(CassFuture* future);
17781839

1840+
/**
1841+
* Gets the error result from a future that failed as a result of a server error. If the
1842+
* future is not ready this method will wait for the future to be set. The first
1843+
* successful call consumes the future, all subsequent calls will return NULL.
1844+
*
1845+
* @public @memberof CassFuture
1846+
*
1847+
* @param[in] future
1848+
* @return CassErrorResult instance if the request failed with a server error,
1849+
* otherwise NULL if the request was sucessful or the failure was not caused by
1850+
* a server error. The return instance must be freed using cass_error_result_free().
1851+
*
1852+
* @see cass_session_execute() and cass_session_execute_batch()
1853+
*/
1854+
CASS_EXPORT const CassErrorResult*
1855+
cass_future_get_error_result(CassFuture* future);
1856+
17791857
/**
17801858
* Gets the result of a successful future. If the future is not ready this method will
17811859
* wait for the future to be set. The first successful call consumes the future, all
@@ -1987,6 +2065,19 @@ CASS_EXPORT CassError
19872065
cass_statement_set_paging_state(CassStatement* statement,
19882066
const CassResult* result);
19892067

2068+
/**
2069+
* Sets the statement's retry policy.
2070+
*
2071+
* @public @memberof CassStatement
2072+
*
2073+
* @param[in] statement
2074+
* @param[in] retry_policy
2075+
* @return CASS_OK if successful, otherwise an error occurred.
2076+
*/
2077+
CASS_EXPORT CassError
2078+
cass_statement_set_retry_policy(CassStatement* statement,
2079+
CassRetryPolicy* retry_policy);
2080+
19902081
/**
19912082
* Binds null to a query or bound statement at the specified index.
19922083
*
@@ -4719,6 +4810,122 @@ cass_result_first_row(const CassResult* result);
47194810
CASS_EXPORT cass_bool_t
47204811
cass_result_has_more_pages(const CassResult* result);
47214812

4813+
/***********************************************************************************
4814+
*
4815+
* Error result
4816+
*
4817+
***********************************************************************************/
4818+
4819+
/**
4820+
* Frees an error result instance.
4821+
*
4822+
* @public @memberof CassErrorResult
4823+
*
4824+
* @param[in] result
4825+
*/
4826+
CASS_EXPORT void
4827+
cass_error_result_free(const CassErrorResult* error_result);
4828+
4829+
/**
4830+
* Gets error code for the error result. This error code will always
4831+
* have an server error source.
4832+
*
4833+
* @public @memberof CassErrorResult
4834+
*
4835+
* @param[in] error_result
4836+
* @return The server error code
4837+
*/
4838+
CASS_EXPORT CassError
4839+
cass_error_result_code(const CassErrorResult* error_result);
4840+
4841+
/**
4842+
* Gets consistency that triggered the error result of the
4843+
* following types:
4844+
*
4845+
* <ul>
4846+
* <li>CASS_ERROR_SERVER_READ_TIMEOUT</li>
4847+
* <li>CASS_ERROR_SERVER_WRITE_TIMEOUT</li>
4848+
* <li>CASS_ERROR_SERVER_UNAVAILABLE</li>
4849+
* </ul>
4850+
*
4851+
* @public @memberof CassErrorResult
4852+
*
4853+
* @param[in] error_result
4854+
* @return The consistency that triggered the error for a read timeout,
4855+
* write timeout or an unavailable error result. Undefined for other
4856+
* error result types.
4857+
*/
4858+
CASS_EXPORT CassConsistency
4859+
cass_error_result_consistency(const CassErrorResult* error_result);
4860+
4861+
/**
4862+
* Gets the acutal number of recieved responses, recieved acknowlegements
4863+
* or alive nodes for following error result types, respectively:
4864+
*
4865+
* <ul>
4866+
* <li>CASS_ERROR_SERVER_READ_TIMEOUT</li>
4867+
* <li>CASS_ERROR_SERVER_WRITE_TIMEOUT</li>
4868+
* <li>CASS_ERROR_SERVER_UNAVAILABLE</li>
4869+
* </ul>
4870+
*
4871+
* @public @memberof CassErrorResult
4872+
*
4873+
* @param[in] error_result
4874+
* @return The actual received responses for a read timeout, actual recieved
4875+
* acknowlegements for a write timeout or actual alive nodes for a unavailable
4876+
* error. Undefined for other error result types.
4877+
*/
4878+
CASS_EXPORT cass_int32_t
4879+
cass_error_result_actual(const CassErrorResult* error_result);
4880+
4881+
/**
4882+
* Gets required responses, required acknowlegements or required alive nodes
4883+
* needed to successfully complete the request for following error result types,
4884+
* respectively:
4885+
*
4886+
* <ul>
4887+
* <li>CASS_ERROR_SERVER_READ_TIMEOUT</li>
4888+
* <li>CASS_ERROR_SERVER_WRITE_TIMEOUT</li>
4889+
* <li>CASS_ERROR_SERVER_UNAVAILABLE</li>
4890+
* </ul>
4891+
*
4892+
* @public @memberof CassErrorResult
4893+
*
4894+
* @param[in] error_result
4895+
* @return The required responses for a read time, required acknowlegements
4896+
* for a write timeout or required alive nodes for an unavailable error result.
4897+
* Undefined for other error result types.
4898+
*/
4899+
CASS_EXPORT cass_int32_t
4900+
cass_error_result_required(const CassErrorResult* error_result);
4901+
4902+
4903+
/**
4904+
* Gets if the data was actually present in the responses from the replicas when
4905+
* the read timed out (CASS_ERROR_SERVER_READ_TIMEOUT).
4906+
*
4907+
* @public @memberof CassErrorResult
4908+
*
4909+
* @param[in] error_result
4910+
* @return cass_true if the data was present in the recieved responses when the
4911+
* read timeout occured. Undefined for other error result types.
4912+
*/
4913+
CASS_EXPORT cass_bool_t
4914+
cass_error_result_data_present(const CassErrorResult* error_result);
4915+
4916+
/**
4917+
* Gets the write type of a request when the write timed out
4918+
* (CASS_ERROR_SERVER_WRITE_TIMEOUT).
4919+
*
4920+
* @public @memberof CassErrorResult
4921+
*
4922+
* @param[in] error_result
4923+
* @return The type of the write that timed out. Undefined for
4924+
* other error result types.
4925+
*/
4926+
CASS_EXPORT CassWriteType
4927+
cass_error_result_write_type(const CassErrorResult* error_result);
4928+
47224929
/***********************************************************************************
47234930
*
47244931
* Iterator
@@ -5489,6 +5696,104 @@ cass_uuid_from_string_n(const char* str,
54895696
size_t str_length,
54905697
CassUuid* output);
54915698

5699+
5700+
/***********************************************************************************
5701+
*
5702+
* Retry policies
5703+
*
5704+
***********************************************************************************/
5705+
5706+
/**
5707+
* Creates a new default retry policy.
5708+
*
5709+
* @public @memberof CassRetryPolicy
5710+
*
5711+
* @return Returns a retry policy that must be freed.
5712+
*
5713+
* @see cass_retry_policy_free()
5714+
*/
5715+
CASS_EXPORT CassRetryPolicy*
5716+
cass_default_retry_policy_new();
5717+
5718+
/**
5719+
* Creates a new downgrading consistency retry policy.
5720+
*
5721+
* @public @memberof CassRetryPolicy
5722+
*
5723+
* @return Returns a retry policy that must be freed.
5724+
*
5725+
* @see cass_retry_policy_free()
5726+
*/
5727+
CASS_EXPORT CassRetryPolicy*
5728+
cass_downgrading_consistency_retry_policy_new();
5729+
5730+
/**
5731+
* Creates a new fallthrough retry policy.
5732+
*
5733+
* @public @memberof CassRetryPolicy
5734+
*
5735+
* @return Returns a retry policy that must be freed.
5736+
*
5737+
* @see cass_retry_policy_free()
5738+
*/
5739+
CASS_EXPORT CassRetryPolicy*
5740+
cass_fallthrough_retry_policy_new();
5741+
5742+
/**
5743+
* Creates a new logging retry policy.
5744+
*
5745+
* @public @memberof CassRetryPolicy
5746+
*
5747+
* @param[in] child_retry_policy
5748+
* @return Returns a retry policy that must be freed. NULL is returned if
5749+
* the child_policy is a logging retry policy.
5750+
*
5751+
* @see cass_retry_policy_free()
5752+
*/
5753+
CASS_EXPORT CassRetryPolicy*
5754+
cass_logging_retry_policy(CassRetryPolicy* child_retry_policy);
5755+
5756+
/**
5757+
* Frees a retry policy instance.
5758+
*
5759+
* @public @memberof CassRetryPolicy
5760+
*
5761+
* @param[in] policy
5762+
*/
5763+
CASS_EXPORT void
5764+
cass_retry_policy_free(CassRetryPolicy* policy);
5765+
5766+
/***********************************************************************************
5767+
*
5768+
* Consistency
5769+
*
5770+
***********************************************************************************/
5771+
5772+
/**
5773+
* Gets the string for a consistency.
5774+
*
5775+
* @param[in] consistency
5776+
* @return A null-terminated string for the consistency.
5777+
* Example: "ALL", "ONE", "QUORUM", etc.
5778+
*/
5779+
CASS_EXPORT const char*
5780+
cass_consistency_string(CassConsistency consistency);
5781+
5782+
/***********************************************************************************
5783+
*
5784+
* Write type
5785+
*
5786+
***********************************************************************************/
5787+
/**
5788+
* Gets the string for a write type.
5789+
*
5790+
* @param[in] write_type
5791+
* @return A null-terminated string for the write type.
5792+
* Example: "BATCH", "SIMPLE", "COUNTER", etc.
5793+
*/
5794+
CASS_EXPORT const char*
5795+
cass_write_type_string(CassWriteType write_type);
5796+
54925797
/***********************************************************************************
54935798
*
54945799
* Error

src/cluster.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,11 @@ void cass_cluster_set_tcp_keepalive(CassCluster* cluster,
295295
cluster->config().set_tcp_keepalive(enabled == cass_true, delay_secs);
296296
}
297297

298+
void cass_cluster_set_retry_policy(CassCluster* cluster,
299+
CassRetryPolicy* retry_policy) {
300+
cluster->config().set_retry_policy(retry_policy);
301+
}
302+
298303
void cass_cluster_free(CassCluster* cluster) {
299304
delete cluster->from();
300305
}

src/connection.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,12 @@ void Connection::PendingWriteBase::on_write(uv_write_t* req, int status) {
821821
handler->dec_ref();
822822
break;
823823

824+
case Handler::REQUEST_STATE_RETRY_WRITE_OUTSTANDING:
825+
handler->stop_timer();
826+
handler->retry();
827+
handler->dec_ref();
828+
break;
829+
824830
default:
825831
assert(false && "Invalid request state after write finished");
826832
break;

0 commit comments

Comments
 (0)