From: Stefan Hajnoczi <stefanha@redhat.com>
To: Fam Zheng <famz@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Jeff Cody <jcody@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
vsementsov@parallels.com, John Snow <jsnow@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 10/15] block: add block job transactions
Date: Tue, 14 Jul 2015 11:27:40 +0100 [thread overview]
Message-ID: <20150714102740.GF17927@stefanha-thinkpad.redhat.com> (raw)
In-Reply-To: <1436500012-32593-11-git-send-email-famz@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3831 bytes --]
On Fri, Jul 10, 2015 at 11:46:47AM +0800, Fam Zheng wrote:
> From: Stefan Hajnoczi <stefanha@redhat.com>
Please take authorship, most of the code is yours.
> +static void block_job_completed_txn(BlockJobTxn *txn, BlockJob *job, int ret)
> +{
> + AioContext *ctx;
> + BlockJob *other_job, *next;
> + if (ret < 0 || block_job_is_cancelled(job)) {
> + if (!txn->aborting) {
> + /* We are the first failed job. Cancel other jobs. */
> + txn->aborting = true;
> + QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) {
> + if (other_job == job || other_job->completed) {
You didn't leave any clues as to why other_job->complete is safe to
access outside its AioContext.
Perhaps because it's only modified from the main loop and we are in the
main loop too?
Please either access it inside the AioContext or add a comment
explaining why it is safe.
> + continue;
> + }
> + ctx = bdrv_get_aio_context(other_job->bs);
> + aio_context_acquire(ctx);
> + block_job_cancel_sync(other_job);
> + assert(other_job->completed);
> + aio_context_release(ctx);
> + }
> + QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) {
> + if (other_job->driver->txn_abort) {
> + other_job->driver->txn_abort(other_job);
> + }
> + other_job->cb(other_job->opaque,
> + other_job->ret ? : -ECANCELED);
Please don't add ECANCELED here since block_job_completed() doesn't do
that either. We should be consistent: currently cb() needs to check
block_job_is_cancelled() to determine whether the job was cancelled.
Also, if a job finished but another job aborts, then we need to mark the
first job as cancelled (other_job->cancelled == true).
> + block_job_release(other_job->bs);
> + }
No AioContext acquire/release in this loop? Remember the job's bs can
still be accessed from another thread while we're running.
> + } else {
> + /*
> + * We are cancelled by another job, who will handle everything.
> + */
> + return;
> + }
> + } else {
> + /*
> + * Successful completion, see if there is other running jobs in this
s/is/are/ (plural)
> + * txn. */
> + QLIST_FOREACH(other_job, &txn->jobs, txn_list) {
> + if (!other_job->completed) {
> + return;
> + }
> + }
> + /* We are the last completed job, commit the transaction. */
> + QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) {
> + if (other_job->driver->txn_commit) {
> + other_job->driver->txn_commit(other_job);
> + }
> + assert(other_job->ret == 0);
> + other_job->cb(other_job->opaque, 0);
> + block_job_release(other_job->bs);
> + }
More other_job field accesses outside AioContext that need to be checked
and probably protected using acquire/release.
> +/**
> + * block_job_txn_new:
> + *
> + * Allocate and return a new block job transaction. Jobs can be added to the
> + * transaction using block_job_txn_add_job().
> + *
> + * All jobs in the transaction either complete successfully or fail/cancel as a
> + * group. Jobs wait for each other before completing. Cancelling one job
> + * cancels all jobs in the transaction.
> + */
> +BlockJobTxn *block_job_txn_new(void);
The doc comments says "Allocate and return a new block job transaction"
but does not explain how/when the object is freed. Please add a
sentence along the lines of: The transaction is automatically freed when
the last job completes or is cancelled.
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
next prev parent reply other threads:[~2015-07-14 10:27 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-10 3:46 [Qemu-devel] [PATCH v3 00/15] block: incremental backup transactions using BlockJobTxn Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 01/15] qapi: Add transaction support to block-dirty-bitmap operations Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 02/15] iotests: add transactional incremental backup test Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 03/15] block: rename BlkTransactionState and BdrvActionOps Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 04/15] block: keep bitmap if incremental backup job is cancelled Fam Zheng
2015-07-13 19:48 ` John Snow
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 05/15] backup: Extract dirty bitmap handling as a separate function Fam Zheng
2015-07-13 23:06 ` John Snow
2015-07-14 2:46 ` Fam Zheng
2015-07-14 8:26 ` Stefan Hajnoczi
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 06/15] blockjob: Add .txn_commit and .txn_abort transaction actions Fam Zheng
2015-07-13 23:06 ` John Snow
2015-07-14 8:35 ` Stefan Hajnoczi
2015-07-14 9:26 ` Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 07/15] blockjob: Add "completed" and "ret" in BlockJob Fam Zheng
2015-07-13 23:08 ` John Snow
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 08/15] blockjob: Simplify block_job_finish_sync Fam Zheng
2015-07-13 23:08 ` John Snow
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 09/15] blockjob: Move BlockJobDeferToMainLoopData into BlockJob Fam Zheng
2015-07-14 10:03 ` Stefan Hajnoczi
2015-07-14 10:36 ` Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 10/15] block: add block job transactions Fam Zheng
2015-07-13 23:12 ` John Snow
2015-07-14 3:04 ` Fam Zheng
2015-07-14 15:05 ` John Snow
2015-07-14 10:27 ` Stefan Hajnoczi [this message]
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 11/15] blockdev: make BlockJobTxn available to qmp 'transaction' Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 12/15] block/backup: support block job transactions Fam Zheng
2015-07-13 23:14 ` John Snow
2015-07-14 3:12 ` Fam Zheng
2015-07-14 10:32 ` Stefan Hajnoczi
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 13/15] iotests: 124 - transactional failure test Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 14/15] qmp-commands.hx: Update the supported 'transaction' operations Fam Zheng
2015-07-10 3:46 ` [Qemu-devel] [PATCH v3 15/15] tests: add BlockJobTxn unit test Fam Zheng
2015-07-13 23:14 ` John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150714102740.GF17927@stefanha-thinkpad.redhat.com \
--to=stefanha@redhat.com \
--cc=famz@redhat.com \
--cc=jcody@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@parallels.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).