-#ifdef OLD_ALGORITHM
- /*
- * First look for an exact match of Volume name as the
- * tape may already be mounted.
- */
- rctx.do_not_wait = true;
- rctx.exact_match = true;
- if ((ok = find_suitable_device_for_job(jcr, rctx))) {
- goto done;
- }
- rctx.exact_match = false;
-
- /* Now search if an unused autochanger slot is available */
- rctx.available_autochanger = true;
- if ((ok = find_suitable_device_for_job(jcr, rctx))) {
- goto done;
- }
- rctx.available_autochanger = false;
-
-
- /*
- * Make up to two passes. The first with PreferMountedVols possibly
- * set to true. In that case, we look only for an available
- * drive with something mounted. If that fails, then we
- * do a second pass with PerferMountedVols set false.
- */
- rctx.PreferMountedVols = jcr->PreferMountedVols;
- if (!rctx.PreferMountedVols) {
- rctx.do_not_wait = false;
- }
- if ((ok = find_suitable_device_for_job(jcr, rctx))) {
- goto done;
- }
- if (rctx.PreferMountedVols) {
- rctx.PreferMountedVols = false;
- rctx.do_not_wait = false;
+ bool first = true; /* print wait message once */
+ bool fail = false;
+ rctx.notify_dir = true;
+ lock_reservations();
+ for ( ; !fail && !job_canceled(jcr); ) {
+ while ((msg = (char *)msgs->pop())) {
+ free(msg);
+ }
+ rctx.suitable_device = false;
+ rctx.have_volume = false;
+ rctx.any_drive = false;
+ if (!jcr->PreferMountedVols) {
+ /* Look for unused drives in autochangers */
+ rctx.num_writers = 20000000; /* start with impossible number */
+ rctx.low_use_drive = NULL;
+ rctx.PreferMountedVols = false;
+ rctx.exact_match = false;
+ rctx.autochanger_only = true;
+ Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+ rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
+ rctx.autochanger_only, rctx.any_drive);
+ if ((ok = find_suitable_device_for_job(jcr, rctx))) {
+ break;
+ }
+ /* Look through all drives possibly for low_use drive */
+ if (rctx.low_use_drive) {
+ rctx.try_low_use_drive = true;
+ if ((ok = find_suitable_device_for_job(jcr, rctx))) {
+ break;
+ }
+ rctx.try_low_use_drive = false;
+ }
+ rctx.autochanger_only = false;
+ Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+ rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
+ rctx.autochanger_only, rctx.any_drive);
+ if ((ok = find_suitable_device_for_job(jcr, rctx))) {
+ break;
+ }
+ }
+ /* Look for an exact match all drives */
+ rctx.PreferMountedVols = true;
+ rctx.exact_match = true;
+ rctx.autochanger_only = false;
+ Dmsg5(110, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n",
+ rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device,
+ rctx.autochanger_only, rctx.any_drive);