test/blob: make bs_dev_common.c asynchronous

Unit tests that use this will still immediately execute
the messages by default.  But upcoming changes to
queue persists will need to leverage testing asynchronous
behavior so these changes enable that.

While here, fix some bugs where _bs_flush_scheduler()
did not fully flush the queue of scheduled ops.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I009e8277eef41d7e3677d9f135db34d8eaf2f071

Reviewed-on: https://review.gerrithub.io/401256
Reviewed-by: Maciej Szwed <maciej.szwed@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Jim Harris 2018-02-23 10:56:40 -07:00
parent ee8af4e9f3
commit 494c252abd
2 changed files with 22 additions and 11 deletions

View File

@ -105,11 +105,12 @@ _bs_send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx)
static void
_bs_flush_scheduler(void)
{
struct scheduled_ops *ops, *tmp;
struct scheduled_ops *ops;
TAILQ_FOREACH_SAFE(ops, &g_scheduled_ops, ops_queue, tmp) {
ops->fn(ops->ctx);
while (!TAILQ_EMPTY(&g_scheduled_ops)) {
ops = TAILQ_FIRST(&g_scheduled_ops);
TAILQ_REMOVE(&g_scheduled_ops, ops, ops_queue);
ops->fn(ops->ctx);
free(ops);
}
}
@ -1873,10 +1874,10 @@ bs_destroy(void)
CU_ASSERT(g_bserrno == 0);
/* Loading an non-existent blob store should fail. */
g_bserrno = -1;
g_bs = NULL;
dev = init_dev();
g_bserrno = 0;
spdk_bs_load(dev, &opts, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno != 0);
}

View File

@ -31,6 +31,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "spdk/io_channel.h"
#define DEV_BUFFER_SIZE (64 * 1024 * 1024)
#define DEV_BUFFER_BLOCKLEN (4096)
#define DEV_BUFFER_BLOCKCNT (DEV_BUFFER_SIZE / DEV_BUFFER_BLOCKLEN)
@ -56,6 +58,14 @@ dev_destroy(struct spdk_bs_dev *dev)
free(dev);
}
static void
dev_complete(void *arg)
{
struct spdk_bs_dev_cb_args *cb_args = arg;
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
}
static void
dev_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload,
uint64_t lba, uint32_t lba_count,
@ -67,7 +77,7 @@ dev_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload
length = lba_count * DEV_BUFFER_BLOCKLEN;
SPDK_CU_ASSERT_FATAL(offset + length <= DEV_BUFFER_SIZE);
memcpy(payload, &g_dev_buffer[offset], length);
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
@ -81,7 +91,7 @@ dev_write(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payloa
length = lba_count * DEV_BUFFER_BLOCKLEN;
SPDK_CU_ASSERT_FATAL(offset + length <= DEV_BUFFER_SIZE);
memcpy(&g_dev_buffer[offset], payload, length);
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
@ -115,7 +125,7 @@ dev_readv(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
offset += iov[i].iov_len;
}
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
@ -137,14 +147,14 @@ dev_writev(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
offset += iov[i].iov_len;
}
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
dev_flush(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
struct spdk_bs_dev_cb_args *cb_args)
{
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
@ -158,7 +168,7 @@ dev_unmap(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
length = lba_count * DEV_BUFFER_BLOCKLEN;
SPDK_CU_ASSERT_FATAL(offset + length <= DEV_BUFFER_SIZE);
memset(&g_dev_buffer[offset], 0, length);
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static void
@ -172,7 +182,7 @@ dev_write_zeroes(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
length = lba_count * DEV_BUFFER_BLOCKLEN;
SPDK_CU_ASSERT_FATAL(offset + length <= DEV_BUFFER_SIZE);
memset(&g_dev_buffer[offset], 0, length);
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
spdk_thread_send_msg(spdk_get_thread(), dev_complete, cb_args);
}
static struct spdk_bs_dev *