<font size=2 face="sans-serif">Hello,</font>
<br>
<br><font size=2 face="sans-serif">I compiled the current trunk (r2287)
and noticed that rrdcached can't create a RRD if the whole path to it doesn't
exist; for example:</font>
<br>
<br><font size=2 face="Terminus">telnet localhost 42217</font>
<br><font size=2 face="Terminus">Trying ::1...</font>
<br><font size=2 face="Terminus">Trying 127.0.0.1...</font>
<br><font size=2 face="Terminus">Connected to localhost.</font>
<br><font size=2 face="Terminus">Escape character is '^]'.</font>
<br><font size=2 face="Terminus">CREATE a/b/c.rrd -b 1335447997 DS:one:COUNTER:600:U:U
RRA:AVERAGE:0.5:1:24</font>
<br><font size=2 face="Terminus"><b>-1 RRD Error: creating '/home/tests/rrd/data/a/b/c.rrd':
No such file or directory</b></font>
<br><font size=2 face="Terminus">CREATE c.rrd -b 1335447997 DS:one:COUNTER:600:U:U
RRA:AVERAGE:0.5:1:24</font>
<br><font size=2 face="Terminus">0 RRD created OK</font>
<br><font size=2 face="Terminus">QUIT</font>
<br>
<br><font size=2 face="sans-serif">where /home/tests/rrd/data is the daemons
basedir. Could the following patch be considered?</font>
<br>
<br><font size=2 face="Terminus">--- rrd_daemon.c &nbsp; &nbsp; &nbsp;
&nbsp;(revision 2287)</font>
<br><font size=2 face="Terminus">+++ rrd_daemon.c &nbsp; &nbsp; &nbsp;
&nbsp;(working copy)</font>
<br><font size=2 face="Terminus">@@ -1824,6 +1824,8 @@</font>
<br><font size=2 face="Terminus">&nbsp;static int handle_request_create
(HANDLER_PROTO) /* {{{ */</font>
<br><font size=2 face="Terminus">&nbsp;{</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;char *file, file_tmp[PATH_MAX];</font>
<br><font size=2 face="Terminus">+ &nbsp;char *file_copy, *dir;</font>
<br><font size=2 face="Terminus">+ &nbsp;struct stat st;</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;char *tok;</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;int ac = 0;</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;char *av[128];</font>
<br><font size=2 face="Terminus">@@ -1839,6 +1841,17 @@</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp; &nbsp;return syntax_error(sock,cmd);</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;/* get full pathname */</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;get_abs_path(&amp;file, file_tmp);</font>
<br><font size=2 face="Terminus">+ &nbsp;/* dirname may modify its argument
*/</font>
<br><font size=2 face="Terminus">+ &nbsp;file_copy = strdup(file);</font>
<br><font size=2 face="Terminus">+ &nbsp;if (file_copy == NULL) {</font>
<br><font size=2 face="Terminus">+ &nbsp; &nbsp;return send_response(sock,
RESP_ERR, &quot;Cannot create: empty argument.\n&quot;);</font>
<br><font size=2 face="Terminus">+ &nbsp;}</font>
<br><font size=2 face="Terminus">+ &nbsp;dir = dirname(file_copy);</font>
<br><font size=2 face="Terminus">+ &nbsp;if (stat(dir, &amp;st) != 0) {</font>
<br><font size=2 face="Terminus">+ &nbsp; &nbsp; &nbsp;if (rrd_mkdir_p(dir,
0755) != 0) {</font>
<br><font size=2 face="Terminus">+ &nbsp; &nbsp; &nbsp; &nbsp;return send_response(sock,
RESP_ERR, &quot;Cannot create: %s\n&quot;, dir);</font>
<br><font size=2 face="Terminus">+ &nbsp; &nbsp; &nbsp;}</font>
<br><font size=2 face="Terminus">+ &nbsp;}</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;if (!check_file_access(file,
sock)) {</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp; &nbsp;return send_response(sock,
RESP_ERR, &quot;Cannot read: %s\n&quot;, file);</font>
<br><font size=2 face="Terminus">&nbsp; &nbsp;}</font>
<br>
<br><font size=2 face="sans-serif">This would avoid having to connect to
the remote machine which is running rrdcached only to create directory,
and would allow to start rrdcached with an empty file tree and construct
it as needed directly via the daemons' CREATE commands.</font>
<br><font size=2 face="sans-serif">I guess the mode argument to rrd_mkdir_p()
could be something better than a magic number :-) but I'm not sure what..</font>
<br>
<br>
<br><font size=2 face="sans-serif">thanks &amp; regards</font>
<br><font size=2 face="sans-serif">Marek</font>
<br>