]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/autochanger.patch
ebl cleanup
[bacula/bacula] / bacula / patches / testing / autochanger.patch
1 Index: src/dird/autoprune.c
2 ===================================================================
3 --- src/dird/autoprune.c        (révision 7380)
4 +++ src/dird/autoprune.c        (copie de travail)
5 @@ -96,7 +96,7 @@
6     POOL_MEM query(PM_MESSAGE);
7     UAContext *ua;
8     bool ok = false;
9 -   char ed1[50], ed2[100], ed3[50];
10 +   char ed1[50], ed2[100];
11     POOL_DBR spr;
12  
13     Dmsg1(050, "Prune volumes PoolId=%d\n", jcr->jr.PoolId);
14 @@ -141,15 +141,9 @@
15          "(PoolId=%s OR RecyclePoolId IN (%s)) AND MediaType='%s' %s"
16          "ORDER BY LastWritten ASC,MediaId";
17  
18 -   if (InChanger) {
19 -      char changer[100];
20 -      /* Ensure it is in this autochanger */
21 -      bsnprintf(changer, sizeof(changer), "AND InChanger=1 AND StorageId=%s ",
22 -         edit_int64(mr->StorageId, ed3));
23 -      Mmsg(query, select, ed1, ed2, mr->MediaType, changer);
24 -   } else {
25 -      Mmsg(query, select, ed1, ed2, mr->MediaType, "");
26 -   }
27 +   POOL_MEM changer(PM_MESSAGE);
28 +   db_select_autochanger(ua->jcr, ua->db, InChanger, mr->StorageId, changer);
29 +   Mmsg(query, select, ed1, ed2, mr->MediaType, changer.c_str());
30  
31     Dmsg1(050, "query=%s\n", query.c_str());
32     if (!db_get_query_dbids(ua->jcr, ua->db, query, ids)) {
33 Index: src/dird/dird.c
34 ===================================================================
35 --- src/dird/dird.c     (révision 7380)
36 +++ src/dird/dird.c     (copie de travail)
37 @@ -933,6 +933,7 @@
38           }
39           bstrncpy(sr.Name, store->name(), sizeof(sr.Name));
40           sr.AutoChanger = store->autochanger;
41 +        sr.AutoChangerId = 0;              /* don't know if it's in big autochanger */
42           db_create_storage_record(NULL, db, &sr);
43           store->StorageId = sr.StorageId;   /* set storage Id */
44           if (!sr.created) {                 /* if not created, update it */
45 @@ -974,7 +975,21 @@
46              }
47           }
48        }
49 -
50 +      /* Update Autochanger properties */
51 +      db_reset_storage_autochangerid(NULL, db); /* reset AutoChangerId for each storage */
52 +      foreach_res(store, R_STORAGE) {
53 +        if (store->storage_member) { /* This storage owns other storages */
54 +           STORE *elt;
55 +           foreach_alist(elt, store->storage_member) {
56 +              STORAGE_DBR sr;
57 +              bstrncpy(sr.Name, elt->name(), sizeof(sr.Name));
58 +              sr.StorageId = elt->StorageId;
59 +              sr.AutoChanger = elt->autochanger;
60 +              sr.AutoChangerId = store->StorageId;
61 +              db_update_storage_record(NULL, db, &sr);
62 +           }
63 +        }
64 +      }
65        /* Loop over all counters, defining them in each database */
66        /* Set default value in all counters */
67        COUNTER *counter;
68 Index: src/dird/dird_conf.c
69 ===================================================================
70 --- src/dird/dird_conf.c        (révision 7380)
71 +++ src/dird/dird_conf.c        (copie de travail)
72 @@ -218,6 +218,7 @@
73     {"mediatype",   store_strname,  ITEM(res_store.media_type), 0, ITEM_REQUIRED, 0},
74     {"autochanger", store_bool,     ITEM(res_store.autochanger), 0, ITEM_DEFAULT, 0},
75     {"enabled",     store_bool,     ITEM(res_store.enabled),     0, ITEM_DEFAULT, true},
76 +   {"contains",    store_alist_res,ITEM(res_store.storage_member),  R_STORAGE, 0, 0},
77     {"heartbeatinterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 0},
78     {"maximumconcurrentjobs", store_pint32, ITEM(res_store.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
79     {"sddport", store_pint32, ITEM(res_store.SDDport), 0, 0, 0}, /* deprecated */
80 @@ -1161,6 +1162,9 @@
81        if (res->res_store.device) {
82           delete res->res_store.device;
83        }
84 +      if (res->res_store.storage_member) {
85 +        delete res->res_store.storage_member;
86 +      }
87        if (res->res_store.tls_ctx) { 
88           free_tls_context(res->res_store.tls_ctx);
89        }
90 @@ -1395,6 +1399,7 @@
91           }
92           /* we must explicitly copy the device alist pointer */
93           res->res_store.device   = res_all.res_store.device;
94 +        res->res_store.storage_member = res_all.res_store.storage_member;
95           break;
96        case R_JOB:
97        case R_JOBDEFS:
98 Index: src/dird/dird_conf.h
99 ===================================================================
100 --- src/dird/dird_conf.h        (révision 7380)
101 +++ src/dird/dird_conf.h        (copie de travail)
102 @@ -290,6 +290,7 @@
103     char *password;
104     char *media_type;
105     alist *device;                     /* Alternate devices for this Storage */
106 +   alist *storage_member;
107     uint32_t MaxConcurrentJobs;        /* Maximume concurrent jobs */
108     uint32_t NumConcurrentJobs;        /* number of concurrent jobs running */
109     uint32_t NumConcurrentReadJobs;    /* number of jobs reading */
110 Index: src/cats/sql_update.c
111 ===================================================================
112 --- src/cats/sql_update.c       (révision 7380)
113 +++ src/cats/sql_update.c       (copie de travail)
114 @@ -288,14 +288,27 @@
115  }
116  
117  bool
118 +db_reset_storage_autochangerid(JCR *jcr, B_DB *mdb)
119 +{
120 +   int stat;
121 +   Dmsg0(50, "reset storage autochangerid\n");
122 +   db_lock(mdb);
123 +   Mmsg(mdb->cmd, "UPDATE Storage SET AutoChangerId=0 "); /* Change to Autochanger */
124 +   stat = UPDATE_DB(jcr, mdb, mdb->cmd);
125 +   db_unlock(mdb);
126 +   return stat;
127 +}
128 +
129 +bool
130  db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr)
131  {
132     int stat;
133 -   char ed1[50];
134 +   char ed1[50], ed2[50];
135  
136     db_lock(mdb);
137 -   Mmsg(mdb->cmd, "UPDATE Storage SET AutoChanger=%d WHERE StorageId=%s", 
138 -      sr->AutoChanger, edit_int64(sr->StorageId, ed1));
139 +   /* TODO: if autochangerid is set, update AutoChanger table */
140 +   Mmsg(mdb->cmd, "UPDATE Storage SET AutoChanger=%d, AutoChangerId=%s WHERE StorageId=%s", 
141 +       sr->AutoChanger, edit_int64(sr->AutoChangerId, ed2), edit_int64(sr->StorageId, ed1));
142  
143     stat = UPDATE_DB(jcr, mdb, mdb->cmd);
144     db_unlock(mdb);
145 Index: src/cats/update_postgresql_tables.in
146 ===================================================================
147 --- src/cats/update_postgresql_tables.in        (révision 7380)
148 +++ src/cats/update_postgresql_tables.in        (copie de travail)
149 @@ -14,6 +14,9 @@
150  -- Create a table like Job for long term statistics
151  CREATE TABLE jobstat (LIKE job);
152  
153 +ALTER TABLE Storage ADD COLUMN AutoChangerId integer;
154 +ALTER TABLE Storage ALTER COLUMN AutoChangerId SET DEFAULT 0;
155 +
156  UPDATE version SET versionid=11;
157  
158  vacuum analyse;
159 Index: src/cats/make_sqlite3_tables.in
160 ===================================================================
161 --- src/cats/make_sqlite3_tables.in     (révision 7380)
162 +++ src/cats/make_sqlite3_tables.in     (copie de travail)
163 @@ -218,6 +218,7 @@
164     StorageId INTEGER,
165     Name VARCHAR(128) NOT NULL,
166     AutoChanger TINYINT DEFAULT 0,
167 +   AutoChangerId INTEGER DEFAULT 0,
168     PRIMARY KEY(StorageId)
169     );
170  
171 Index: src/cats/cats.h
172 ===================================================================
173 --- src/cats/cats.h     (révision 7380)
174 +++ src/cats/cats.h     (copie de travail)
175 @@ -939,7 +939,7 @@
176     DBId_t StorageId;
177     char Name[MAX_NAME_LENGTH];        /* Device name */
178     int AutoChanger;                   /* Set if autochanger */
179 -
180 +   int AutoChangerId;                 /* Group devices in autochanger */
181     /* Not in database */
182     bool created;                      /* set if created by db_create ... */
183  };
184 Index: src/cats/make_postgresql_tables.in
185 ===================================================================
186 --- src/cats/make_postgresql_tables.in  (révision 7380)
187 +++ src/cats/make_postgresql_tables.in  (copie de travail)
188 @@ -185,6 +185,7 @@
189     StorageId SERIAL,
190     Name TEXT NOT NULL,
191     AutoChanger INTEGER DEFAULT 0,
192 +   AutoChangerId INTEGER DEFAULT 0,
193     PRIMARY KEY(StorageId)
194     );
195  
196 Index: src/cats/update_mysql_tables.in
197 ===================================================================
198 --- src/cats/update_mysql_tables.in     (révision 7380)
199 +++ src/cats/update_mysql_tables.in     (copie de travail)
200 @@ -15,6 +15,9 @@
201  -- Create a table like Job for long term statistics
202  CREATE TABLE JobStat (LIKE Job);
203  
204 +ALTER TABLE Storage ADD COLUMN AutoChangerId integer;
205 +ALTER TABLE Storage ALTER COLUMN AutoChangerId SET DEFAULT 0;
206 +
207  DELETE FROM Version;
208  INSERT INTO Version (VersionId) VALUES (11);
209  
210 Index: src/cats/protos.h
211 ===================================================================
212 --- src/cats/protos.h   (révision 7380)
213 +++ src/cats/protos.h   (copie de travail)
214 @@ -123,10 +123,12 @@
215  void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
216  
217  /* sql_update.c */
218 +void db_select_autochanger(JCR *jcr, B_DB *mdb, bool InChanger, DBId_t StorageId, POOL_MEM &result);
219  bool db_update_job_start_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
220  int  db_update_job_end_record(JCR *jcr, B_DB *db, JOB_DBR *jr, bool stats_enabled);
221  int  db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr);
222  int  db_update_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pr);
223 +bool db_reset_storage_autochangerid(JCR *jcr, B_DB *db);
224  bool db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr);
225  int  db_update_media_record(JCR *jcr, B_DB *db, MEDIA_DBR *mr);
226  int  db_update_media_defaults(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr);
227 Index: src/cats/sql_find.c
228 ===================================================================
229 --- src/cats/sql_find.c (révision 7380)
230 +++ src/cats/sql_find.c (copie de travail)
231 @@ -305,6 +305,26 @@
232     return true;
233  }
234  
235 +void db_select_autochanger(JCR *jcr, B_DB *mdb, bool InChanger, DBId_t StorageId, POOL_MEM &result)
236 +{
237 +   char ed1[50];
238 +
239 +   if (InChanger) {
240 +      edit_int64(StorageId, ed1);
241 +      Mmsg(result,      
242 +   "AND InChanger=1 "
243 +   "AND ( StorageId IN " 
244 +        "( SELECT StorageId " 
245 +            "FROM Storage "
246 +           "WHERE AutoChangerId = %s "
247 +         ") "
248 +         "OR StorageId=%s)",
249 +          ed1, ed1);
250 +   } else {
251 +      Mmsg(result, "");
252 +   }
253 +}
254 +
255  /*
256   * Find Available Media (Volume) for Pool
257   *
258 @@ -338,12 +358,9 @@
259           edit_int64(mr->PoolId, ed1), mr->MediaType);
260       item = 1;
261     } else {
262 -      POOL_MEM changer(PM_FNAME);
263 -      /* Find next available volume */
264 -      if (InChanger) {
265 -         Mmsg(changer, "AND InChanger=1 AND StorageId=%s",
266 -             edit_int64(mr->StorageId, ed1));
267 -      }
268 +      POOL_MEM changer(PM_MESSAGE);
269 +      db_select_autochanger(jcr, mdb, InChanger, mr->StorageId, changer);
270 +
271        if (strcmp(mr->VolStatus, "Recycle") == 0 ||
272            strcmp(mr->VolStatus, "Purged") == 0) {
273           order = "AND Recycle=1 ORDER BY LastWritten ASC,MediaId";  /* take oldest that can be recycled */
274 Index: src/cats/make_sqlite_tables.in
275 ===================================================================
276 --- src/cats/make_sqlite_tables.in      (révision 7380)
277 +++ src/cats/make_sqlite_tables.in      (copie de travail)
278 @@ -218,6 +218,7 @@
279     StorageId INTEGER,
280     Name VARCHAR(128) NOT NULL,
281     AutoChanger TINYINT DEFAULT 0,
282 +   AutoChangerId INTEGER DEFAULT 0,
283     PRIMARY KEY(StorageId)
284     );
285  
286 Index: src/cats/sql_create.c
287 ===================================================================
288 --- src/cats/sql_create.c       (révision 7380)
289 +++ src/cats/sql_create.c       (copie de travail)
290 @@ -279,7 +279,7 @@
291     bool ok;
292  
293     db_lock(mdb);
294 -   Mmsg(mdb->cmd, "SELECT StorageId,AutoChanger FROM Storage WHERE Name='%s'", sr->Name);
295 +   Mmsg(mdb->cmd, "SELECT StorageId,AutoChanger,AutoChangerId FROM Storage WHERE Name='%s'", sr->Name);
296  
297     sr->StorageId = 0;
298     sr->created = false;
299 @@ -300,6 +300,7 @@
300           }
301           sr->StorageId = str_to_int64(row[0]);
302           sr->AutoChanger = atoi(row[1]);   /* bool */
303 +        sr->AutoChangerId = str_to_int64(row[2]);
304           sql_free_result(mdb);
305           db_unlock(mdb);
306           return true;
307 @@ -308,8 +309,8 @@
308     }
309  
310     /* Must create it */
311 -   Mmsg(mdb->cmd, "INSERT INTO Storage (Name,AutoChanger)"
312 -        " VALUES ('%s',%d)", sr->Name, sr->AutoChanger);
313 +   Mmsg(mdb->cmd, "INSERT INTO Storage (Name,AutoChanger,AutoChangerId)"
314 +        " VALUES ('%s',%d,%d)", sr->Name, sr->AutoChanger, sr->AutoChangerId); 
315  
316     if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
317        Mmsg2(&mdb->errmsg, _("Create DB Storage record %s failed. ERR=%s\n"),
318 Index: src/cats/make_mysql_tables.in
319 ===================================================================
320 --- src/cats/make_mysql_tables.in       (révision 7380)
321 +++ src/cats/make_mysql_tables.in       (copie de travail)
322 @@ -64,6 +64,7 @@
323     StorageId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
324     Name TINYBLOB NOT NULL,
325     AutoChanger TINYINT DEFAULT 0,
326 +   AutoChangerId INTEGER DEFAULT 0,
327     PRIMARY KEY(StorageId)
328     );
329  
330 Index: src/stored/stored_conf.h
331 ===================================================================
332 --- src/stored/stored_conf.h    (révision 7380)
333 +++ src/stored/stored_conf.h    (copie de travail)
334 @@ -99,7 +99,7 @@
335     char *tls_keyfile;                 /* TLS Server Key File */
336     char *tls_dhfile;                  /* TLS Diffie-Hellman Parameters */
337     alist *tls_allowed_cns;            /* TLS Allowed Clients */
338 -
339 +   alist *storage_member;             /* Storage in the same Autochanger */
340     TLS_CONTEXT *tls_ctx;              /* Shared TLS Context */
341  };
342  typedef class s_res_store STORES;