Skip to content

Commit 80c0854

Browse files
committed
Fix bubble up of NotEnoughFreeTasks error
1 parent c39d7a7 commit 80c0854

File tree

5 files changed

+40
-4
lines changed

5 files changed

+40
-4
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

solana-programs/programs/tuktuk/src/instructions/queue_task_v0.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ pub struct QueueTaskV0<'info> {
5151
}
5252

5353
pub fn handler(ctx: Context<QueueTaskV0>, args: QueueTaskArgsV0) -> Result<()> {
54+
require_gte!(
55+
ctx.accounts.task_queue.capacity,
56+
args.free_tasks + 1,
57+
ErrorCode::FreeTasksGreaterThanCapacity
58+
);
5459
require_gte!(
5560
40,
5661
args.description.len(),

tuktuk-crank-turner/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "tuktuk-crank-turner"
3-
version = "0.2.20"
3+
version = "0.2.21"
44
authors.workspace = true
55
edition.workspace = true
66
license.workspace = true

tuktuk-crank-turner/src/task_processor.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,35 @@ impl TimedTask {
122122
.get_lookup_tables(task_queue.lookup_tables)
123123
.await
124124
.map_err(|_| anyhow::anyhow!("lookup tables channel closed"))?;
125-
let next_available = self.get_available_task_ids(ctx.clone()).await?;
125+
let maybe_next_available = self.get_available_task_ids(ctx.clone()).await;
126+
let next_available = match maybe_next_available {
127+
Ok(next_available) => next_available,
128+
Err(err) => {
129+
info!(
130+
?err,
131+
?self.task_queue_name,
132+
?self.task_key,
133+
"failed to get available task ids, requeuing task"
134+
);
135+
let now = *ctx.now_rx.borrow();
136+
let base_delay = 30 * (1 << self.total_retries);
137+
let jitter = rand::random_range(0..60); // Jitter up to 1 minute to prevent conflicts with other turners
138+
let retry_delay = base_delay + jitter;
139+
ctx.task_queue
140+
.add_task(TimedTask {
141+
task: self.task.clone(),
142+
total_retries: self.total_retries + 1,
143+
in_flight_task_ids: vec![],
144+
profitability_delayed: self.profitability_delayed,
145+
// Try again in 10-30 seconds
146+
task_time: now + retry_delay,
147+
..self.clone()
148+
})
149+
.await?;
150+
151+
return Ok(());
152+
}
153+
};
126154
self.in_flight_task_ids = next_available.clone();
127155

128156
let maybe_run_ix = if let Some(cached_result) = self.cached_result.clone() {
@@ -219,14 +247,15 @@ impl TimedTask {
219247
match err {
220248
TransactionQueueError::FeeTooHigh => {
221249
info!(?self.task_key, ?err, "task fee too high");
250+
let now = *ctx.now_rx.borrow();
222251
ctx.task_queue
223252
.add_task(TimedTask {
224253
task: self.task.clone(),
225254
total_retries: self.total_retries,
226255
in_flight_task_ids: vec![],
227256
profitability_delayed: self.profitability_delayed,
228257
// Try again in 10-30 seconds
229-
task_time: self.task_time + rand::random_range(10..30),
258+
task_time: now + rand::random_range(10..30),
230259
..self.clone()
231260
})
232261
.await?;

tuktuk-sdk/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ pub enum Error {
4242
InstructionError(#[from] InstructionError),
4343
#[error("Clock send error")]
4444
ClockSendError,
45+
#[error("Free tasks must be less than the capacity of the task queue")]
46+
FreeTasksGreaterThanCapacity,
4547
}
4648

4749
impl From<solana_client::client_error::ClientError> for Error {

0 commit comments

Comments
 (0)