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
5 #define OSDependentInit()
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
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
19 "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
20 "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
21 "FirstWritten,LastWritten,VolStatus,InChanger,VolParts,"
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",
28 "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
29 "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,"
30 "FirstWritten,LastWritten,VolStatus,InChanger,VolParts,"
32 + "LabelType,VolReadTime,VolWriteTime "
33 "FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 "
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 */
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
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 */
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);
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]);
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
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;
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
92 init_job_server(director->MaxConcurrentJobs);
94 +// init_device_resources();
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
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";
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;
119 Dmsg1(100, "<stored: %s", bs->msg);
120 if (sscanf(bs->msg, Device_update,
122 &dev_max_writers, &dev_autoselect,
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);
131 unbash_spaces(dev_name);
133 dev->max_writers = dev_max_writers;
134 dev->reserved = dev_reserved;
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;
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
148 if (dev->can_read()) {
149 dev->clear_read(); /* clear read bit */
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 */
155 } else if (dev->num_writers > 0) {
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
161 /* Read a maximum of 5 records VOL1, HDR1, ... HDR4 */
162 for (i=0; i < 6; i++) {
164 - stat = tape_read(dev->fd, label, sizeof(label));
165 + stat = dev->read(label, sizeof(label));
166 } while (stat == -1 && errno == EINTR);
171 label[79] = '3'; /* ANSI label flag */
173 - stat = tape_write(dev->fd, label, sizeof(label));
174 + stat = dev->write(label, sizeof(label));
175 if (stat != sizeof(label)) {
177 Jmsg1(jcr, M_FATAL, 0, _("Could not write ANSI VOL1 label. ERR=%s\n"),
179 * This could come at the end of a tape, ignore
182 - stat = tape_write(dev->fd, label, sizeof(label));
183 + stat = dev->write(label, sizeof(label));
184 if (stat != sizeof(label)) {
189 ascii_to_ebcdic(label, label, sizeof(label));
191 - stat = tape_write(dev->fd, label, sizeof(label));
192 + stat = dev->write(label, sizeof(label));
193 if (stat != sizeof(label)) {
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
200 Pmsg0(000, _("NULL Volume name. This shouldn't happen!!!\n"));
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"));
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
215 bmicrosleep(5, 0); /* pause a bit if busy or lots of errors */
218 - if (dev->is_tape()) {
219 - stat = tape_write(dev->fd, block->buf, (size_t)wlen);
221 - stat = write(dev->fd, block->buf, (size_t)wlen);
223 + stat = dev->write(block->buf, (size_t)wlen);
225 } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 3);
227 #ifdef DEBUG_BLOCK_ZEROING
229 bmicrosleep(10, 0); /* pause a bit if busy or lots of errors */
232 - if (dev->is_tape()) {
233 - stat = tape_read(dev->fd, block->buf, (size_t)block->buf_len);
235 - stat = read(dev->fd, block->buf, (size_t)block->buf_len);
237 + stat = dev->read(block->buf, (size_t)block->buf_len);
239 } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3);
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 @@
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 */
254 @@ -2193,6 +2193,68 @@
258 +/* return the last timer interval (ms) */
259 +int DEVICE::get_timer_count()
261 + uint64_t old = last_timer;
263 + gettimeofday(&tv, NULL);
264 + last_timer = tv.tv_usec + tv.tv_sec * 1000000;
266 + return last_timer - old;
270 +ssize_t DEVICE::read(void *buf, size_t len)
276 + if (this->is_tape()) {
277 + read_len = tape_read(fd, buf, len);
279 + read_len = ::read(fd, buf, len);
282 + last_tick = get_timer_count();
284 + DevReadTime += last_tick;
285 + VolCatInfo.VolReadTime += last_tick;
287 + if (read_len > 0) { /* skip error */
288 + DevReadBytes += read_len;
289 + VolCatInfo.VolCatRBytes += read_len;
296 +ssize_t DEVICE::write(const void *buf, size_t len)
298 + ssize_t write_len ;
302 + if (this->is_tape()) {
303 + write_len = tape_write(fd, buf, len);
305 + write_len = ::write(fd, buf, len);
308 + last_tick = get_timer_count();
310 + DevWriteTime += last_tick;
311 + VolCatInfo.VolWriteTime += last_tick;
313 + if (write_len > 0) { /* skip error */
314 + DevWriteBytes += write_len;
315 + VolCatInfo.VolCatBytes += write_len;
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
330 + uint64_t last_timer; /* used by read/write/seek to get stats (usec) */
331 + int last_tick; /* contains last read/write time (usec) */
333 + uint64_t DevReadTime;
334 + uint64_t DevWriteTime;
335 + uint64_t DevWriteBytes;
336 + uint64_t DevReadBytes;
339 + int get_timer_count(); /* return the last timer interval (ms) */
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; }
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 */