summaryrefslogtreecommitdiffstats
path: root/src/bench/connection.c
diff options
context:
space:
mode:
authorSimon Rettberg2019-08-07 14:48:55 +0200
committerSimon Rettberg2019-08-07 14:48:55 +0200
commitbd0a4d66acaf8ebf6388f6304a90b39434e9e36a (patch)
treeab98a3390b482d0b73c3001dac4f21bcc41730ac /src/bench/connection.c
parent[SERVER] Use more _Atomic (diff)
downloaddnbd3-bd0a4d66acaf8ebf6388f6304a90b39434e9e36a.tar.gz
dnbd3-bd0a4d66acaf8ebf6388f6304a90b39434e9e36a.tar.xz
dnbd3-bd0a4d66acaf8ebf6388f6304a90b39434e9e36a.zip
[BENCH] Allow specifying request block size
Diffstat (limited to 'src/bench/connection.c')
-rw-r--r--src/bench/connection.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/bench/connection.c b/src/bench/connection.c
index 03ad9e5..ce9438a 100644
--- a/src/bench/connection.c
+++ b/src/bench/connection.c
@@ -41,6 +41,7 @@ bool connection_init_n_times(
const char *lowerImage,
const uint16_t rid,
int ntimes,
+ int blockSize,
BenchCounters* counters
) {
for (int run_i = 0; run_i < ntimes; ++run_i) {
@@ -95,20 +96,31 @@ bool connection_init_n_times(
} else if ( rid != 0 && rid != remoteRid ) {
counters->fails++;
logadd( LOG_ERROR, "rid mismatch" );
- } else if ( !dnbd3_get_block( sock, run_i * 4096, 4096, 0, 0 ) ) {
+ } else if ( !dnbd3_get_block( sock, run_i * blockSize, blockSize, 0, 0 ) ) {
counters->fails++;
logadd( LOG_ERROR, "send: get block failed" );
} else if ( !dnbd3_get_reply( sock, &reply ) ) {
counters->fails++;
logadd( LOG_ERROR, "recv: get block header failed" );
- } else if ( recv( sock, trash, sizeof(trash), MSG_WAITALL|MSG_NOSIGNAL ) != sizeof(trash) ) {
- counters->fails++;
- logadd( LOG_ERROR, "recv: get block payload failed" );
} else {
- counters->success++;
- close( sock );
- sock = -1;
- continue;
+ int rv, togo = blockSize;
+ do {
+ rv = recv( sock, trash, MIN( sizeof(trash), togo ), MSG_WAITALL|MSG_NOSIGNAL );
+ if ( rv == -1 && errno == EINTR )
+ continue;
+ if ( rv <= 0 )
+ break;
+ togo -= rv;
+ } while ( togo > 0 );
+ if ( togo != 0 ) {
+ counters->fails++;
+ logadd( LOG_ERROR, "recv: get block payload failed (remaining %d)", togo );
+ } else {
+ counters->success++;
+ close( sock );
+ sock = -1;
+ continue;
+ }
}
// Failed
if ( sock != -1 ) {