Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to delete jobs in a queue by function alone without args #561

Merged
merged 1 commit into from
Apr 5, 2021

Conversation

whatl3y
Copy link
Contributor

@whatl3y whatl3y commented Mar 30, 2021

Adds await queue.delByFunction(queue, functionOrClassName)

Comment on lines +189 to +207
const jobs = await this.connection.redis.lrange(
this.connection.key("queue", q),
start,
stop
);
let numJobsDeleted: number = 0;
for (let i = 0; i < jobs.length; i++) {
const jobEncoded = jobs[i];
const { class: jobFunc } = JSON.parse(jobEncoded);
if (jobFunc === func) {
await this.connection.redis.lrem(
this.connection.key("queue", q),
0,
jobEncoded
);
numJobsDeleted++;
}
}
return numJobsDeleted;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a little worried here about the delay between reading and deleting. If you find your job in position 4 in the range, and then delete the job in position it might have been moved to a new position, or out of the queue entirely but the time you call lrem.

The good news is that lrem compares the contents of jobEncoded, so it won't delete the wrong job by accident. The bad news is that you might miss new jobs that have been added as the queue is changing under you. Think that will be a problem?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only thing I think might help a little bit with this, although will absolutely not resolve entirely would be to use pipelining to batch the lrem commands. In saying that though jobs are/can be sill being worked as the pipeline is being built so the problem doesn't go away entirely.

In my case this is not much of an issue, I simply want to be able to just clear a queue from a particular function/class and the fact that jobs can be worked in the middle isn't a big deal, but I'm not sure if theres another use case where this could be a bigger issue.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point - unless you bring LUA into the mix, I guess we can't really guarantee that we deleted all the jobs. Could you add a note to that point in the comments? "best-effort" and all that...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this in and add the note on master - thanks for your contribution!

@evantahler
Copy link
Member

Great addition! What do you think about the changing queue?

@evantahler evantahler merged commit 9680639 into actionhero:master Apr 5, 2021
@evantahler
Copy link
Member

Notes added in adc8e9f

@evantahler
Copy link
Member

evantahler commented Apr 5, 2021

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants