summaryrefslogtreecommitdiffstats
path: root/src/H5FDlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5FDlog.c')
-rw-r--r--src/H5FDlog.c89
1 files changed, 80 insertions, 9 deletions
diff --git a/src/H5FDlog.c b/src/H5FDlog.c
index ab76e95..08ea9c6 100644
--- a/src/H5FDlog.c
+++ b/src/H5FDlog.c
@@ -26,8 +26,18 @@
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
#endif /* MAX */
+/* 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_QAK_g = 0;
+static hid_t H5FD_LOG_g = 0;
/* File operations */
#define OP_UNKNOWN 0
@@ -66,13 +76,26 @@ 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 */
+ 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; /* Flaver of information written to file location */
+ unsigned char *flavor; /* Flavor of information written to file location */
size_t iosize; /* Size of I/O information buffers */
FILE *logfp; /* Log file pointer */
H5FD_log_fapl_t fa; /*driver-specific file access properties*/
@@ -227,17 +250,17 @@ H5FD_log_init(void)
{
FUNC_ENTER(H5FD_log_init, FAIL);
- if (H5I_VFL!=H5Iget_type(H5FD_QAK_g))
- H5FD_QAK_g = H5FDregister(&H5FD_log_g);
+ if (H5I_VFL!=H5Iget_type(H5FD_LOG_g))
+ H5FD_LOG_g = H5FDregister(&H5FD_log_g);
- FUNC_LEAVE(H5FD_QAK_g);
+ FUNC_LEAVE(H5FD_LOG_g);
}
/*-------------------------------------------------------------------------
* Function: H5Pset_fapl_log
*
- * Purpose: Modify the file access property list to use the H5FD_QAK
+ * Purpose: Modify the file access property list to use the H5FD_LOG
* driver defined in this source file. There are no driver
* specific properties.
*
@@ -264,7 +287,7 @@ H5Pset_fapl_log(hid_t fapl_id, const char *logfile, int verbosity)
fa.logfile = H5MM_xstrdup(logfile);
fa.verbosity=verbosity;
- ret_value= H5Pset_driver(fapl_id, H5FD_QAK, &fa);
+ ret_value= H5Pset_driver(fapl_id, H5FD_LOG, &fa);
FUNC_LEAVE(ret_value);
}
@@ -436,6 +459,10 @@ 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;
@@ -454,7 +481,7 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id,
/* Check if we are doing any logging at all */
if(file->fa.verbosity>=0) {
- file->iosize=3000000; /* Default size for now */
+ file->iosize=TRACK_BUFFER; /* Default size for now */
file->nread=H5MM_calloc(file->iosize);
file->nwrite=H5MM_calloc(file->iosize);
file->flavor=H5MM_calloc(file->iosize);
@@ -631,9 +658,48 @@ 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);
+#endif /* QAK */
/* Retain the (first) flavor of the information written to the file */
if(file->fa.verbosity>=0) {
assert(addr<file->iosize);
@@ -879,6 +945,11 @@ H5FD_log_write(H5FD_t *_file, hid_t UNUSED dxpl_id, haddr_t addr,
while(tmp_size-->0)
file->nwrite[tmp_addr++]++;
+ /* Log information about the seek, if it's going to occur */
+ if(file->fa.verbosity>1 && (addr!=file->pos || OP_WRITE!=file->op))
+ HDfprintf(file->logfp,"Seek: From %10a To %10a\n",file->pos,addr);
+
+ /* Log information about the write */
if(file->fa.verbosity>0)
HDfprintf(file->logfp,"%10a-%10a (%10lu bytes) Written, flavor=%s\n",addr,addr+size-1,(unsigned long)size,flavors[file->flavor[addr]]);
}