1 Index: src/dird/autoprune.c
2 ===================================================================
3 --- src/dird/autoprune.c (révision 7380)
4 +++ src/dird/autoprune.c (copie de travail)
6 POOL_MEM query(PM_MESSAGE);
9 - char ed1[50], ed2[100], ed3[50];
10 + char ed1[50], ed2[100];
13 Dmsg1(050, "Prune volumes PoolId=%d\n", jcr->jr.PoolId);
15 "(PoolId=%s OR RecyclePoolId IN (%s)) AND MediaType='%s' %s"
16 "ORDER BY LastWritten ASC,MediaId";
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);
25 - Mmsg(query, select, ed1, ed2, mr->MediaType, "");
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());
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)
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 */
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 */
55 + foreach_alist(elt, store->storage_member) {
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);
65 /* Loop over all counters, defining them in each database */
66 /* Set default value in all counters */
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)
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 */
81 if (res->res_store.device) {
82 delete res->res_store.device;
84 + if (res->res_store.storage_member) {
85 + delete res->res_store.storage_member;
87 if (res->res_store.tls_ctx) {
88 free_tls_context(res->res_store.tls_ctx);
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;
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)
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 @@
118 +db_reset_storage_autochangerid(JCR *jcr, B_DB *mdb)
121 + Dmsg0(50, "reset storage autochangerid\n");
123 + Mmsg(mdb->cmd, "UPDATE Storage SET AutoChangerId=0 "); /* Change to Autochanger */
124 + stat = UPDATE_DB(jcr, mdb, mdb->cmd);
130 db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr)
134 + char ed1[50], ed2[50];
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));
143 stat = UPDATE_DB(jcr, mdb, mdb->cmd);
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)
150 -- Create a table like Job for long term statistics
151 CREATE TABLE jobstat (LIKE job);
153 +ALTER TABLE Storage ADD COLUMN AutoChangerId integer;
154 +ALTER TABLE Storage ALTER COLUMN AutoChangerId SET DEFAULT 0;
156 UPDATE version SET versionid=11;
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)
165 Name VARCHAR(128) NOT NULL,
166 AutoChanger TINYINT DEFAULT 0,
167 + AutoChangerId INTEGER DEFAULT 0,
168 PRIMARY KEY(StorageId)
171 Index: src/cats/cats.h
172 ===================================================================
173 --- src/cats/cats.h (révision 7380)
174 +++ src/cats/cats.h (copie de travail)
177 char Name[MAX_NAME_LENGTH]; /* Device name */
178 int AutoChanger; /* Set if autochanger */
180 + int AutoChangerId; /* Group devices in autochanger */
181 /* Not in database */
182 bool created; /* set if created by db_create ... */
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)
191 AutoChanger INTEGER DEFAULT 0,
192 + AutoChangerId INTEGER DEFAULT 0,
193 PRIMARY KEY(StorageId)
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)
201 -- Create a table like Job for long term statistics
202 CREATE TABLE JobStat (LIKE Job);
204 +ALTER TABLE Storage ADD COLUMN AutoChangerId integer;
205 +ALTER TABLE Storage ALTER COLUMN AutoChangerId SET DEFAULT 0;
208 INSERT INTO Version (VersionId) VALUES (11);
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);
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)
235 +void db_select_autochanger(JCR *jcr, B_DB *mdb, bool InChanger, DBId_t StorageId, POOL_MEM &result)
240 + edit_int64(StorageId, ed1);
243 + "AND ( StorageId IN "
244 + "( SELECT StorageId "
246 + "WHERE AutoChangerId = %s "
248 + "OR StorageId=%s)",
256 * Find Available Media (Volume) for Pool
259 edit_int64(mr->PoolId, ed1), mr->MediaType);
262 - POOL_MEM changer(PM_FNAME);
263 - /* Find next available volume */
265 - Mmsg(changer, "AND InChanger=1 AND StorageId=%s",
266 - edit_int64(mr->StorageId, ed1));
268 + POOL_MEM changer(PM_MESSAGE);
269 + db_select_autochanger(jcr, mdb, InChanger, mr->StorageId, changer);
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)
280 Name VARCHAR(128) NOT NULL,
281 AutoChanger TINYINT DEFAULT 0,
282 + AutoChangerId INTEGER DEFAULT 0,
283 PRIMARY KEY(StorageId)
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)
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);
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);
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);
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)
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)
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)
335 char *tls_keyfile; /* TLS Server Key File */
336 char *tls_dhfile; /* TLS Diffie-Hellman Parameters */
337 alist *tls_allowed_cns; /* TLS Allowed Clients */
339 + alist *storage_member; /* Storage in the same Autochanger */
340 TLS_CONTEXT *tls_ctx; /* Shared TLS Context */
342 typedef class s_res_store STORES;