Numerous changes to file-modes, small build-tweaks, and a tweak to aiori-S3.c
(Only rank-0 should create the bucket, if it doesn't already exist.) Prepping this for a push (as an experimental S3 build) to github.master
parent
a50da47323
commit
37738dab26
|
@ -1,3 +1,5 @@
|
||||||
|
[See also NOTES.txt]
|
||||||
|
|
||||||
Building
|
Building
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
[This is some help for building with experimental S3 support.]
|
||||||
|
|
||||||
|
|
||||||
|
--- BUILDING
|
||||||
|
|
||||||
|
module load openmpi-gnu
|
||||||
|
|
||||||
|
./bootstrap
|
||||||
|
|
||||||
|
|
||||||
|
# configure must be able to find libaws4c, libxml2, libcurl, libcrypto, etc.
|
||||||
|
# On some machines, the libxml2 include files are in:
|
||||||
|
#
|
||||||
|
# /usr/include/libxml2
|
||||||
|
#
|
||||||
|
# which is not a standard include location, so we must define CPPFLAGS
|
||||||
|
# to put that path in the include path. Do this:
|
||||||
|
#
|
||||||
|
# setenv CPPFLAGS -I/usr/include/libxml2
|
||||||
|
# [or add "CPPFLAGS=-I/usr/include/libxml2" to the end of the configure command]
|
||||||
|
#
|
||||||
|
# Use the --with-aws4c=DIR to point to the path where your libaws4c library
|
||||||
|
# sits.
|
||||||
|
#
|
||||||
|
# Use the --prefix=iorInstallDir to point to the path where you want IOR
|
||||||
|
# to install all the files it builds during the "make" process.
|
||||||
|
|
||||||
|
./configure --prefix=iorInstallDir --with-S3 [ --with-aws4c=DIR ]
|
||||||
|
|
||||||
|
|
||||||
|
# Here is an example configure-command invocation, for building with the
|
||||||
|
# S3-targeting extensions, which require access to additional libraries
|
||||||
|
# mentioned above. This will probably not work verbatim on your
|
||||||
|
# installation, because libraries will be installed in different locations,
|
||||||
|
# but it could help you to understand what is needed.
|
||||||
|
|
||||||
|
./configure --prefix=`pwd`/installed \
|
||||||
|
--with-S3 \
|
||||||
|
--with-aws4c=`pwd`/aws4c \
|
||||||
|
LDFLAGS="-L/usr/lib64 -L`pwd`/libxml2-2.9.1/installed/lib" \
|
||||||
|
CFLAGS="-I`pwd`/libxml2-2.9.1/installed/include/libxml2"
|
||||||
|
|
||||||
|
|
||||||
|
# 14-May-2015:
|
||||||
|
# To change the target of the experiment, there is an #if block from line
|
||||||
|
# 284-309. The "if" portion is activated by putting a 1 as the argument
|
||||||
|
# instead of a 0. In that case, the experiment will use the four ECS nodes
|
||||||
|
# directly, splitting the load up between all four.
|
||||||
|
#
|
||||||
|
# If the #if argument is 0, then the "#else" portion is executed. In this
|
||||||
|
# case you can use the load balancer, haproxy.ccstar.lanl.gov, by using
|
||||||
|
# the IP 10.143.0.1:80. If you want to use one of the ECS nodes directly
|
||||||
|
# us the IP 10.140.0.[15-17]:9020.
|
||||||
|
#
|
||||||
|
# To specify the bucket where the experiment file(s) will go, you need
|
||||||
|
# to set that with the "const char* bucket_name declaration. There are
|
||||||
|
# a couple options at lines 207-208.
|
||||||
|
|
||||||
|
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
|
||||||
|
-- RUNNING (various options ...)
|
||||||
|
|
||||||
|
# llogin -np 4
|
||||||
|
msub -IX -l nodes=4:ppn=4,walltime=11:00:00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# For debugging, run on 1 node, -vvvv turns on detailed curl debugging
|
||||||
|
mpirun -np 1 MY_INSTALL_DIR/bin/ior -a S3 -o test_`date +"%Y%m%d_%H%M%S"` -vvvv -t1k -b1k
|
||||||
|
|
||||||
|
# this defaults the number of processors
|
||||||
|
mpirun MY_INSTALL_DIRbin/ior -a S3 -C -o test_`date +"%Y%m%d_%H%M%S"`
|
||||||
|
|
||||||
|
# this does one parallel run, putting a heavy load on the server [assumes bash]
|
||||||
|
mpirun -npernode 8 MY_INSTALL_DIR/bin/ior -a S3_EMC -C -o test_`date +"%Y%m%d_%H%M%S"` \
|
||||||
|
-b $(( 128 * 1024 * 1024 )) \
|
||||||
|
-t $(( 128 * 1024 * 1024 )) \
|
||||||
|
-i 1
|
||||||
|
|
90
TBD.txt
90
TBD.txt
|
@ -1,90 +0,0 @@
|
||||||
-- fix indentation in all source files
|
|
||||||
|
|
||||||
Do not use some fixed-width spacing. Use tabs. Someday, editors will
|
|
||||||
distinguish between "indentation" (which should be done with tabs), and
|
|
||||||
"alignment" which should be done with spaces. That way, you choose your
|
|
||||||
own indentation, and everything just works.
|
|
||||||
|
|
||||||
|
|
||||||
-- change "HDFS" everywhere to "HDFs" (or something)
|
|
||||||
|
|
||||||
for easier distinction from "HDF5"
|
|
||||||
|
|
||||||
|
|
||||||
-- maybe parse_options.c should just parse options, not create tests.
|
|
||||||
|
|
||||||
The latter brings an ugly mix of calls across files. Fixing involves
|
|
||||||
having parse routines just set flags in params, then, in ior.c, someone
|
|
||||||
checks flags and calls test-creation stuff. Should also move
|
|
||||||
test-creation to ior.c [Results creation, too.]
|
|
||||||
|
|
||||||
|
|
||||||
-- collect various special-purpose parameter-fixing into one place.
|
|
||||||
|
|
||||||
see e.g. CheckRunSettings(). Should each aiori have a "fix the
|
|
||||||
parameters" generic function, as well? This could be called at a known
|
|
||||||
time, allowing incompatibilities to be handled in a regular way.
|
|
||||||
|
|
||||||
|
|
||||||
-- does MPIIO_GetFileSize() have to be in aiori.h?
|
|
||||||
|
|
||||||
|
|
||||||
-- change integers to 0x'..', in aiori.h
|
|
||||||
|
|
||||||
|
|
||||||
-- add hdfs-related command-line options
|
|
||||||
|
|
||||||
(e.g. HDFS user-name, replica-count, etc.)
|
|
||||||
see ior.h
|
|
||||||
see init_IOR_Param_t(), in ior.c
|
|
||||||
|
|
||||||
|
|
||||||
-- is the getenv() I added to ior.c a problem for Win support?
|
|
||||||
|
|
||||||
|
|
||||||
-- see "TBD" notes in src/Makefile.am
|
|
||||||
|
|
||||||
(1) for HDFS:
|
|
||||||
|
|
||||||
# TBD: figure out how to find this from the corresponding bin/ dir in $PATH
|
|
||||||
# or pick an environment var to use (and set it in modulefiles)
|
|
||||||
# or provide a config-flag, to set a variable we use here
|
|
||||||
|
|
||||||
|
|
||||||
(2) for PLFS:
|
|
||||||
|
|
||||||
# TBD: modulefiles don't add PLFS_VER to env, but you can find it embedded in
|
|
||||||
# $PLFS_HOME. configure.ac should extract this for us. Then we should
|
|
||||||
# add -D... to ior_CPPFLAGS, here. Then aiori-PLFS.c can conditionalize
|
|
||||||
# compilation of calls that vary according to PLFS version.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
S3
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
-- RemoveFile (ior.c) calls POSIX "access" to see whether file exists
|
|
||||||
|
|
||||||
This is called between iterations, when iterations > 1. Should use
|
|
||||||
backend->GetFileSize(), or something, and catch errors. Or the aiori
|
|
||||||
struct could be extended to include a lower-level "stat" that could
|
|
||||||
return 0 for non-existent files.
|
|
||||||
|
|
||||||
|
|
||||||
-- add 'init' and 'exit' functions to aiori struct
|
|
||||||
|
|
||||||
This would allow HDFS/S3/etc to do their one-time initializations and
|
|
||||||
cleanups. Call from top-level in ior.c
|
|
||||||
|
|
||||||
Something also needed in AioriBind().
|
|
||||||
|
|
||||||
|
|
||||||
-- ior should assert the IOR_TRUNC flag in params, when opening?
|
|
||||||
|
|
||||||
The CREAT flag does not reset a file, if it already exists, when opening
|
|
||||||
for write. [But ... wait. If you're opening for WRITE, you should be
|
|
||||||
resetting it anyhow. D'oh.]
|
|
BIN
aws4c-0.5.1.tgz
BIN
aws4c-0.5.1.tgz
Binary file not shown.
|
@ -112,17 +112,81 @@ AM_COND_IF([USE_POSIX_AIORI],[
|
||||||
AC_DEFINE([USE_POSIX_AIORI], [], [Build POSIX backend AIORI])
|
AC_DEFINE([USE_POSIX_AIORI], [], [Build POSIX backend AIORI])
|
||||||
])
|
])
|
||||||
|
|
||||||
# Amazon S3 support
|
|
||||||
|
|
||||||
|
|
||||||
|
# aws4c is needed for the S3 backend (see --with-S3, below).
|
||||||
|
# Version 0.5.2 of aws4c is available at https://github.com/jti-lanl/aws4c.git
|
||||||
|
# Install it something like this:
|
||||||
|
#
|
||||||
|
# cd $my_install_dir
|
||||||
|
# git clone https://github.com/jti-lanl/aws4c.git
|
||||||
|
# cd aws4c
|
||||||
|
# make
|
||||||
|
#
|
||||||
|
# Then:
|
||||||
|
# --with-S3 --with-aws4c=$my_install_dir/aws4c
|
||||||
|
|
||||||
|
aws4c_dir=
|
||||||
|
AC_ARG_WITH([aws4c],
|
||||||
|
[AS_HELP_STRING([--with-aws4c=DIR],
|
||||||
|
[aws4c library is needed for Amazon S3 backend])],
|
||||||
|
[aws4c_dir="$withval"])
|
||||||
|
AM_CONDITIONAL([AWS4C_DIR], [test x$aws4c_dir != x])
|
||||||
|
|
||||||
|
# AC_SUBST([AWS4C_DIR],[$aws4c_dir])
|
||||||
|
AM_COND_IF([AWS4C_DIR],[
|
||||||
|
AC_SUBST([AWS4C_CPPFLAGS],[-I$aws4c_dir])
|
||||||
|
AC_SUBST([AWS4C_LDFLAGS], [-L$aws4c_dir])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# Amazon S3 support [see also: --with-aws4c]
|
||||||
AC_ARG_WITH([S3],
|
AC_ARG_WITH([S3],
|
||||||
[AS_HELP_STRING([--with-S3],
|
[AS_HELP_STRING([--with-S3],
|
||||||
[support IO with Amazon S3 backend @<:@default=yes@:>@])],
|
[support IO with Amazon S3 backend @<:@default=no@:>@])],
|
||||||
[],
|
[],
|
||||||
[with_S3=yes])
|
[with_S3=no])
|
||||||
AM_CONDITIONAL([USE_S3_AIORI], [test x$with_S3 = xyes])
|
AM_CONDITIONAL([USE_S3_AIORI], [test x$with_S3 = xyes])
|
||||||
AM_COND_IF([USE_S3_AIORI],[
|
AM_COND_IF([USE_S3_AIORI],[
|
||||||
AC_DEFINE([USE_S3_AIORI], [], [Build Amazon-S3 backend AIORI])
|
AC_DEFINE([USE_S3_AIORI], [], [Build Amazon-S3 backend AIORI])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
err=0
|
||||||
|
AS_IF([test "x$with_S3" != xno], [
|
||||||
|
AC_MSG_NOTICE([beginning of S3-related checks])
|
||||||
|
|
||||||
|
# save user's values, while we use AC_CHECK_HEADERS with $AWS4C_DIR
|
||||||
|
ORIG_CPPFLAGS=$CPPFLAGS
|
||||||
|
ORIG_LDFLAGS=$LDFLAGS
|
||||||
|
|
||||||
|
CPPFLAGS="$CPPFLAGS $AWS4C_CPPFLAGS"
|
||||||
|
LDFLAGS=" $LDFLAGS $AWS4C_LDFLAGS"
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([aws4c.h], [], [err=1])
|
||||||
|
AC_CHECK_HEADERS([libxml/parser.h], [], [err=1])
|
||||||
|
|
||||||
|
# Autotools thinks searching for a library means I want it added to LIBS
|
||||||
|
ORIG_LIBS=$LIBS
|
||||||
|
AC_CHECK_LIB([curl], [curl_easy_init], [], [err=1])
|
||||||
|
AC_CHECK_LIB([xml2], [xmlDocGetRootElement], [], [err=1])
|
||||||
|
AC_CHECK_LIB([aws4c], [s3_get], [], [err=1], [-lcurl -lxml2 -lcrypto])
|
||||||
|
LIBS=$ORIG_LIBS
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([end of S3-related checks])
|
||||||
|
if test "$err" == 1; then
|
||||||
|
AC_MSG_FAILURE([S3 support is missing. dnl
|
||||||
|
Make sure you have access to libaws4c, libcurl, libxml2, and libcrypto. dnl
|
||||||
|
Consider --with-aws4c=, CPPFLAGS, LDFLAGS, etc])
|
||||||
|
fi
|
||||||
|
|
||||||
|
# restore user's values
|
||||||
|
CPPFLAGS=$ORIG_CPPFLAGS
|
||||||
|
LDFLAGS=$ORIG_LDFLAGS
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,12 +52,11 @@ endif
|
||||||
|
|
||||||
|
|
||||||
if USE_S3_AIORI
|
if USE_S3_AIORI
|
||||||
# TBD: Find the aws4c and libxml installations programmatically
|
|
||||||
AWS4C = /users/jti/projects/ecs_hobo/tools/aws4c-0.5
|
|
||||||
ior_SOURCES += aiori-S3.c
|
ior_SOURCES += aiori-S3.c
|
||||||
ior_CPPFLAGS += -I/usr/include/libxml2
|
if AWS4C_DIR
|
||||||
ior_CPPFLAGS += -I$(AWS4C)
|
ior_CPPFLAGS += $(AWS4C_CPPFLAGS)
|
||||||
ior_LDFLAGS += -L$(AWS4C)
|
ior_LDFLAGS += $(AWS4C_LDFLAGS)
|
||||||
|
endif
|
||||||
ior_LDADD += -lcurl
|
ior_LDADD += -lcurl
|
||||||
ior_LDADD += -lxml2
|
ior_LDADD += -lxml2
|
||||||
ior_LDADD += -laws4c
|
ior_LDADD += -laws4c
|
||||||
|
|
|
@ -205,6 +205,7 @@ CURLcode rc;
|
||||||
|
|
||||||
/* Any objects we create or delete will be under this bucket */
|
/* Any objects we create or delete will be under this bucket */
|
||||||
const char* bucket_name = "ior";
|
const char* bucket_name = "ior";
|
||||||
|
//const char* bucket_name = "brettk";
|
||||||
|
|
||||||
|
|
||||||
/***************************** F U N C T I O N S ******************************/
|
/***************************** F U N C T I O N S ******************************/
|
||||||
|
@ -259,9 +260,9 @@ s3_connect( IOR_param_t* param ) {
|
||||||
// NOTE: These inits could be done in init_IORParam_t(), in ior.c, but
|
// NOTE: These inits could be done in init_IORParam_t(), in ior.c, but
|
||||||
// would require conditional compilation, there.
|
// would require conditional compilation, there.
|
||||||
|
|
||||||
|
aws_set_debug(param->verbose >= 4);
|
||||||
aws_read_config(getenv("USER")); // requires ~/.awsAuth
|
aws_read_config(getenv("USER")); // requires ~/.awsAuth
|
||||||
aws_reuse_connections(1);
|
aws_reuse_connections(1);
|
||||||
aws_set_debug(param->verbose >= 4);
|
|
||||||
|
|
||||||
// initalize IOBufs. These are basically dynamically-extensible
|
// initalize IOBufs. These are basically dynamically-extensible
|
||||||
// linked-lists. "growth size" controls the increment of new memory
|
// linked-lists. "growth size" controls the increment of new memory
|
||||||
|
@ -272,24 +273,59 @@ s3_connect( IOR_param_t* param ) {
|
||||||
param->etags = aws_iobuf_new();
|
param->etags = aws_iobuf_new();
|
||||||
aws_iobuf_growth_size(param->etags, 1024*1024*8);
|
aws_iobuf_growth_size(param->etags, 1024*1024*8);
|
||||||
|
|
||||||
|
// WARNING: if you have http_proxy set in your environment, you may need
|
||||||
|
// to override it here. TBD: add a command-line variable to
|
||||||
|
// allow you to define a proxy.
|
||||||
|
//
|
||||||
// our hosts are currently 10.140.0.15 - 10.140 0.18
|
// our hosts are currently 10.140.0.15 - 10.140 0.18
|
||||||
// TBD: Try DNS-round-robin server at vi-lb.ccstar.lanl.gov
|
// TBD: Try DNS-round-robin server at vi-lb.ccstar.lanl.gov
|
||||||
snprintf(buff, BUFF_SIZE, "10.140.0.%d:9020", 15 + (rank % 4));
|
// TBD: try HAProxy round-robin at 10.143.0.1
|
||||||
s3_set_host(buff);
|
|
||||||
|
#if 1
|
||||||
|
// snprintf(buff, BUFF_SIZE, "10.140.0.%d:9020", 15 + (rank % 4));
|
||||||
|
// s3_set_proxy(buff);
|
||||||
|
//
|
||||||
|
// snprintf(buff, BUFF_SIZE, "10.140.0.%d", 15 + (rank % 4));
|
||||||
|
// s3_set_host(buff);
|
||||||
|
|
||||||
|
snprintf(buff, BUFF_SIZE, "10.140.0.%d:9020", 15 + (rank % 4));
|
||||||
|
s3_set_host(buff);
|
||||||
|
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* If you just want to go to one if the ECS nodes, put that IP
|
||||||
|
* address in here directly with port 9020.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// s3_set_host("10.140.0.15:9020");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you want to go to haproxy.ccstar.lanl.gov, this is its IP
|
||||||
|
* address.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// s3_set_proxy("10.143.0.1:80");
|
||||||
|
// s3_set_host( "10.143.0.1:80");
|
||||||
|
#endif
|
||||||
|
|
||||||
// make sure test-bucket exists
|
// make sure test-bucket exists
|
||||||
s3_set_bucket((char*)bucket_name);
|
s3_set_bucket((char*)bucket_name);
|
||||||
AWS4C_CHECK( s3_head(param->io_buf, "") );
|
|
||||||
if ( param->io_buf->code == 404 ) { // "404 Not Found"
|
|
||||||
printf(" bucket '%s' doesn't exist\n", bucket_name);
|
|
||||||
|
|
||||||
AWS4C_CHECK( s3_put(param->io_buf, "") ); /* creates URL as bucket + obj */
|
if (rank == 0) {
|
||||||
AWS4C_CHECK_OK( param->io_buf ); // assure "200 OK"
|
AWS4C_CHECK( s3_head(param->io_buf, "") );
|
||||||
printf("created bucket '%s'\n", bucket_name);
|
if ( param->io_buf->code == 404 ) { // "404 Not Found"
|
||||||
}
|
printf(" bucket '%s' doesn't exist\n", bucket_name);
|
||||||
else { // assure "200 OK"
|
|
||||||
AWS4C_CHECK_OK( param->io_buf );
|
AWS4C_CHECK( s3_put(param->io_buf, "") ); /* creates URL as bucket + obj */
|
||||||
}
|
AWS4C_CHECK_OK( param->io_buf ); // assure "200 OK"
|
||||||
|
printf("created bucket '%s'\n", bucket_name);
|
||||||
|
}
|
||||||
|
else { // assure "200 OK"
|
||||||
|
AWS4C_CHECK_OK( param->io_buf );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MPI_CHECK(MPI_Barrier(param->testComm), "barrier error");
|
||||||
|
|
||||||
|
|
||||||
// Maybe allow EMC extensions to S3
|
// Maybe allow EMC extensions to S3
|
||||||
s3_enable_EMC_extensions(param->curl_flags & IOR_CURL_S3_EMC_EXT);
|
s3_enable_EMC_extensions(param->curl_flags & IOR_CURL_S3_EMC_EXT);
|
||||||
|
@ -821,7 +857,6 @@ S3_Xfer_internal(int access,
|
||||||
// we're "extending" rather than "appending". That means the
|
// we're "extending" rather than "appending". That means the
|
||||||
// buffer represents empty storage, which will be filled by the
|
// buffer represents empty storage, which will be filled by the
|
||||||
// libcurl writefunction, invoked via aws4c.
|
// libcurl writefunction, invoked via aws4c.
|
||||||
|
|
||||||
aws_iobuf_reset(param->io_buf);
|
aws_iobuf_reset(param->io_buf);
|
||||||
aws_iobuf_extend_static(param->io_buf, data_ptr, remaining);
|
aws_iobuf_extend_static(param->io_buf, data_ptr, remaining);
|
||||||
AWS4C_CHECK( s3_get(param->io_buf, file) );
|
AWS4C_CHECK( s3_get(param->io_buf, file) );
|
||||||
|
|
|
@ -92,7 +92,7 @@ static void ShowSetup(IOR_param_t *params);
|
||||||
static void ShowTest(IOR_param_t *);
|
static void ShowTest(IOR_param_t *);
|
||||||
static void PrintLongSummaryAllTests(IOR_test_t *tests_head);
|
static void PrintLongSummaryAllTests(IOR_test_t *tests_head);
|
||||||
static void TestIoSys(IOR_test_t *);
|
static void TestIoSys(IOR_test_t *);
|
||||||
static void ValidTests(IOR_param_t *);
|
static void ValidateTests(IOR_param_t *);
|
||||||
static IOR_offset_t WriteOrRead(IOR_param_t *, void *, int);
|
static IOR_offset_t WriteOrRead(IOR_param_t *, void *, int);
|
||||||
static void WriteTimes(IOR_param_t *, double **, int, int);
|
static void WriteTimes(IOR_param_t *, double **, int, int);
|
||||||
|
|
||||||
|
@ -140,12 +140,12 @@ int main(int argc, char **argv)
|
||||||
"Run 'configure --with-<backend>', and recompile.");
|
"Run 'configure --with-<backend>', and recompile.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup tests before verifying test validity */
|
/* setup tests, and validate parameters */
|
||||||
tests_head = SetupTests(argc, argv);
|
tests_head = SetupTests(argc, argv);
|
||||||
verbose = tests_head->params.verbose;
|
verbose = tests_head->params.verbose;
|
||||||
tests_head->params.testComm = MPI_COMM_WORLD;
|
tests_head->params.testComm = MPI_COMM_WORLD;
|
||||||
|
|
||||||
/* check for commandline usage */
|
/* check for commandline 'help' request */
|
||||||
if (rank == 0 && tests_head->params.showHelp == TRUE) {
|
if (rank == 0 && tests_head->params.showHelp == TRUE) {
|
||||||
DisplayUsage(argv);
|
DisplayUsage(argv);
|
||||||
}
|
}
|
||||||
|
@ -860,6 +860,17 @@ FillBuffer(void *buffer,
|
||||||
unsigned long long hi, lo;
|
unsigned long long hi, lo;
|
||||||
unsigned long long *buf = (unsigned long long *)buffer;
|
unsigned long long *buf = (unsigned long long *)buffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Consider adding a parameter to use incompressible data or what is here now.
|
||||||
|
* The way to get incompressible data would be to use some random transfer
|
||||||
|
* buffer content. In Linux we can read from /dev/urandom. In C we can use
|
||||||
|
* the rand() function in stdlib.h.
|
||||||
|
*
|
||||||
|
* # include <stdlib.h>
|
||||||
|
*
|
||||||
|
* hi = (( unsigned long long )rand() ) << 32;
|
||||||
|
* lo = (( unsigned long long )rand() );
|
||||||
|
*/
|
||||||
hi = ((unsigned long long)fillrank) << 32;
|
hi = ((unsigned long long)fillrank) << 32;
|
||||||
lo = (unsigned long long)test->timeStampSignatureValue;
|
lo = (unsigned long long)test->timeStampSignatureValue;
|
||||||
for (i = 0; i < test->transferSize / sizeof(unsigned long long); i++) {
|
for (i = 0; i < test->transferSize / sizeof(unsigned long long); i++) {
|
||||||
|
@ -1373,6 +1384,7 @@ static double TimeDeviation(void)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup tests by parsing commandline and creating test script.
|
* Setup tests by parsing commandline and creating test script.
|
||||||
|
* Perform a sanity-check on the configured parameters.
|
||||||
*/
|
*/
|
||||||
static IOR_test_t *SetupTests(int argc, char **argv)
|
static IOR_test_t *SetupTests(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -1391,7 +1403,7 @@ static IOR_test_t *SetupTests(int argc, char **argv)
|
||||||
|
|
||||||
/* check validity of tests and create test queue */
|
/* check validity of tests and create test queue */
|
||||||
while (tests != NULL) {
|
while (tests != NULL) {
|
||||||
ValidTests(&tests->params);
|
ValidateTests(&tests->params);
|
||||||
tests = tests->next;
|
tests = tests->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2323,11 +2335,11 @@ static void TestIoSys(IOR_test_t *test)
|
||||||
/*
|
/*
|
||||||
* Determine if valid tests from parameters.
|
* Determine if valid tests from parameters.
|
||||||
*/
|
*/
|
||||||
static void ValidTests(IOR_param_t * test)
|
static void ValidateTests(IOR_param_t * test)
|
||||||
{
|
{
|
||||||
IOR_param_t defaults;
|
IOR_param_t defaults;
|
||||||
|
|
||||||
init_IOR_Param_t(&defaults);
|
init_IOR_Param_t(&defaults);
|
||||||
|
|
||||||
/* get the version of the tests */
|
/* get the version of the tests */
|
||||||
AioriBind(test->api, test);
|
AioriBind(test->api, test);
|
||||||
backend->set_version(test);
|
backend->set_version(test);
|
||||||
|
@ -2366,6 +2378,8 @@ static void ValidTests(IOR_param_t * test)
|
||||||
}
|
}
|
||||||
if (test->blockSize < test->transferSize)
|
if (test->blockSize < test->transferSize)
|
||||||
ERR("block size must not be smaller than transfer size");
|
ERR("block size must not be smaller than transfer size");
|
||||||
|
|
||||||
|
/* specific APIs */
|
||||||
if ((strcmp(test->api, "MPIIO") == 0)
|
if ((strcmp(test->api, "MPIIO") == 0)
|
||||||
&& (test->blockSize < sizeof(IOR_size_t)
|
&& (test->blockSize < sizeof(IOR_size_t)
|
||||||
|| test->transferSize < sizeof(IOR_size_t)))
|
|| test->transferSize < sizeof(IOR_size_t)))
|
||||||
|
@ -2418,6 +2432,8 @@ static void ValidTests(IOR_param_t * test)
|
||||||
if ((strcmp(test->api, "POSIX") == 0) && test->collective)
|
if ((strcmp(test->api, "POSIX") == 0) && test->collective)
|
||||||
WARN_RESET("collective not available in POSIX",
|
WARN_RESET("collective not available in POSIX",
|
||||||
test, &defaults, collective);
|
test, &defaults, collective);
|
||||||
|
|
||||||
|
/* parameter consitency */
|
||||||
if (test->reorderTasks == TRUE && test->reorderTasksRandom == TRUE)
|
if (test->reorderTasks == TRUE && test->reorderTasksRandom == TRUE)
|
||||||
ERR("Both Constant and Random task re-ordering specified. Choose one and resubmit");
|
ERR("Both Constant and Random task re-ordering specified. Choose one and resubmit");
|
||||||
if (test->randomOffset && test->reorderTasksRandom
|
if (test->randomOffset && test->reorderTasksRandom
|
||||||
|
@ -2430,6 +2446,8 @@ static void ValidTests(IOR_param_t * test)
|
||||||
ERR("random offset not available with read check option (use write check)");
|
ERR("random offset not available with read check option (use write check)");
|
||||||
if (test->randomOffset && test->storeFileOffset)
|
if (test->randomOffset && test->storeFileOffset)
|
||||||
ERR("random offset not available with store file offset option)");
|
ERR("random offset not available with store file offset option)");
|
||||||
|
|
||||||
|
|
||||||
if ((strcmp(test->api, "MPIIO") == 0) && test->randomOffset
|
if ((strcmp(test->api, "MPIIO") == 0) && test->randomOffset
|
||||||
&& test->collective)
|
&& test->collective)
|
||||||
ERR("random offset not available with collective MPIIO");
|
ERR("random offset not available with collective MPIIO");
|
||||||
|
@ -2471,6 +2489,17 @@ static void ValidTests(IOR_param_t * test)
|
||||||
}
|
}
|
||||||
if (test->useExistingTestFile && test->lustre_set_striping)
|
if (test->useExistingTestFile && test->lustre_set_striping)
|
||||||
ERR("Lustre stripe options are incompatible with useExistingTestFile");
|
ERR("Lustre stripe options are incompatible with useExistingTestFile");
|
||||||
|
|
||||||
|
/* N:1 and N:N */
|
||||||
|
IOR_offset_t NtoN = test->filePerProc;
|
||||||
|
IOR_offset_t Nto1 = ! NtoN;
|
||||||
|
IOR_offset_t s = test->segmentCount;
|
||||||
|
IOR_offset_t t = test->transferSize;
|
||||||
|
IOR_offset_t b = test->blockSize;
|
||||||
|
|
||||||
|
if (Nto1 && (s != 1) && (b != t)) {
|
||||||
|
ERR("N:1 (strided) requires xfer-size == block-size");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static IOR_offset_t *GetOffsetArraySequential(IOR_param_t * test,
|
static IOR_offset_t *GetOffsetArraySequential(IOR_param_t * test,
|
||||||
|
|
|
@ -114,6 +114,7 @@ static void CheckRunSettings(IOR_test_t *tests)
|
||||||
/* If only read or write is requested, then fix the default
|
/* If only read or write is requested, then fix the default
|
||||||
* openFlags to not be open RDWR. It matters in the case
|
* openFlags to not be open RDWR. It matters in the case
|
||||||
* of HDFS, which doesn't support opening RDWR.
|
* of HDFS, which doesn't support opening RDWR.
|
||||||
|
* (We assume int-valued params are exclusively 0 or 1.)
|
||||||
*/
|
*/
|
||||||
if ((params->openFlags & IOR_RDWR)
|
if ((params->openFlags & IOR_RDWR)
|
||||||
&& ((params->readFile | params->checkRead)
|
&& ((params->readFile | params->checkRead)
|
||||||
|
@ -441,12 +442,12 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, opts)) != -1) {
|
while ((c = getopt(argc, argv, opts)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'A':
|
|
||||||
initialTestParams.referenceNumber = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'a':
|
case 'a':
|
||||||
strcpy(initialTestParams.api, optarg);
|
strcpy(initialTestParams.api, optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'A':
|
||||||
|
initialTestParams.referenceNumber = atoi(optarg);
|
||||||
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
initialTestParams.blockSize = StringToBytes(optarg);
|
initialTestParams.blockSize = StringToBytes(optarg);
|
||||||
RecalculateExpectedFileSize(&initialTestParams);
|
RecalculateExpectedFileSize(&initialTestParams);
|
||||||
|
@ -460,15 +461,6 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
case 'C':
|
case 'C':
|
||||||
initialTestParams.reorderTasks = TRUE;
|
initialTestParams.reorderTasks = TRUE;
|
||||||
break;
|
break;
|
||||||
case 'Q':
|
|
||||||
initialTestParams.taskPerNodeOffset = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
initialTestParams.reorderTasksRandom = TRUE;
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
initialTestParams.reorderTasksRandomSeed = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'd':
|
case 'd':
|
||||||
initialTestParams.interTestDelay = atoi(optarg);
|
initialTestParams.interTestDelay = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
@ -476,9 +468,6 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
initialTestParams.deadlineForStonewalling =
|
initialTestParams.deadlineForStonewalling =
|
||||||
atoi(optarg);
|
atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'Y':
|
|
||||||
initialTestParams.fsyncPerWrite = TRUE;
|
|
||||||
break;
|
|
||||||
case 'e':
|
case 'e':
|
||||||
initialTestParams.fsync = TRUE;
|
initialTestParams.fsync = TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -524,13 +513,13 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
case 'l':
|
case 'l':
|
||||||
initialTestParams.storeFileOffset = TRUE;
|
initialTestParams.storeFileOffset = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'm':
|
||||||
|
initialTestParams.multiFile = TRUE;
|
||||||
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
initialTestParams.memoryPerNode =
|
initialTestParams.memoryPerNode =
|
||||||
NodeMemoryStringToBytes(optarg);
|
NodeMemoryStringToBytes(optarg);
|
||||||
break;
|
break;
|
||||||
case 'm':
|
|
||||||
initialTestParams.multiFile = TRUE;
|
|
||||||
break;
|
|
||||||
case 'n':
|
case 'n':
|
||||||
initialTestParams.noFill = TRUE;
|
initialTestParams.noFill = TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -553,6 +542,9 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
case 'q':
|
case 'q':
|
||||||
initialTestParams.quitOnError = TRUE;
|
initialTestParams.quitOnError = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'Q':
|
||||||
|
initialTestParams.taskPerNodeOffset = atoi(optarg);
|
||||||
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
initialTestParams.readFile = TRUE;
|
initialTestParams.readFile = TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -593,9 +585,18 @@ IOR_test_t *ParseCommandLine(int argc, char **argv)
|
||||||
case 'x':
|
case 'x':
|
||||||
initialTestParams.singleXferAttempt = TRUE;
|
initialTestParams.singleXferAttempt = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'X':
|
||||||
|
initialTestParams.reorderTasksRandomSeed = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'Y':
|
||||||
|
initialTestParams.fsyncPerWrite = TRUE;
|
||||||
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
initialTestParams.randomOffset = TRUE;
|
initialTestParams.randomOffset = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'Z':
|
||||||
|
initialTestParams.reorderTasksRandom = TRUE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stdout,
|
fprintf(stdout,
|
||||||
"ParseCommandLine: unknown option `-%c'.\n",
|
"ParseCommandLine: unknown option `-%c'.\n",
|
||||||
|
|
Loading…
Reference in New Issue