Patch for read only access for i386 on x86_64 and x86_64 on i386
Camilo Viecco <[email protected]>
| Newsgroups | gmane.comp.db.rrdtool.devel |
|---|---|
| Message-ID | <[email protected]> |
Hello list At work we have a large archive rrdfiles crerated on i386 and we need to use x86_64 on some newer machines. Long story short I needed to access both 64 bit data from 32 bit hosts and vice versa. Since the common data format is still pending I created this patches to solve my problem. I am posting to the list with the hope thay are useful. these are intel specific patches I know they are of limited use. Next step is to have updates working correctly on both architectures. Camilo Viecco _______________________________________________ rrd-developers mailing list [email protected] https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
multifile.diff
(text/x-diff, 31.5 KB)
Only in rrdtool-1.4.2/bindings/lua: .deps
Only in rrdtool-1.4.2/bindings/lua: Makefile
Only in rrdtool-1.4.2/bindings: Makefile
Only in rrdtool-1.4.2/bindings/perl-piped: Makefile.old
Only in rrdtool-1.4.2/bindings/perl-shared: Makefile.old
Only in rrdtool-1.4.2/bindings/ruby: mkmf.log
Only in rrdtool-1.4.2/bindings/tcl: ifOctets.tcl
Only in rrdtool-1.4.2/bindings/tcl: Makefile
Only in rrdtool-1.4.2/bindings/tcl: pkgIndex.tcl
Only in rrdtool-1.4.2/bindings/tcl: tclrrd1.4.2.so
Only in rrdtool-1.4.2: config.h
Only in rrdtool-1.4.2: config.log
Only in rrdtool-1.4.2: config.status
Only in rrdtool-1.4.2/doc: Makefile
Only in rrdtool-1.4.2/doc: pod2htmd.tmp
Only in rrdtool-1.4.2/doc: pod2htmi.tmp
Only in rrdtool-1.4.2/doc: RRDp.pod
Only in rrdtool-1.4.2/doc: RRDs.pod
Only in rrdtool-1.4.2/examples: 4charts.pl
Only in rrdtool-1.4.2/examples: bigtops.pl
Only in rrdtool-1.4.2/examples: cgi-demo.cgi
Only in rrdtool-1.4.2/examples: Makefile
Only in rrdtool-1.4.2/examples: minmax.pl
Only in rrdtool-1.4.2/examples: perftest.pl
Only in rrdtool-1.4.2/examples: piped-demo.pl
Only in rrdtool-1.4.2/examples/rrdcached: Makefile
Only in rrdtool-1.4.2/examples: shared-demo.pl
Only in rrdtool-1.4.2/examples: stripes.pl
Only in rrdtool-1.4.2/intl: Makefile
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/libtool rrdtool-1.4.2/libtool
--- rrdtool-1.4.2-orig/libtool 2009-11-15 11:55:33.000000000 +0000
+++ rrdtool-1.4.2/libtool 2010-03-01 16:32:52.000000000 +0000
@@ -1,8 +1,8 @@
-#! /bin/bash
+#! /bin/sh
# libtool - Provide generalized library-building support services.
# Generated automatically by config.status (rrdtool) 1.4.2
-# Libtool was configured on host froburg:
+# Libtool was configured on host gmoc-dev.grnoc.iu.edu:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
@@ -56,12 +56,12 @@
# The host system.
host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-pc-linux-gnu
host_os=linux-gnu
# The build system.
build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-pc-linux-gnu
build_os=linux-gnu
# A sed program that does not truncate output.
@@ -86,7 +86,7 @@
LN_S="ln -s"
# What is the maximum length of a command?
-max_cmd_len=1572864
+max_cmd_len=98304
# Object file suffix (normally "o").
objext=o
@@ -150,7 +150,7 @@
objdir=.libs
# Shell to use when invoking shell scripts.
-SHELL="/bin/bash"
+SHELL="/bin/sh"
# An echo program that does not interpret backslashes.
ECHO="echo"
@@ -234,10 +234,10 @@
hardcode_into_libs=yes
# Compile-time system search path for libraries.
-sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.3.3 /usr/lib /lib"
+sys_lib_search_path_spec="/usr/lib/gcc/i386-redhat-linux/4.1.2 /usr/lib /lib"
# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib32/alsa-lib /usr/lib/alsa-lib /usr/local/lib /opt/SUNWut/lib /usr/pack/srss-4.1-mo/usr/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/qt-3.3/lib "
# Whether dlopen is supported.
dlopen_support=unknown
@@ -254,7 +254,7 @@
# The linker used to build libraries.
-LD="/usr/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
# Commands used to build an old-style archive.
old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib"
Only in rrdtool-1.4.2: Makefile
Only in rrdtool-1.4.2: mmaptestAfHpZh
Only in rrdtool-1.4.2/po: Makefile
Only in rrdtool-1.4.2/po: Makefile.in
Only in rrdtool-1.4.2/po: POTFILES
Only in rrdtool-1.4.2/po: remove-potcdate.sed
Only in rrdtool-1.4.2: rrd_config.h
Only in rrdtool-1.4.2/src: .deps
Only in rrdtool-1.4.2/src: librrd.pc
Only in rrdtool-1.4.2/src: librrd.sym
Only in rrdtool-1.4.2/src: librrd.sym.in
Only in rrdtool-1.4.2/src: Makefile
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_format.h rrdtool-1.4.2/src/rrd_format.h
--- rrdtool-1.4.2-orig/src/rrd_format.h 2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_format.h 2010-03-01 15:44:53.000000000 +0000
@@ -20,6 +20,7 @@
#endif
#include "rrd.h"
+#include <stdint.h>
/*****************************************************************************
* put this in your /usr/lib/magic file (/etc/magic on HPUX)
@@ -37,11 +38,21 @@
#define RRD_VERSION3 "0003"
#define FLOAT_COOKIE 8.642135E130
+#define MULTI_FORMAT
+
typedef union unival {
- unsigned long u_cnt;
+ uint64_t u_cnt_64;
+ uint32_t u_cnt_32;
+ unsigned long u_cnt;
rrd_value_t u_val;
} unival;
+typedef enum format_compat_t { FILE_NATIVE = 0, /* data source types available */
+ FILE_i386,
+ FILE_x86_64,
+ FILE_UNKNOWN
+}format_compat_t;
+
/****************************************************************************
* The RRD Database Structure
@@ -130,6 +141,51 @@
} stat_head_t;
+typedef struct stat_head_32_t {
+
+ /* Data Base Identification Section ** */
+ char cookie[4]; /* RRD */
+ char version[8]; /* version of the format */
+ double float_cookie __attribute((packed)) ; /* is it the correct double
+ * representation ? */
+
+ /* Data Base Structure Definition **** */
+ uint32_t ds_cnt __attribute((packed));
+ /* how many different ds provide
+ * input to the rrd */
+ uint32_t rra_cnt __attribute((packed));
+ /* how many rras will be maintained
+ * in the rrd */
+ uint32_t pdp_step __attribute((packed)) ;
+ /* pdp interval in seconds */
+
+ unival par[10] __attribute((packed)); /* global parameters ... unused
+ at the moment */
+} stat_head_32_t;
+
+typedef struct stat_head_64_t {
+
+ /* Data Base Identification Section ** */
+ char cookie[4]; /* RRD */
+ char version[12]; /* version of the format */
+ double float_cookie __attribute((packed)) ; /* is it the correct double
+ * representation ? */
+
+ /* Data Base Structure Definition **** */
+ uint64_t ds_cnt __attribute((packed));
+ /* how many different ds provide
+ * input to the rrd */
+ uint64_t rra_cnt __attribute((packed));
+ /* how many rras will be maintained
+ * in the rrd */
+ uint64_t pdp_step __attribute((packed)) ;
+ /* pdp interval in seconds */
+
+ unival par[10] __attribute((packed)); /* global parameters ... unused
+ at the moment */
+} stat_head_64_t;
+
+
/****************************************************************************
* POS 2: ds_def_t (* ds_cnt) Data Source definitions
****************************************************************************/
@@ -266,6 +322,27 @@
} rra_def_t;
+typedef struct rra_def_32_t {
+ char cf_nam[CF_NAM_SIZE] ; /* consolidation function (null term) */
+ uint32_t row_cnt __attribute((packed)) ; /* number of entries in the store */
+ uint32_t pdp_cnt __attribute((packed)) ; /* how many primary data points are
+ * required for a consolidated data
+ * point?*/
+ unival par[MAX_RRA_PAR_EN] __attribute((packed)) ; /* index see rra_param_en */
+
+} rra_def_32_t;
+
+typedef struct rra_def_64_t {
+ char cf_nam[CF_NAM_SIZE] ; /* consolidation function (null term) */
+ uint8_t align[4];
+ uint64_t row_cnt __attribute((packed)) ; /* number of entries in the store */
+ uint64_t pdp_cnt __attribute((packed)) ; /* how many primary data points are
+ * required for a consolidated data
+ * point?*/
+ unival par[MAX_RRA_PAR_EN] __attribute((packed)) ; /* index see rra_param_en */
+
+} rra_def_64_t;
+
/****************************************************************************
****************************************************************************
@@ -285,6 +362,22 @@
} live_head_t;
+
+typedef struct live_head_32_t {
+ uint32_t last_up __attribute((packed)) ; /* when was rrd last updated */
+ uint32_t last_up_usec __attribute((packed)); /* micro seconds part of the
+ update timestamp. Always >= 0 */
+} live_head_32_t;
+
+
+typedef struct live_head_64_t {
+ uint64_t last_up __attribute((packed)) ; /* when was rrd last updated */
+ uint64_t last_up_usec __attribute((packed)); /* micro seconds part of the
+ update timestamp. Always >= 0 */
+} live_head_64_t;
+
+
+
/****************************************************************************
* POS 5: pdp_prep_t (* ds_cnt) here we prepare the pdps
****************************************************************************/
@@ -385,6 +478,14 @@
unsigned long cur_row; /* current row in the rra */
} rra_ptr_t;
+typedef struct rra_ptr_32_t {
+ uint32_t cur_row; /* current row in the rra */
+} rra_ptr_32_t;
+
+typedef struct rra_ptr_64_t {
+ uint64_t cur_row; /* current row in the rra */
+} rra_ptr_64_t;
+
/****************************************************************************
****************************************************************************
@@ -392,6 +493,7 @@
****************************************************************************
****************************************************************************/
typedef struct rrd_t {
+ format_compat_t compat; /* the on disk representation*/
stat_head_t *stat_head; /* the static header */
ds_def_t *ds_def; /* list of data source definitions */
rra_def_t *rra_def; /* list of round robin archive def */
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_open.c rrdtool-1.4.2/src/rrd_open.c
--- rrdtool-1.4.2-orig/src/rrd_open.c 2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_open.c 2010-03-01 16:12:31.000000000 +0000
@@ -80,6 +80,8 @@
#endif
#endif
+
+
/* 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
@@ -99,6 +101,22 @@
int flags = 0;
int version;
+
+ format_compat_t file_format=FILE_NATIVE;
+ stat_head_64_t *stat_head_64;
+ stat_head_32_t *stat_head_32;
+ rra_def_32_t *rra_def_32;
+ rra_def_64_t *rra_def_64;
+ live_head_32_t *live_head_32;
+ live_head_64_t *live_head_64;
+ rra_ptr_32_t *rra_ptr_32;
+ rra_ptr_64_t *rra_ptr_64;
+
+#define TRANS_BUF_SIZE 12288
+ char trans_buf[TRANS_BUF_SIZE];
+
+
+
#ifdef HAVE_MMAP
ssize_t _page_size = sysconf(_SC_PAGESIZE);
char *data = MAP_FAILED;
@@ -273,6 +291,115 @@
}
#endif
+#ifdef MULTI_FORMAT
+ if (RRD_READONLY == (rdwr & RRD_READONLY) || 1==1 ){
+ /*try native first*/
+#ifdef DEBUG_MF
+ fprintf(stderr,"trying multi-format\n");
+#endif
+
+ __rrd_read(rrd->stat_head, stat_head_t,
+ 1);
+
+ /* lets do some test if we are on track ... */
+ if (memcmp(rrd->stat_head->cookie, RRD_COOKIE, sizeof(RRD_COOKIE)) != 0) {
+ rrd_set_error("'%s' is not an RRD file", file_name);
+ goto out_nullify_head;
+ }
+ file_format=FILE_NATIVE;
+ rrd->compat=FILE_NATIVE;
+ if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+ //fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+ //fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+//rrd_set_error("This RRD was created on another architecture");
+ //rrd_set_error("This RRD was created on another architecture");
+#ifndef HAVE_MMAP
+ lseek(rrd_file->fd,0,SEEK_SET);
+ offset=0;
+#endif
+ offset=0;
+ /*try 32bit arch*/
+ rrd->stat_head=malloc(sizeof(stat_head_64_t));
+ if(NULL==rrd->stat_head){
+ goto out_nullify_head;
+ }
+ stat_head_32=(stat_head_32_t *)trans_buf;
+ stat_head_64=(stat_head_64_t *)trans_buf;
+ __rrd_read(stat_head_32, stat_head_32_t,
+ 1);
+
+ //convert to native(32)
+ memcpy(rrd->stat_head->cookie,stat_head_32->cookie,4);
+ memcpy(rrd->stat_head->version,stat_head_32->version,5);
+ rrd->stat_head->float_cookie=stat_head_32->float_cookie;
+ rrd->stat_head->ds_cnt=stat_head_32->ds_cnt;
+ rrd->stat_head->rra_cnt=stat_head_32->rra_cnt;
+ rrd->stat_head->pdp_step=stat_head_32->pdp_step;
+ memcpy( rrd->stat_head->par, stat_head_32->par, sizeof(unival)*10);
+
+
+ if (rrd->stat_head->float_cookie == FLOAT_COOKIE) {
+ file_format=FILE_i386;
+ rrd->compat=FILE_i386;
+ //fprintf(stderr,"is 32!\n");
+
+ }
+ else{
+ //try 64
+#ifndef HAVE_MMAP
+ lseek(rrd_file->fd,0,SEEK_SET);
+ offset=0;
+#endif
+ offset=0;
+
+
+ __rrd_read(stat_head_64, stat_head_64_t,
+ 1);
+ rrd->stat_head->float_cookie=stat_head_64->float_cookie;
+ rrd->stat_head->ds_cnt=stat_head_64->ds_cnt;
+ rrd->stat_head->rra_cnt=stat_head_64->rra_cnt;
+ rrd->stat_head->pdp_step=stat_head_64->pdp_step;
+ memcpy( rrd->stat_head->par, stat_head_64->par, sizeof(unival)*10);
+ if (rrd->stat_head->float_cookie == FLOAT_COOKIE) {
+ file_format=FILE_x86_64;
+ rrd->compat=FILE_x86_64;
+
+ }
+ else{
+
+ rrd_set_error("This RRD was created with an incompatible architecture/compiler");
+ goto out_nullify_head;
+
+
+ }
+
+ }
+ }
+
+ }
+ else{
+ /*do native the native branch*/
+
+ __rrd_read(rrd->stat_head, stat_head_t,
+ 1);
+
+ /* lets do some test if we are on track ... */
+ if (memcmp(rrd->stat_head->cookie, RRD_COOKIE, sizeof(RRD_COOKIE)) != 0) {
+ rrd_set_error("'%s' is not an RRD file", file_name);
+ goto out_nullify_head;
+ }
+
+ if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+ //fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+ //fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+
+ rrd_set_error("This RRD was created on another architecture");
+ goto out_nullify_head;
+ }
+
+ }
+#else
+
__rrd_read(rrd->stat_head, stat_head_t,
1);
@@ -283,10 +410,20 @@
}
if (rrd->stat_head->float_cookie != FLOAT_COOKIE) {
+ fprintf(stderr,"file=%f cookie=%f\n",rrd->stat_head->float_cookie,FLOAT_COOKIE);
+ fprintf(stderr,"file(inhex)=%u\n",(unsigned long ) rrd->stat_head->float_cookie);
+
rrd_set_error("This RRD was created on another architecture");
goto out_nullify_head;
}
+#endif
+
+ //cviecco
+ //fprintf(stderr, "ds_cnt=%u \n", rrd->stat_head->ds_cnt);
+ //fprintf(stderr, "rra_cnt=%u \n", rrd->stat_head->rra_cnt);
+ //fprintf(stderr, "pdp_step=%u \n", rrd->stat_head->pdp_step);
+
version = atoi(rrd->stat_head->version);
if (version > atoi(RRD_VERSION)) {
@@ -299,6 +436,8 @@
madvise(data + PAGE_START(offset),
sizeof(ds_def_t) * rrd->stat_head->ds_cnt, MADV_WILLNEED);
#endif
+
+ //wow this one if platform independent!
__rrd_read(rrd->ds_def, ds_def_t,
rrd->stat_head->ds_cnt);
@@ -307,11 +446,67 @@
madvise(data + PAGE_START(offset),
sizeof(rra_def_t) * rrd->stat_head->rra_cnt, MADV_WILLNEED);
#endif
- __rrd_read(rrd->rra_def, rra_def_t,
- rrd->stat_head->rra_cnt);
+ switch(file_format){
+ case FILE_NATIVE:
+ __rrd_read(rrd->rra_def, rra_def_t,
+ rrd->stat_head->rra_cnt);
+ break;
+ case FILE_i386:
+ rra_def_32=(rra_def_32_t *) trans_buf;
+ rrd->rra_def=malloc(sizeof(rra_def_t)*rrd->stat_head->rra_cnt);
+ if(NULL==rrd->rra_def){
+ goto out_nullify_head;
+ }
+ __rrd_read(rra_def_32, rra_def_32_t,
+ rrd->stat_head->rra_cnt);
+ //now convert to native
+ {
+ uint32_t i;
+ for(i=0;i<rrd->stat_head->rra_cnt;i++){
+ memcpy(rrd->rra_def[i].cf_nam,rra_def_32[i].cf_nam,
+ CF_NAM_SIZE);
+ rrd->rra_def[i].row_cnt=rra_def_32[i].row_cnt;
+ rrd->rra_def[i].pdp_cnt=rra_def_32[i].pdp_cnt;
+ memcpy(rrd->rra_def[i].par,rra_def_32[i].par,sizeof(unival)*MAX_RRA_PAR_EN);
+ }
+ }
+ break;
+
+ case FILE_x86_64:
+ rra_def_64=(rra_def_64_t *) trans_buf;
+ rrd->rra_def=malloc(sizeof(rra_def_t)*rrd->stat_head->rra_cnt);
+ if(NULL==rrd->rra_def){
+ goto out_nullify_head;
+ }
+ __rrd_read(rra_def_64, rra_def_64_t,
+ rrd->stat_head->rra_cnt);
+ //now convert to native
+ {
+ uint32_t i;
+ for(i=0;i<rrd->stat_head->rra_cnt;i++){
+ memcpy(rrd->rra_def[i].cf_nam,rra_def_64[i].cf_nam,
+ CF_NAM_SIZE);
+ rrd->rra_def[i].row_cnt=rra_def_64[i].row_cnt;
+ rrd->rra_def[i].pdp_cnt=rra_def_64[i].pdp_cnt;
+ //cviecco
+ //fprintf(stderr,"rra[%i] '%s' num_rows=%lu pdp_cnt%lu\n",i,rrd->rra_def[i].cf_nam,rrd->rra_def[i].row_cnt,rrd->rra_def[i].pdp_cnt);
+ //fprintf(stderr,"read rra[%i] '%s' num_rows=%llx pdp_cnt%llx\n",i,rra_def_64[i].cf_nam,rra_def_64[i].row_cnt,rra_def_64[i].pdp_cnt);
+
+ memcpy(rrd->rra_def[i].par,rra_def_64[i].par,sizeof(unival)*MAX_RRA_PAR_EN);
+ }
+ }
+ break;
+ default:
+ fprintf(stderr,"cannot handle file!\n");
+ goto out_nullify_head;
+ }
/* handle different format for the live_head */
if (version < 3) {
+ if(file_format!=FILE_NATIVE){
+ fprintf(stderr,"cannot handle file!, non native low version\n");
+ goto out_nullify_head;
+ }
rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
if (rrd->live_head == NULL) {
rrd_set_error("live_head_t malloc");
@@ -332,15 +527,97 @@
madvise(data + PAGE_START(offset),
sizeof(live_head_t), MADV_WILLNEED);
#endif
- __rrd_read(rrd->live_head, live_head_t,
- 1);
+ switch(file_format){
+ case FILE_NATIVE:
+ __rrd_read(rrd->live_head, live_head_t,
+ 1);
+ break;
+ case FILE_i386:
+ rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
+ if (rrd->live_head == NULL) {
+ rrd_set_error("live_head_t malloc");
+ goto out_close;
+ }
+ live_head_32=(live_head_32_t *) trans_buf;
+ __rrd_read(live_head_32, live_head_32_t,
+ 1);
+ //convert
+ rrd->live_head->last_up=live_head_32->last_up;
+ rrd->live_head->last_up_usec=live_head_32->last_up_usec;
+ break;
+
+ case FILE_x86_64:
+ rrd->live_head = (live_head_t *) malloc(sizeof(live_head_t));
+ if (rrd->live_head == NULL) {
+ rrd_set_error("live_head_t malloc");
+ goto out_close;
+ }
+ live_head_64=(live_head_64_t *) trans_buf;
+ __rrd_read(live_head_64, live_head_64_t,
+ 1);
+ //convert
+ rrd->live_head->last_up=(time_t)live_head_64->last_up;
+ rrd->live_head->last_up_usec= (long) live_head_64->last_up_usec;
+ break;
+
+ default:
+ rrd_set_error("internal error (incompatible file format)");
+ goto out_close;
+ }
}
+ //These two require no conversion!
__rrd_read(rrd->pdp_prep, pdp_prep_t,
rrd->stat_head->ds_cnt);
__rrd_read(rrd->cdp_prep, cdp_prep_t,
rrd->stat_head->rra_cnt * rrd->stat_head->ds_cnt);
- __rrd_read(rrd->rra_ptr, rra_ptr_t,
- rrd->stat_head->rra_cnt);
+
+
+ switch(file_format){
+ case FILE_NATIVE:
+ __rrd_read(rrd->rra_ptr, rra_ptr_t,
+ rrd->stat_head->rra_cnt);
+ break;
+ case FILE_i386:
+ rrd->rra_ptr = (rra_ptr_t *)
+ malloc(sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt);
+ if (rrd->rra_ptr == NULL) {
+ rrd_set_error("rra_ptr_t malloc");
+ goto out_close;
+ }
+ rra_ptr_32=(rra_ptr_32_t *) trans_buf;
+ __rrd_read(rra_ptr_32, rra_ptr_32_t,
+ rrd->stat_head->rra_cnt);
+ {
+ uint32_t i;
+ for(i=0;i<rrd->stat_head->rra_cnt;i++){
+ rrd->rra_ptr[i].cur_row=rra_ptr_32[i].cur_row;
+ }
+ }
+ break;
+
+
+ case FILE_x86_64:
+ rrd->rra_ptr = (rra_ptr_t *)
+ malloc(sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt);
+ if (rrd->rra_ptr == NULL) {
+ rrd_set_error("rra_ptr_t malloc");
+ goto out_close;
+ }
+ rra_ptr_64=(rra_ptr_64_t *) trans_buf;
+ __rrd_read(rra_ptr_64, rra_ptr_64_t,
+ rrd->stat_head->rra_cnt);
+ {
+ uint32_t i;
+ for(i=0;i<rrd->stat_head->rra_cnt;i++){
+ rrd->rra_ptr[i].cur_row=rra_ptr_64[i].cur_row;
+ }
+ }
+ break;
+ }
+
+ //cviecco
+ //fprintf(stderr,"last_up=%u\n", rrd->live_head->last_up);
+ //fprintf(stderr,"last_up_usec=%u\n", rrd->live_head->last_up_usec);
rrd_file->header_len = offset;
rrd_file->pos = offset;
@@ -358,6 +635,10 @@
{
rrd_set_error("'%s' is too small (should be %ld bytes)",
file_name, (long long) correct_len);
+ //cviecco
+ fprintf(stderr,"real_len=%u\n", rrd_file->file_len);
+ fprintf(stderr,"header_len=%u\n", rrd_file->header_len);
+
goto out_nullify_head;
}
}
@@ -706,18 +987,15 @@
/* free RRD header data. */
-#ifdef HAVE_MMAP
void rrd_free(
rrd_t *rrd)
{
+#ifdef HAVE_MMAP
if (rrd->legacy_last_up) { /* this gets set for version < 3 only */
free(rrd->live_head);
}
-}
+
#else
-void rrd_free(
- rrd_t *rrd)
-{
free(rrd->live_head);
free(rrd->stat_head);
free(rrd->ds_def);
@@ -726,8 +1004,9 @@
free(rrd->pdp_prep);
free(rrd->cdp_prep);
free(rrd->rrd_value);
-}
#endif
+}
+
/* routine used by external libraries to free memory allocated by
Only in rrdtool-1.4.2/src: rrd_open.c.orig
Only in rrdtool-1.4.2/src: rrd_open.c.rej
Only in rrdtool-1.4.2/src: .rrd_open.c.rej.swp
diff -ur -x '*.1' -x '*.html' -x '*.txt' -x '*.spec' -x '*.3' rrdtool-1.4.2-orig/src/rrd_update.c rrdtool-1.4.2/src/rrd_update.c
--- rrdtool-1.4.2-orig/src/rrd_update.c 2009-11-15 11:54:23.000000000 +0000
+++ rrdtool-1.4.2/src/rrd_update.c 2010-01-28 16:04:10.000000000 +0000
@@ -271,12 +271,11 @@
rrd_file_t *rrd_file,
unsigned long rra_begin);
-#ifndef HAVE_MMAP
+
static int write_changes_to_disk(
rrd_t *rrd,
rrd_file_t *rrd_file,
int version);
-#endif
/*
* normalize time as returned by gettimeofday. usec part must
@@ -577,11 +576,11 @@
if (rrd_test_error()) {
goto err_free_structures;
}
-#ifndef HAVE_MMAP
+
if (write_changes_to_disk(&rrd, rrd_file, version) == -1) {
goto err_free_structures;
}
-#endif
+
/* calling the smoothing code here guarantees at most one smoothing
* operation per rrd_update call. Unfortunately, it is possible with bulk
@@ -2024,7 +2023,7 @@
return 0;
}
-#ifndef HAVE_MMAP
+
/*
* Flush changes to disk (unless we're using mmap)
*
@@ -2035,52 +2034,138 @@
rrd_file_t *rrd_file,
int version)
{
- /* we just need to write back the live header portion now */
- if (rrd_seek(rrd_file, (sizeof(stat_head_t)
- + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
- + sizeof(rra_def_t) * rrd->stat_head->rra_cnt),
- SEEK_SET) != 0) {
- rrd_set_error("seek rrd for live header writeback");
- return -1;
+ live_head_32_t live_head_32;
+ live_head_64_t live_head_64;
+ rra_ptr_32_t *rra_ptr_32;
+ rra_ptr_64_t *rra_ptr_64;
+ int i;
+
+#ifdef HAVE_MMAP
+ if (FILE_NATIVE==rrd->compat){
+ return 0;
}
- if (version >= 3) {
- if (rrd_write(rrd_file, rrd->live_head,
- sizeof(live_head_t) * 1) != sizeof(live_head_t) * 1) {
- rrd_set_error("rrd_write live_head to rrd");
- return -1;
- }
- } else {
- if (rrd_write(rrd_file, rrd->legacy_last_up,
+#endif
+
+
+ switch(rrd->compat) {
+
+ case FILE_NATIVE:
+
+
+
+ /* we just need to write back the live header portion now */
+ if (rrd_seek(rrd_file, (sizeof(stat_head_t)
+ + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
+ + sizeof(rra_def_t) * rrd->stat_head->rra_cnt),
+ SEEK_SET) != 0) {
+ rrd_set_error("seek rrd for live header writeback");
+ return -1;
+ }
+ if (version >= 3) {
+ if (rrd_write(rrd_file, rrd->live_head,
+ sizeof(live_head_t) * 1) != sizeof(live_head_t) * 1) {
+ rrd_set_error("rrd_write live_head to rrd");
+ return -1;
+ }
+ } else {
+ if (rrd_write(rrd_file, rrd->legacy_last_up,
sizeof(time_t) * 1) != sizeof(time_t) * 1) {
- rrd_set_error("rrd_write live_head to rrd");
- return -1;
- }
- }
+ rrd_set_error("rrd_write live_head to rrd");
+ return -1;
+ }
+ }
- if (rrd_write(rrd_file, rrd->pdp_prep,
+ if (rrd_write(rrd_file, rrd->pdp_prep,
sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)
- != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
- rrd_set_error("rrd_write pdp_prep to rrd");
- return -1;
- }
+ != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
+ rrd_set_error("rrd_write pdp_prep to rrd");
+ return -1;
+ }
+
+ if (rrd_write(rrd_file, rrd->cdp_prep,
+ sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+ rrd->stat_head->ds_cnt)
+ != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+ rrd->stat_head->ds_cnt)) {
- if (rrd_write(rrd_file, rrd->cdp_prep,
- sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
- rrd->stat_head->ds_cnt)
- != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
- rrd->stat_head->ds_cnt)) {
+ rrd_set_error("rrd_write cdp_prep to rrd");
+ return -1;
+ }
- rrd_set_error("rrd_write cdp_prep to rrd");
- return -1;
- }
+ if (rrd_write(rrd_file, rrd->rra_ptr,
+ sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)
+ != (ssize_t) (sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)) {
+ rrd_set_error("rrd_write rra_ptr to rrd");
+ return -1;
+ }
+ return 0;
- if (rrd_write(rrd_file, rrd->rra_ptr,
- sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)
- != (ssize_t) (sizeof(rra_ptr_t) * rrd->stat_head->rra_cnt)) {
- rrd_set_error("rrd_write rra_ptr to rrd");
- return -1;
+ break;
+ case FILE_i386:
+ ///we need to do some conversions and some mallocs too!
+ //step1 seek to the live head
+ if (rrd_seek(rrd_file, (sizeof(stat_head_32_t)
+ + sizeof(ds_def_t) * rrd->stat_head->ds_cnt
+ + sizeof(rra_def_32_t) * rrd->stat_head->rra_cnt),
+ SEEK_SET) != 0) {
+ rrd_set_error("seek rrd for live header writeback");
+ return -1;
+ }
+ //step2 write the live head!
+ if(version<=2){
+ rrd_set_error("incompatible rrd version for arch");
+ return -1;
+ }
+ live_head_32.last_up=rrd->live_head->last_up;
+ live_head_32.last_up_usec=rrd->live_head->last_up_usec;
+ if (rrd_write(rrd_file, &live_head_32,
+ sizeof(live_head_32_t) * 1) != sizeof(live_head_32_t) * 1) {
+ rrd_set_error("rrd_write live_head to rrd");
+ return -1;
+ }
+ //step3 write the pdp_preps
+ if (rrd_write(rrd_file, rrd->pdp_prep,
+ sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)
+ != (ssize_t) (sizeof(pdp_prep_t) * rrd->stat_head->ds_cnt)) {
+ rrd_set_error("rrd_write pdp_prep to rrd");
+ return -1;
+ }
+ //step4 write the cdp preps
+ if (rrd_write(rrd_file, rrd->cdp_prep,
+ sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+ rrd->stat_head->ds_cnt)
+ != (ssize_t) (sizeof(cdp_prep_t) * rrd->stat_head->rra_cnt *
+ rrd->stat_head->ds_cnt)) {
+
+ rrd_set_error("rrd_write cdp_prep to rrd");
+ return -1;
+ }
+ //step5 write the pointers!
+ rra_ptr_32 = (rra_ptr_32_t *)
+ malloc(sizeof(rra_ptr_32_t) * rrd->stat_head->rra_cnt);
+ if(NULL== rra_ptr_32){
+ rrd_set_error("cannot allocate rrd ptr");
+ return -1;
+ }
+ for(i=0;i<rrd->stat_head->rra_cnt;i++){
+ rra_ptr_32[i].cur_row=rrd->rra_ptr[i].cur_row;
+ }
+
+
+ if (rrd_write(rrd_file, rra_ptr_32,
+ sizeof(rra_ptr_32_t) * rrd->stat_head->rra_cnt)
+ != (ssize_t) (sizeof(rra_ptr_32_t) * rrd->stat_head->rra_cnt)) {
+ rrd_set_error("rrd_write rra_ptr to rrd");
+ return -1;
+ }
+ free(rra_ptr_32);
+ return 0;
+
+ default:
+ fprintf(stderr,"something went bad");
+ return -1;
+ break; //just in case
}
- return 0;
}
-#endif
+
Only in rrdtool-1.4.2/src: rrd_update.c.orig
Only in rrdtool-1.4.2: stamp-h1