mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-09 07:32:32 +08:00
[svn-r2497] Removing metadata aggregation & accumulation prototyping code (it's in H5FD.c
now) and updated driver to add the new VFL 'query' call.
This commit is contained in:
parent
a3b9c876e1
commit
362baf1299
114
src/H5FDlog.c
114
src/H5FDlog.c
@ -18,6 +18,7 @@
|
||||
#include <H5Eprivate.h> /*error handling */
|
||||
#include <H5Fprivate.h> /*files */
|
||||
#include <H5FDlog.h> /* logging file driver */
|
||||
#include <H5FLprivate.h> /*Free Lists */
|
||||
#include <H5MMprivate.h> /* Memory allocation */
|
||||
#include <H5Pprivate.h> /*property lists */
|
||||
|
||||
@ -29,13 +30,6 @@
|
||||
/* The size of the buffer to track allocation requests */
|
||||
#define TRACK_BUFFER 5000000
|
||||
|
||||
#define AGGREGATE_METADATA
|
||||
|
||||
#ifdef AGGREGATE_METADATA
|
||||
/* Define the default size of the minimum metadata block */
|
||||
#define METADATA_BLOCK_SIZE 2048
|
||||
#endif /* AGGREGATE_METADATA */
|
||||
|
||||
/* The driver identification number, initialized at runtime */
|
||||
static hid_t H5FD_LOG_g = 0;
|
||||
|
||||
@ -76,23 +70,10 @@ static const char *flavors[]={ /* These are defined in H5FDpublic.h */
|
||||
typedef struct H5FD_log_t {
|
||||
H5FD_t pub; /*public stuff, must be first */
|
||||
int fd; /*the unix file */
|
||||
#ifdef AGGREGATE_METADATA
|
||||
haddr_t eoma; /* End of metadata allocated region */
|
||||
hsize_t masize; /* Current size of metadata allocated region left */
|
||||
hsize_t def_masize; /* Default size of metadata allocated region */
|
||||
haddr_t eoa; /* Actual end of allocated region */
|
||||
#else /* AGGREGATE_METADATA */
|
||||
haddr_t eoa; /*end of allocated region */
|
||||
#endif /* AGGREGATE_METADATA */
|
||||
haddr_t eof; /*end of file; current file size*/
|
||||
haddr_t pos; /*current file I/O position */
|
||||
int op; /*last operation */
|
||||
#ifdef ACCUMULATE_METADATA
|
||||
unsigned char *meta_accum; /* Buffer to hold the accumulated metadata */
|
||||
haddr_t accum_loc; /* File location (offset) of the accumulated metadata */
|
||||
hsize_t accum_size; /* Size of the accumulated metadata (in bytes) */
|
||||
uintn accum_dirty; /* Flag to indicate that the accumulated metadata is dirty */
|
||||
#endif /* ACCUMULATE_METADATA */
|
||||
unsigned char *nread; /* Number of reads from a file location */
|
||||
unsigned char *nwrite; /* Number of write to a file location */
|
||||
unsigned char *flavor; /* Flavor of information written to file location */
|
||||
@ -172,13 +153,14 @@ static H5FD_t *H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id,
|
||||
haddr_t maxaddr);
|
||||
static herr_t H5FD_log_close(H5FD_t *_file);
|
||||
static int H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
|
||||
static herr_t H5FD_log_query(const H5FD_t *_f1, unsigned long *flags);
|
||||
static haddr_t H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size);
|
||||
static haddr_t H5FD_log_get_eoa(H5FD_t *_file);
|
||||
static herr_t H5FD_log_set_eoa(H5FD_t *_file, haddr_t addr);
|
||||
static haddr_t H5FD_log_get_eof(H5FD_t *_file);
|
||||
static herr_t H5FD_log_read(H5FD_t *_file, hid_t fapl_id, haddr_t addr,
|
||||
hsize_t size, void *buf);
|
||||
static herr_t H5FD_log_write(H5FD_t *_file, hid_t fapl_id, haddr_t addr,
|
||||
static herr_t H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
|
||||
hsize_t size, const void *buf);
|
||||
static herr_t H5FD_log_flush(H5FD_t *_file);
|
||||
|
||||
@ -211,6 +193,7 @@ static const H5FD_class_t H5FD_log_g = {
|
||||
H5FD_log_open, /*open */
|
||||
H5FD_log_close, /*close */
|
||||
H5FD_log_cmp, /*cmp */
|
||||
H5FD_log_query, /*query */
|
||||
H5FD_log_alloc, /*alloc */
|
||||
NULL, /*free */
|
||||
H5FD_log_get_eoa, /*get_eoa */
|
||||
@ -285,7 +268,10 @@ H5Pset_fapl_log(hid_t fapl_id, const char *logfile, int verbosity)
|
||||
if (H5P_FILE_ACCESS!=H5Pget_class(fapl_id))
|
||||
HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl");
|
||||
|
||||
fa.logfile = H5MM_xstrdup(logfile);
|
||||
if(logfile!=NULL)
|
||||
fa.logfile = H5MM_xstrdup(logfile);
|
||||
else
|
||||
fa.logfile = NULL;
|
||||
fa.verbosity=verbosity;
|
||||
ret_value= H5Pset_driver(fapl_id, H5FD_LOG, &fa);
|
||||
|
||||
@ -386,7 +372,8 @@ H5FD_log_fapl_free(void *_fa)
|
||||
FUNC_ENTER(H5FD_log_fapl_free, FAIL);
|
||||
|
||||
/* Free the fapl information */
|
||||
H5MM_xfree(fa->logfile);
|
||||
if(fa->logfile)
|
||||
H5MM_xfree(fa->logfile);
|
||||
H5MM_xfree(fa);
|
||||
|
||||
FUNC_LEAVE(SUCCEED);
|
||||
@ -459,10 +446,6 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id,
|
||||
fa = H5Pget_driver_info(fapl_id);
|
||||
|
||||
file->fd = fd;
|
||||
#ifdef AGGREGATE_METADATA
|
||||
/* Set the default metadata block size, this could easily be user-tunable */
|
||||
file->def_masize=METADATA_BLOCK_SIZE;
|
||||
#endif /* AGGREGATE_METADATA */
|
||||
file->eof = sb.st_size;
|
||||
file->pos = HADDR_UNDEF;
|
||||
file->op = OP_UNKNOWN;
|
||||
@ -520,6 +503,7 @@ H5FD_log_close(H5FD_t *_file)
|
||||
|
||||
if (H5FD_log_flush(_file)<0)
|
||||
HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to flush file");
|
||||
|
||||
if (close(file->fd)<0)
|
||||
HRETURN_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file");
|
||||
|
||||
@ -633,6 +617,41 @@ H5FD_log_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
|
||||
FUNC_LEAVE(ret_value);
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5FD_log_query
|
||||
*
|
||||
* Purpose: Set the flags that this VFL driver is capable of supporting.
|
||||
* (listed in H5FDpublic.h)
|
||||
*
|
||||
* Return: Success: non-negative
|
||||
*
|
||||
* Failure: negative
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Friday, August 25, 2000
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5FD_log_query(const H5FD_t *_f, unsigned long *flags /* out */)
|
||||
{
|
||||
const H5FD_log_t *f = (const H5FD_log_t*)_f;
|
||||
herr_t ret_value=SUCCEED;
|
||||
|
||||
FUNC_ENTER(H5FD_log_query, FAIL);
|
||||
|
||||
/* Set the VFL feature flags that this driver supports */
|
||||
if(flags) {
|
||||
*flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
|
||||
*flags|=H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
|
||||
} /* end if */
|
||||
|
||||
FUNC_LEAVE(ret_value);
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5FD_log_alloc
|
||||
@ -658,44 +677,8 @@ H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size)
|
||||
|
||||
FUNC_ENTER(H5FD_log_alloc, HADDR_UNDEF);
|
||||
|
||||
#ifdef AGGREGATE_METADATA
|
||||
/* Allocate all types of metadata out of the metadata block */
|
||||
if(type!=H5FD_MEM_DRAW) {
|
||||
/* Check if the space requested is larger than the space left in the block */
|
||||
if(size>file->masize) {
|
||||
/* Check if the block asked for is too large for a metadata block */
|
||||
if(size>=file->def_masize) {
|
||||
/* Allocate just enough room for this new block the regular way */
|
||||
addr = file->eoa;
|
||||
file->eoa += size;
|
||||
} /* end if */
|
||||
else {
|
||||
/* Allocate another metadata block */
|
||||
file->eoma=file->eoa;
|
||||
file->masize=file->def_masize;
|
||||
file->eoa += file->masize;
|
||||
|
||||
/* Allocate space out of the metadata block */
|
||||
addr=file->eoma;
|
||||
file->masize-=size;
|
||||
file->eoma+=size;
|
||||
} /* end else */
|
||||
} /* end if */
|
||||
else {
|
||||
/* Allocate space out of the metadata block */
|
||||
addr=file->eoma;
|
||||
file->masize-=size;
|
||||
file->eoma+=size;
|
||||
} /* end else */
|
||||
} /* end if */
|
||||
else { /* Allocate raw data the regular way */
|
||||
addr = file->eoa;
|
||||
file->eoa += size;
|
||||
} /* end else */
|
||||
#else /* AGGREGATE_METADATA */
|
||||
addr = file->eoa;
|
||||
file->eoa += size;
|
||||
#endif /* AGGREGATE_METADATA */
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: flavor=%s, size=%lu\n",FUNC,flavors[type],(unsigned long)size);
|
||||
@ -917,7 +900,7 @@ H5FD_log_read(H5FD_t *_file, hid_t UNUSED dxpl_id, haddr_t addr,
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5FD_log_write(H5FD_t *_file, hid_t UNUSED dxpl_id, haddr_t addr,
|
||||
H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t UNUSED dxpl_id, haddr_t addr,
|
||||
hsize_t size, const void *buf)
|
||||
{
|
||||
H5FD_log_t *file = (H5FD_log_t*)_file;
|
||||
@ -928,6 +911,9 @@ H5FD_log_write(H5FD_t *_file, hid_t UNUSED dxpl_id, haddr_t addr,
|
||||
assert(file && file->pub.cls);
|
||||
assert(buf);
|
||||
|
||||
/* Verify that we are writing out the type of data we allocated in this location */
|
||||
assert(type==file->flavor[addr]);
|
||||
|
||||
/* Check for overflow conditions */
|
||||
if (HADDR_UNDEF==addr)
|
||||
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined");
|
||||
|
Loading…
Reference in New Issue
Block a user