/*****************************************************************************
- * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010
*****************************************************************************
* rrd_open.c Open an RRD File
*****************************************************************************
* $Id$
*****************************************************************************/
+#ifdef WIN32
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_BROKEN_MS_ASYNC
+#include <sys/types.h>
#include <utime.h>
+#endif
#include "rrd_tool.h"
#include "unused.h"
#define MEMBLK 8192
#ifdef WIN32
-# define random() rand()
-# define srandom(x) srand(x)
-# define getpid() 0
-
#define _LK_UNLCK 0 /* Unlock */
#define _LK_LOCK 1 /* Lock */
#define _LK_NBLCK 2 /* Non-blocking lock */
#endif
#endif
-long int rra_random_row(
- rra_def_t *);
-
-
/* Open a database file, return its header and an open filehandle,
* positioned to the first cdp in the first rra.
* In the error path of rrd_open, only rrd_free(&rrd) has to be called
/* Are we creating a new file? */
if((rdwr & RRD_CREAT) && (rrd->stat_head != NULL))
{
- header_len = \
- sizeof(stat_head_t) + \
- sizeof(ds_def_t) * rrd->stat_head->ds_cnt + \
- sizeof(rra_def_t) * rrd->stat_head->rra_cnt + \
- sizeof(time_t) + \
- sizeof(live_head_t) + \
- sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt + \
- sizeof(cdp_prep_t) * rrd->stat_head->ds_cnt * rrd->stat_head->rra_cnt + \
- sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt;
+ header_len = rrd_get_header_size(rrd);
value_cnt = 0;
for (ui = 0; ui < rrd->stat_head->rra_cnt; ui++)
if (rdwr & RRD_CREAT) {
flags |= (O_CREAT | O_TRUNC);
}
+ if (rdwr & RRD_EXCL) {
+ flags |= O_EXCL;
+ }
}
if (rdwr & RRD_READAHEAD) {
#ifdef MAP_POPULATE
} else {
rrd_file->file_len = newfile_size;
lseek(rrd_simple_file->fd, newfile_size - 1, SEEK_SET);
- write(rrd_simple_file->fd, "\0", 1); /* poke */
+ if ( write(rrd_simple_file->fd, "\0", 1) == -1){ /* poke */
+ rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno));
+ goto out_close;
+ }
lseek(rrd_simple_file->fd, 0, SEEK_SET);
}
#ifdef HAVE_POSIX_FADVISE
#ifdef USE_MADVISE
if (rdwr & RRD_COPY) {
/* We will read everything in a moment (copying) */
- madvise(data, rrd_file->file_len, MADV_WILLNEED | MADV_SEQUENTIAL);
+ madvise(data, rrd_file->file_len, MADV_WILLNEED );
+ madvise(data, rrd_file->file_len, MADV_SEQUENTIAL );
} else {
/* We do not need to read anything in for the moment */
madvise(data, rrd_file->file_len, MADV_RANDOM);
/* the stat_head will be needed soonish, so hint accordingly */
- madvise(data, sizeof(stat_head_t), MADV_WILLNEED | MADV_RANDOM);
+ madvise(data, sizeof(stat_head_t), MADV_WILLNEED);
+ madvise(data, sizeof(stat_head_t), MADV_RANDOM);
}
#endif
size_t dontneed_start;
size_t rra_start;
size_t active_block;
- unsigned long i;
+ size_t i;
ssize_t _page_size = sysconf(_SC_PAGESIZE);
if (rrd_file == NULL) {
#if defined DEBUG && DEBUG > 1
mincore_print(rrd_file, "after");
#endif
-#endif /* without madvise and posix_fadvise ist does not make much sense todo anything */
+#endif /* without madvise and posix_fadvise it does not make much sense todo anything */
}
}
-/* flush all data pending to be written to FD. */
-
+/* this is a leftover from the old days, it serves no purpose
+ and is therefore turned into a no-op */
void rrd_flush(
- rrd_file_t *rrd_file)
+ rrd_file_t UNUSED(*rrd_file))
{
-#ifndef WIN32
- rrd_simple_file_t *rrd_simple_file;
- rrd_simple_file = (rrd_simple_file_t *)rrd_file->pvt;
- if (fdatasync(rrd_simple_file->fd) != 0) {
- rrd_set_error("flushing fd %d: %s", rrd_simple_file->fd,
- rrd_strerror(errno));
- }
-#endif
}
-
/* Initialize RRD header. */
void rrd_init(
* aligning RRAs within stripes, or other performance enhancements
*/
void rrd_notify_row(
- rrd_file_t *rrd_file __attribute__((unused)),
- int rra_idx __attribute__((unused)),
- unsigned long rra_row __attribute__((unused)),
- time_t rra_time __attribute__((unused)))
+ rrd_file_t UNUSED(*rrd_file),
+ int UNUSED(rra_idx),
+ unsigned long UNUSED(rra_row),
+ time_t UNUSED(rra_time))
{
}
* don't change to a new disk block at the same time
*/
unsigned long rrd_select_initial_row(
- rrd_file_t *rrd_file __attribute__((unused)),
- int rra_idx __attribute__((unused)),
+ rrd_file_t UNUSED(*rrd_file),
+ int UNUSED(rra_idx),
rra_def_t *rra
)
{
- return rra_random_row(rra);
+ return rrd_random() % rra->row_cnt;
}
-
-static int rand_init = 0;
-
-long int rra_random_row(
- rra_def_t *rra)
-{
- if (!rand_init) {
- srandom((unsigned int) time(NULL) + (unsigned int) getpid());
- rand_init++;
- }
-
- return random() % rra->row_cnt;
-}
-