From: Kern Sibbald Date: Mon, 5 Jan 2004 16:50:38 +0000 (+0000) Subject: Fix order of selection of next volume X-Git-Tag: Release-1.34.0~174 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=5301eb7a19c0f73ee52811e2f6fb3f1a99054b73;p=bacula%2Fbacula Fix order of selection of next volume git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@994 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/kernstodo b/bacula/kernstodo index 93f4209504..e5f1dce9ce 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -55,6 +55,8 @@ For 1.33 Testing/Documentation: - Add subsections to the Disaster Recovery index section. For 1.33 +- Look at code in recycle_oldes_purged_volume() recycle.c. Why not + let SQL do ORDER BY LastWritten ASC? - Look at find_next_volume() algorithm. Currently, it selects: +---------+------------+---------------------+-----------+ | MediaId | VolumeName | LastWritten | VolBytes | diff --git a/bacula/src/cats/sql_find.c b/bacula/src/cats/sql_find.c index b2d454b584..5d239532c6 100644 --- a/bacula/src/cats/sql_find.c +++ b/bacula/src/cats/sql_find.c @@ -218,6 +218,7 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr { SQL_ROW row; int numrows; + char *changer, *order; db_lock(mdb); if (item == -1) { /* find oldest volume */ @@ -233,22 +234,24 @@ db_find_next_volume(JCR *jcr, B_DB *mdb, int item, bool InChanger, MEDIA_DBR *mr } else { /* Find next available volume */ if (InChanger) { - Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," - "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," - "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot," - "FirstWritten,LastWritten,VolStatus " - "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' " - "AND InChanger=1 ORDER BY LastWritten,MediaId", - mr->PoolId, mr->MediaType, mr->VolStatus); + changer = "AND InChanger=1"; } else { - Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," - "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," - "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot," - "FirstWritten,LastWritten,VolStatus " - "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' " - "ORDER BY LastWritten,MediaId", - mr->PoolId, mr->MediaType, mr->VolStatus); + changer = ""; } + if (strcmp(mr->VolStatus, "Recycled") == 0 || + strcmp(mr->VolStatus, "Purged") == 0) { + order = "ORDER BY LastWritten ASC,MediaId"; /* take oldest */ + } else { + order = "ORDER BY LastWritten DESC,MediaId"; /* take most recently written */ + } + Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," + "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," + "VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot," + "FirstWritten,LastWritten,VolStatus " + "FROM Media WHERE PoolId=%u AND MediaType='%s' AND VolStatus='%s' " + "%s " + "%s LIMIT 1", + mr->PoolId, mr->MediaType, mr->VolStatus, changer, order); } if (!QUERY_DB(jcr, mdb, mdb->cmd)) { db_unlock(mdb); diff --git a/bacula/src/dird/recycle.c b/bacula/src/dird/recycle.c index 193df0fd37..f04fc057fa 100644 --- a/bacula/src/dird/recycle.c +++ b/bacula/src/dird/recycle.c @@ -42,13 +42,9 @@ static int oldest_handler(void *ctx, int num_fields, char **row) struct s_oldest_ctx *oldest = (struct s_oldest_ctx *)ctx; if (row[0]) { - Dmsg2(100, "oldest_handler %s %s\n", row[0], row[1]); - } - /* Find oldest Media record */ - if (row[1] && strcmp(row[1], oldest->LastWritten) < 0) { - oldest->MediaId = atoi(row[0]); - bstrncpy(oldest->LastWritten, row[1], sizeof(oldest->LastWritten)); - Dmsg1(100, "New oldest %s\n", row[1]); + oldest->MediaId = str_to_int64(row[0]); + bstrncpy(oldest->LastWritten, row[1]?row[1]:"", sizeof(oldest->LastWritten)); + Dmsg1(100, "New oldest %s\n", row[1]?row[1]:""); } return 1; } @@ -75,28 +71,23 @@ int recycle_oldest_purged_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr) { struct s_oldest_ctx oldest; POOLMEM *query = get_pool_memory(PM_EMSG); - char *select1 = - "SELECT MediaId,LastWritten FROM Media " - "WHERE PoolId=%u AND Recycle=1 AND VolStatus='Purged' " - "AND MediaType='%s' AND InChanger=1"; - char *select2 = + char *select = "SELECT MediaId,LastWritten FROM Media " "WHERE PoolId=%u AND Recycle=1 AND VolStatus='Purged' " - "AND MediaType='%s'"; - + "AND MediaType='%s' %s" + "ORDER BY LastWritten ASC,MediaId LIMIT 1"; Dmsg0(100, "Enter recycle_oldest_purged_volume\n"); oldest.MediaId = 0; - bstrncpy(oldest.LastWritten, "9999-99-99 99:99:99", sizeof(oldest.LastWritten)); if (InChanger) { - Mmsg(&query, select1, mr->PoolId, mr->MediaType); + Mmsg(&query, select, mr->PoolId, mr->MediaType, "AND InChanger=1 "); } else { - Mmsg(&query, select2, mr->PoolId, mr->MediaType); + Mmsg(&query, select, mr->PoolId, mr->MediaType, ""); } if (!db_sql_query(jcr->db, query, oldest_handler, (void *)&oldest)) { Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); - Dmsg0(100, "Exit 0 recycle_oldest_purged_volume query\n"); + Dmsg0(100, "return 0 recycle_oldest_purged_volume query\n"); free_pool_memory(query); return 0; } @@ -107,13 +98,13 @@ int recycle_oldest_purged_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr) if (db_get_media_record(jcr, jcr->db, mr)) { if (recycle_volume(jcr, mr)) { Jmsg(jcr, M_INFO, 0, "Recycled volume \"%s\"\n", mr->VolumeName); - Dmsg1(100, "Exit 1 recycle_oldest_purged_volume Vol=%s\n", mr->VolumeName); + Dmsg1(100, "return 1 recycle_oldest_purged_volume Vol=%s\n", mr->VolumeName); return 1; } } Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); } - Dmsg0(100, "Exit 0 recycle_oldest_purged_volume end\n"); + Dmsg0(100, "return 0 recycle_oldest_purged_volume end\n"); return 0; }