|
@@ -254,10 +254,16 @@ private:
|
|
CassStatement *statement;
|
|
CassStatement *statement;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+class LinkedSemaphore : public CInterfaceOf<IInterface>, public Semaphore
|
|
|
|
+{
|
|
|
|
+public:
|
|
|
|
+ LinkedSemaphore(unsigned initialCount) : Semaphore(initialCount) {}
|
|
|
|
+};
|
|
|
|
+
|
|
class CassandraRetryingFuture : public CInterface
|
|
class CassandraRetryingFuture : public CInterface
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
- CassandraRetryingFuture(CassSession *_session, CassStatement *_statement, Semaphore *_limiter = NULL, unsigned _retries = 10)
|
|
|
|
|
|
+ CassandraRetryingFuture(CassSession *_session, CassStatement *_statement, LinkedSemaphore *_limiter = NULL, unsigned _retries = 10)
|
|
: session(_session), statement(_statement), retries(_retries), limiter(_limiter), future(NULL)
|
|
: session(_session), statement(_statement), retries(_retries), limiter(_limiter), future(NULL)
|
|
{
|
|
{
|
|
execute();
|
|
execute();
|
|
@@ -300,8 +306,9 @@ private:
|
|
execute();
|
|
execute();
|
|
cass_future_wait(future);
|
|
cass_future_wait(future);
|
|
CassError rc = cass_future_error_code(future);
|
|
CassError rc = cass_future_error_code(future);
|
|
- if(rc == CASS_OK)
|
|
|
|
|
|
+ if (rc == CASS_OK)
|
|
return true;
|
|
return true;
|
|
|
|
+ Sleep(10);
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -311,20 +318,20 @@ private:
|
|
limiter->wait();
|
|
limiter->wait();
|
|
future = cass_session_execute(session, statement);
|
|
future = cass_session_execute(session, statement);
|
|
if (limiter)
|
|
if (limiter)
|
|
- cass_future_set_callback(future, signaller, this); // Note - this will call the callback if the future has already completed
|
|
|
|
|
|
+ cass_future_set_callback(future, signaller, LINK(limiter)); // Note - this will call the callback if the future has already completed
|
|
}
|
|
}
|
|
static void signaller(CassFuture *future, void *data)
|
|
static void signaller(CassFuture *future, void *data)
|
|
{
|
|
{
|
|
- CassandraRetryingFuture *self = (CassandraRetryingFuture *) data;
|
|
|
|
- if (self && self->limiter)
|
|
|
|
- self->limiter->signal();
|
|
|
|
|
|
+ LinkedSemaphore *sem = (LinkedSemaphore *) data;
|
|
|
|
+ sem->signal();
|
|
|
|
+ ::Release(sem);
|
|
}
|
|
}
|
|
CassandraRetryingFuture(const CassandraFuture &);
|
|
CassandraRetryingFuture(const CassandraFuture &);
|
|
CassFuture *future;
|
|
CassFuture *future;
|
|
CassSession *session;
|
|
CassSession *session;
|
|
CassandraStatement statement;
|
|
CassandraStatement statement;
|
|
unsigned retries;
|
|
unsigned retries;
|
|
- Semaphore *limiter;
|
|
|
|
|
|
+ LinkedSemaphore *limiter;
|
|
};
|
|
};
|
|
|
|
|
|
class CassandraPrepared : public CInterface
|
|
class CassandraPrepared : public CInterface
|
|
@@ -432,7 +439,7 @@ public:
|
|
{
|
|
{
|
|
stop();
|
|
stop();
|
|
futures.kill();
|
|
futures.kill();
|
|
- delete semaphore;
|
|
|
|
|
|
+ semaphore.clear(); // Note - may live on for a while until all futures associated with it have signalled.
|
|
}
|
|
}
|
|
inline void stop()
|
|
inline void stop()
|
|
{
|
|
{
|
|
@@ -468,8 +475,8 @@ public:
|
|
{
|
|
{
|
|
if (batchMode != (CassBatchType) -1)
|
|
if (batchMode != (CassBatchType) -1)
|
|
batch.setown(new CassandraBatch(cass_batch_new(batchMode)));
|
|
batch.setown(new CassandraBatch(cass_batch_new(batchMode)));
|
|
- else
|
|
|
|
- semaphore = new Semaphore(maxFutures ? maxFutures : 100);
|
|
|
|
|
|
+ else if (maxFutures)
|
|
|
|
+ semaphore.setown(new LinkedSemaphore(maxFutures));
|
|
statement.setown(new CassandraStatement(cass_prepared_bind(*prepared)));
|
|
statement.setown(new CassandraStatement(cass_prepared_bind(*prepared)));
|
|
inBatch = true;
|
|
inBatch = true;
|
|
}
|
|
}
|
|
@@ -532,7 +539,7 @@ protected:
|
|
Owned<CassandraFutureResult> result;
|
|
Owned<CassandraFutureResult> result;
|
|
Owned<CassandraIterator> iterator;
|
|
Owned<CassandraIterator> iterator;
|
|
CIArrayOf<CassandraRetryingFuture> futures;
|
|
CIArrayOf<CassandraRetryingFuture> futures;
|
|
- Semaphore *semaphore;
|
|
|
|
|
|
+ Owned<LinkedSemaphore> semaphore;
|
|
unsigned numBindings;
|
|
unsigned numBindings;
|
|
unsigned maxFutures;
|
|
unsigned maxFutures;
|
|
unsigned maxRetries;
|
|
unsigned maxRetries;
|