]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/media-stats.patch
b192d86391aded216b4e7f989d0516796bda3995
[bacula/bacula] / bacula / patches / testing / media-stats.patch
1 diff -Naur new/bacula-1.39.30/src/baconfig.h bacula-1.39.30/src/baconfig.h
2 --- new/bacula-1.39.30/src/baconfig.h   2006-12-08 15:27:09.000000000 +0100
3 +++ bacula-1.39.30/src/baconfig.h       2006-12-19 22:27:27.000000000 +0100
4 @@ -107,8 +107,8 @@
5  #define  OSDependentInit()
6  #define  tape_open            open
7  #define  tape_ioctl           ioctl
8 -#define  tape_read            read
9 -#define  tape_write           write
10 +#define  tape_read            ::read
11 +#define  tape_write           ::write
12  #define  tape_close           ::close
13  
14  #endif
15 diff -Naur new/bacula-1.39.30/src/cats/sql_find.c bacula-1.39.30/src/cats/sql_find.c
16 --- new/bacula-1.39.30/src/cats/sql_find.c      2006-11-27 11:02:59.000000000 +0100
17 +++ bacula-1.39.30/src/cats/sql_find.c  2006-12-19 22:27:27.000000000 +0100
18 @@ -283,7 +283,7 @@
19            "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
20            "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
21            "FirstWritten,LastWritten,VolStatus,InChanger,VolParts,"
22 -          "LabelType "
23 +          "LabelType,VolReadTime,VolWriteTime "
24            "FROM Media WHERE PoolId=%s AND MediaType='%s' AND VolStatus IN ('Full',"
25            "'Recycle','Purged','Used','Append') AND Enabled=1 "
26            "ORDER BY LastWritten LIMIT 1", 
27 @@ -308,7 +308,7 @@
28            "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
29            "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
30            "FirstWritten,LastWritten,VolStatus,InChanger,VolParts,"
31 -          "LabelType "
32 +          "LabelType,VolReadTime,VolWriteTime "
33            "FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 "
34            "AND VolStatus='%s' "
35            "%s "
36 @@ -371,6 +371,8 @@
37     mr->InChanger = str_to_int64(row[20]);
38     mr->VolParts = str_to_int64(row[21]);
39     mr->LabelType = str_to_int64(row[22]);
40 +   mr->VolReadTime = str_to_uint64(row[23]);
41 +   mr->VolWriteTime = str_to_uint64(row[24]);
42     mr->Enabled = 1;   /* ensured via query */
43     sql_free_result(mdb);
44  
45 diff -Naur new/bacula-1.39.30/src/cats/sql_get.c bacula-1.39.30/src/cats/sql_get.c
46 --- new/bacula-1.39.30/src/cats/sql_get.c       2006-11-27 11:02:59.000000000 +0100
47 +++ bacula-1.39.30/src/cats/sql_get.c   2006-12-19 22:27:27.000000000 +0100
48 @@ -872,7 +872,7 @@
49           "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger,"
50           "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId,"
51           "Enabled,LocationId,RecycleCount,InitialWrite,"
52 -         "ScratchPoolId,RecyclePoolId "
53 +         "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime "
54           "FROM Media WHERE MediaId=%s", 
55           edit_int64(mr->MediaId, ed1));
56     } else {                           /* find by name */
57 @@ -882,7 +882,7 @@
58           "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger,"
59           "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId,"
60           "Enabled,LocationId,RecycleCount,InitialWrite,"
61 -         "ScratchPoolId,RecyclePoolId "
62 +         "ScratchPoolId,RecyclePoolId,VolReadTime,VolWriteTime "
63           "FROM Media WHERE VolumeName='%s'", mr->VolumeName);
64     }
65  
66 @@ -938,6 +938,8 @@
67              mr->InitialWrite = (time_t)str_to_utime(mr->cInitialWrite);
68              mr->ScratchPoolId = str_to_int64(row[33]);
69              mr->RecyclePoolId = str_to_int64(row[34]);
70 +            mr->VolReadTime = str_to_int64(row[35]);
71 +            mr->VolWriteTime = str_to_int64(row[36]);
72              
73              ok = true;
74           }
75 diff -Naur new/bacula-1.39.30/src/dird/catreq.c bacula-1.39.30/src/dird/catreq.c
76 --- new/bacula-1.39.30/src/dird/catreq.c        2006-11-21 14:20:08.000000000 +0100
77 +++ bacula-1.39.30/src/dird/catreq.c    2006-12-19 22:27:27.000000000 +0100
78 @@ -277,7 +277,7 @@
79        mr.VolWriteTime = sdmr.VolWriteTime;
80        mr.VolParts     = sdmr.VolParts;
81        bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus));
82 -      if (jcr->wstore->StorageId) {
83 +      if (jcr->wstore && jcr->wstore->StorageId) {
84           mr.StorageId = jcr->wstore->StorageId;
85        }
86  
87 diff -Naur new/bacula-1.39.30/src/dird/dird.c bacula-1.39.30/src/dird/dird.c
88 --- new/bacula-1.39.30/src/dird/dird.c  2006-11-27 11:02:59.000000000 +0100
89 +++ bacula-1.39.30/src/dird/dird.c      2006-12-19 22:27:27.000000000 +0100
90 @@ -269,6 +269,8 @@
91  
92     init_job_server(director->MaxConcurrentJobs);
93  
94 +//   init_device_resources();
95 +
96     Dmsg0(200, "wait for next job\n");
97     /* Main loop -- call scheduler to get next job to run */
98     while ( (jcr = wait_for_next_job(runjob)) ) {
99 diff -Naur new/bacula-1.39.30/src/dird/getmsg.c bacula-1.39.30/src/dird/getmsg.c
100 --- new/bacula-1.39.30/src/dird/getmsg.c        2006-11-21 14:20:09.000000000 +0100
101 +++ bacula-1.39.30/src/dird/getmsg.c    2006-12-19 22:27:27.000000000 +0100
102 @@ -62,7 +62,9 @@
103     "open=%d labeled=%d offline=%d "
104     "reserved=%d max_writers=%d "
105     "autoselect=%d autochanger=%d "
106 -   "changer_name=%127s media_type=%127s volume_name=%127s\n";
107 +   "changer_name=%127s media_type=%127s volume_name=%127s "
108 +   "DevReadTime=%d DevWriteTime=%d DevReadBytes=%d "
109 +   "DevWriteBytes=%d\n";
110  #endif
111  
112  
113 @@ -243,6 +245,7 @@
114           int dev_open, dev_append, dev_read, dev_labeled;
115           int dev_offline, dev_autochanger, dev_autoselect;
116           int dev_num_writers, dev_max_writers, dev_reserved;
117 +         uint64_t dev_read_time, dev_write_time, dev_write_bytes, dev_read_bytes;
118           uint64_t dev_PoolId;
119           Dmsg1(100, "<stored: %s", bs->msg);
120           if (sscanf(bs->msg, Device_update,
121 @@ -253,7 +256,9 @@
122               &dev_max_writers, &dev_autoselect, 
123               &dev_autochanger, 
124               changer_name.c_str(), media_type.c_str(),
125 -             volume_name.c_str()) != 15) {
126 +             volume_name.c_str(),
127 +             &dev_read_time, &dev_write_time, &dev_read_bytes,
128 +             &dev_write_bytes) != 19) {
129              Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
130           } else {
131              unbash_spaces(dev_name);
132 @@ -283,6 +288,10 @@
133              dev->max_writers = dev_max_writers;
134              dev->reserved = dev_reserved;
135              dev->found = true;
136 +            dev->DevReadTime = dev_read_time; /* TODO : have to update database */
137 +            dev->DevWriteTime = dev_write_time;
138 +            dev->DevReadBytes = dev_read_bytes;
139 +            dev->DevWriteBytes = dev_write_bytes;
140           }
141           continue;
142        }
143 diff -Naur new/bacula-1.39.30/src/stored/acquire.c bacula-1.39.30/src/stored/acquire.c
144 --- new/bacula-1.39.30/src/stored/acquire.c     2006-11-27 11:03:01.000000000 +0100
145 +++ bacula-1.39.30/src/stored/acquire.c 2006-12-19 22:27:27.000000000 +0100
146 @@ -461,8 +461,8 @@
147  
148     if (dev->can_read()) {
149        dev->clear_read();              /* clear read bit */
150 -
151 -      /******FIXME**** send read volume usage statistics to director */
152 +      Dmsg0(100, "dir_update_vol_info. Release0\n");
153 +      dir_update_volume_info(dcr, false); /* send Volume info to Director */
154  
155     } else if (dev->num_writers > 0) {
156        /* 
157 diff -Naur new/bacula-1.39.30/src/stored/ansi_label.c bacula-1.39.30/src/stored/ansi_label.c
158 --- new/bacula-1.39.30/src/stored/ansi_label.c  2006-11-21 18:03:45.000000000 +0100
159 +++ bacula-1.39.30/src/stored/ansi_label.c      2006-12-19 22:27:27.000000000 +0100
160 @@ -87,7 +87,7 @@
161     /* Read a maximum of 5 records VOL1, HDR1, ... HDR4 */
162     for (i=0; i < 6; i++) {
163        do {
164 -         stat = tape_read(dev->fd, label, sizeof(label));
165 +         stat = dev->read(label, sizeof(label));
166        } while (stat == -1 && errno == EINTR);
167        if (stat < 0) {
168           berrno be;
169 @@ -309,7 +309,7 @@
170           } else {
171              label[79] = '3';                /* ANSI label flag */
172           }
173 -         stat = tape_write(dev->fd, label, sizeof(label));
174 +         stat = dev->write(label, sizeof(label));
175           if (stat != sizeof(label)) {
176              berrno be;
177              Jmsg1(jcr, M_FATAL, 0,  _("Could not write ANSI VOL1 label. ERR=%s\n"),
178 @@ -341,7 +341,7 @@
179         * This could come at the end of a tape, ignore
180         *  EOT errors.
181         */
182 -      stat = tape_write(dev->fd, label, sizeof(label));
183 +      stat = dev->write(label, sizeof(label));
184        if (stat != sizeof(label)) {
185           berrno be;
186           if (stat == -1) {
187 @@ -370,7 +370,7 @@
188           label[4] = 'V';
189           ascii_to_ebcdic(label, label, sizeof(label));
190        }
191 -      stat = tape_write(dev->fd, label, sizeof(label));
192 +      stat = dev->write(label, sizeof(label));
193        if (stat != sizeof(label)) {
194           berrno be;
195           if (stat == -1) {
196 diff -Naur new/bacula-1.39.30/src/stored/askdir.c bacula-1.39.30/src/stored/askdir.c
197 --- new/bacula-1.39.30/src/stored/askdir.c      2006-12-08 15:27:10.000000000 +0100
198 +++ bacula-1.39.30/src/stored/askdir.c  2006-12-19 22:27:27.000000000 +0100
199 @@ -308,11 +308,6 @@
200        Pmsg0(000, _("NULL Volume name. This shouldn't happen!!!\n"));
201        return false;
202     }
203 -   if (dev->can_read()) {
204 -      Jmsg0(jcr, M_FATAL, 0, _("Attempt to update_volume_info in read mode!!!\n"));
205 -      Pmsg0(000, _("Attempt to update_volume_info in read mode!!!\n"));
206 -      return false;
207 -   }
208  
209     Dmsg1(100, "Update cat VolFiles=%d\n", dev->file);
210     /* Just labeled or relabeled the tape */
211 diff -Naur new/bacula-1.39.30/src/stored/block.c bacula-1.39.30/src/stored/block.c
212 --- new/bacula-1.39.30/src/stored/block.c       2006-12-08 15:27:10.000000000 +0100
213 +++ bacula-1.39.30/src/stored/block.c   2006-12-19 22:27:27.000000000 +0100
214 @@ -537,11 +537,8 @@
215           bmicrosleep(5, 0);    /* pause a bit if busy or lots of errors */
216           dev->clrerror(-1);
217        }
218 -      if (dev->is_tape()) {
219 -         stat = tape_write(dev->fd, block->buf, (size_t)wlen);
220 -      } else {
221 -         stat = write(dev->fd, block->buf, (size_t)wlen);
222 -      }
223 +      stat = dev->write(block->buf, (size_t)wlen);
224 +
225     } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 3);
226  
227  #ifdef DEBUG_BLOCK_ZEROING
228 @@ -979,11 +976,8 @@
229           bmicrosleep(10, 0);    /* pause a bit if busy or lots of errors */
230           dev->clrerror(-1);
231        }
232 -      if (dev->is_tape()) {
233 -         stat = tape_read(dev->fd, block->buf, (size_t)block->buf_len);
234 -      } else {
235 -         stat = read(dev->fd, block->buf, (size_t)block->buf_len);
236 -      }
237 +      stat = dev->read(block->buf, (size_t)block->buf_len);
238 +
239     } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3);
240     if (stat < 0) {
241        berrno be;
242 diff -Naur new/bacula-1.39.30/src/stored/dev.c bacula-1.39.30/src/stored/dev.c
243 --- new/bacula-1.39.30/src/stored/dev.c 2006-11-22 15:48:29.000000000 +0100
244 +++ bacula-1.39.30/src/stored/dev.c     2006-12-19 22:27:27.000000000 +0100
245 @@ -1326,7 +1326,7 @@
246        mt_com.mt_count = 1;
247        while (num-- && !at_eot()) {
248           Dmsg0(100, "Doing read before fsf\n");
249 -         if ((stat = tape_read(fd, (char *)rbuf, rbuf_len)) < 0) {
250 +         if ((stat = this->read((char *)rbuf, rbuf_len)) < 0) {
251              if (errno == ENOMEM) {     /* tape record exceeds buf len */
252                 stat = rbuf_len;        /* This is OK */
253              /*
254 @@ -2193,6 +2193,68 @@
255     }
256  }
257  
258 +/* return the last timer interval (ms) */
259 +int DEVICE::get_timer_count()
260 +{
261 +   uint64_t old = last_timer;
262 +   struct timeval tv;
263 +   gettimeofday(&tv, NULL);
264 +   last_timer = tv.tv_usec + tv.tv_sec * 1000000;
265 +
266 +   return last_timer - old;
267 +}
268 +
269 +/* read from fd */
270 +ssize_t DEVICE::read(void *buf, size_t len)
271 +{
272 +   ssize_t read_len ;
273 +
274 +   get_timer_count();
275 +
276 +   if (this->is_tape()) {
277 +      read_len = tape_read(fd, buf, len);
278 +   } else {
279 +      read_len = ::read(fd, buf, len);
280 +   }
281 +
282 +   last_tick = get_timer_count();
283 +
284 +   DevReadTime += last_tick;
285 +   VolCatInfo.VolReadTime += last_tick;
286 +
287 +   if (read_len > 0) {         /* skip error */
288 +      DevReadBytes += read_len;
289 +      VolCatInfo.VolCatRBytes += read_len;
290 +   }
291 +
292 +   return read_len;   
293 +}
294 +
295 +/* write to fd */
296 +ssize_t DEVICE::write(const void *buf, size_t len)
297 +{
298 +   ssize_t write_len ;
299 +
300 +   get_timer_count();
301 +
302 +   if (this->is_tape()) {
303 +      write_len = tape_write(fd, buf, len);
304 +   } else {
305 +      write_len = ::write(fd, buf, len);
306 +   }
307 +
308 +   last_tick = get_timer_count();
309 +
310 +   DevWriteTime += last_tick;
311 +   VolCatInfo.VolWriteTime += last_tick;
312 +
313 +   if (write_len > 0) {                /* skip error */
314 +      DevWriteBytes += write_len;
315 +      VolCatInfo.VolCatBytes += write_len;
316 +   }
317 +
318 +   return write_len;   
319 +}
320  
321  /* Return the resource name for the device */
322  const char *DEVICE::name() const
323 diff -Naur new/bacula-1.39.30/src/stored/dev.h bacula-1.39.30/src/stored/dev.h
324 --- new/bacula-1.39.30/src/stored/dev.h 2006-11-21 18:03:46.000000000 +0100
325 +++ bacula-1.39.30/src/stored/dev.h     2006-12-19 22:27:27.000000000 +0100
326 @@ -283,7 +283,17 @@
327     int rem_wait_sec;
328     int num_wait;
329  
330 +   uint64_t last_timer;                      /* used by read/write/seek to get stats (usec) */
331 +   int last_tick;                    /* contains last read/write time (usec) */
332 +
333 +   uint64_t DevReadTime;
334 +   uint64_t DevWriteTime;
335 +   uint64_t DevWriteBytes;
336 +   uint64_t DevReadBytes;
337 +
338     /* Methods */
339 +   int get_timer_count();            /* return the last timer interval (ms) */
340 +
341     int has_cap(int cap) const { return capabilities & cap; }
342     int is_autochanger() const { return capabilities & CAP_AUTOCHANGER; }
343     int requires_mount() const { return capabilities & CAP_REQMOUNT; }
344 @@ -364,6 +374,8 @@
345     bool truncate(DCR *dcr);      /* in dev.c */
346     int open(DCR *dcr, int mode); /* in dev.c */
347     void term(void);              /* in dev.c */
348 +   ssize_t read(void *buf, size_t len);        /* in dev.c */
349 +   ssize_t write(const void *buf, size_t len); /* in dev.c */
350     bool rewind(DCR *dcr);        /* in dev.c */
351     bool mount(int timeout);      /* in dev.c */
352     bool unmount(int timeout);    /* in dev.c */