rda-python-dsquasar 3.0.15__tar.gz → 3.0.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {rda_python_dsquasar-3.0.15/src/rda_python_dsquasar.egg-info → rda_python_dsquasar-3.0.17}/PKG-INFO +1 -1
  2. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/pyproject.toml +1 -1
  3. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/dsquasar.py +28 -4
  4. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17/src/rda_python_dsquasar.egg-info}/PKG-INFO +1 -1
  5. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/LICENSE +0 -0
  6. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/MANIFEST.in +0 -0
  7. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/README.md +0 -0
  8. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/setup.cfg +0 -0
  9. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/__init__.py +0 -0
  10. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/ds_quasar.py +0 -0
  11. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/dsquasar.usg +0 -0
  12. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/dstacc.py +0 -0
  13. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/taccrec.py +0 -0
  14. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar/tacctar.py +0 -0
  15. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar.egg-info/SOURCES.txt +0 -0
  16. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar.egg-info/dependency_links.txt +0 -0
  17. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar.egg-info/entry_points.txt +0 -0
  18. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar.egg-info/requires.txt +0 -0
  19. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/src/rda_python_dsquasar.egg-info/top_level.txt +0 -0
  20. {rda_python_dsquasar-3.0.15 → rda_python_dsquasar-3.0.17}/test/test_dsquasar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_dsquasar
3
- Version: 3.0.15
3
+ Version: 3.0.17
4
4
  Summary: RDA Python package to backup and recover RDA data archives to and from GLOBUS Quasar backup server
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-dsquasar
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "rda_python_dsquasar"
7
- version = "3.0.15"
7
+ version = "3.0.17"
8
8
  authors = [
9
9
  { name="Zaihua Ji", email="zji@ucar.edu" },
10
10
  ]
@@ -611,7 +611,7 @@ class DsQuasar(PgCMD, PgSplit):
611
611
  qinfo['dslocks'].remove(dsid)
612
612
  qinfo['dsids'] = []
613
613
  if self.PGBACK['mproc'] > 1:
614
- self.check_child(None, 0, self.LOGWRN, 1) # wait all child processes done
614
+ self.wait_all_children() # wait all child processes done
615
615
  self.confirm_quasar_counts(qinfo, qinfo['abids'], "status = 'T'") # recount confirmed backups from RDADB
616
616
  if qinfo['dslocks']:
617
617
  for dsid in qinfo['dslocks']:
@@ -728,7 +728,7 @@ class DsQuasar(PgCMD, PgSplit):
728
728
  self.unlock_backup_datasets(qinfo, dslocks)
729
729
  if self.PGBACK['dolock']: self.unlock_backup_datasets(qinfo, [dsid])
730
730
  if self.PGBACK['mproc'] > 1:
731
- self.check_child(None, 0, self.LOGWRN, 1) # wait all child processes done
731
+ self.wait_all_children() # wait all child processes done
732
732
  self.confirm_quasar_counts(qinfo, qinfo['abids'], "status = 'T'") # recount confirmed backups from RDADB
733
733
  qcnt = qinfo['qcnt']
734
734
  if qcnt > 0:
@@ -769,7 +769,7 @@ class DsQuasar(PgCMD, PgSplit):
769
769
  self.transfer_quasar_tarfiles(qinfo)
770
770
  if qinfo['size'] > 0: self.transfer_quasar_tarfiles(qinfo)
771
771
  if self.PGBACK['mproc'] > 1:
772
- self.check_child(None, 0, self.LOGWRN, 1) # wait all child processes done
772
+ self.wait_all_children() # wait all child processes done
773
773
  self.confirm_quasar_counts(qinfo, list(bfiles), "status = 'A'") # recount confirmed backups from RDADB
774
774
  qcnt = qinfo['qcnt']
775
775
  if qcnt > 0:
@@ -906,6 +906,20 @@ class DsQuasar(PgCMD, PgSplit):
906
906
  self.report_dscheck_email(title, 1)
907
907
  self.PGLOG.update(saved)
908
908
 
909
+ # wait for every child process to finish, checking the walltime deadline between polls.
910
+ # check_child(..., 1) does the waiting inside its own loop, so a phase that ends with the
911
+ # last tar children still running would sit there for the rest of the run without ever
912
+ # reaching a deadline check - the parent has no per-item loop left to guard. polling with
913
+ # dowait 0 and sleeping here keeps the same cadence and wait message as check_child does.
914
+ def wait_all_children(self):
915
+ if self.PGBACK['mproc'] < 2: return
916
+ i = 0
917
+ while True:
918
+ self.check_batch_deadline()
919
+ if self.check_child(None, 0, self.LOGWRN, 0) < 1: break
920
+ self.show_wait_message(i, "{}: wait child processes".format(self.PGSIG['DSTR']), self.LOGWRN, 1)
921
+ i += 1
922
+
909
923
  # recompute the confirmed backup counts from RDADB after all child processes
910
924
  # finished, so a multi-process summary reflects succeeded (not just started) work
911
925
  def confirm_quasar_counts(self, qinfo, bids, dcnd):
@@ -1389,8 +1403,16 @@ class DsQuasar(PgCMD, PgSplit):
1389
1403
  dcnt = len(mrecs['dsid']) if mrecs else 0
1390
1404
  pgrecs = [self.onerecord(mrecs, i) for i in range(dcnt)]
1391
1405
  for pgrec in pgrecs:
1406
+ # a gather is not free: it queries every dataset, and each one another worker holds
1407
+ # costs an rdaps call to check that worker's pid. a run under dscheck does two of
1408
+ # them before any work, and -A 3 does a third one before tarring
1409
+ self.check_batch_deadline()
1392
1410
  dsid = pgrec['dsid']
1393
- if unlock and pgrec['pid'] and self.lock_dataset(dsid, 0, self.LOGACT) < 1: continue
1411
+ # a changed-file run takes records that are already backed up (bid > 0) while the
1412
+ # main runs take new files (bid = 0), so it shares no record with the worker holding
1413
+ # the lock and must not skip the dataset for it
1414
+ if unlock and pgrec['pid'] and not self.PGBACK['chgdays']:
1415
+ if self.lock_dataset(dsid, 0, self.LOGACT) < 1: continue
1394
1416
  fcnt += self.get_dataset_files(dsid, dsfiles, pgrec['backflag'], logact, sizes)
1395
1417
  if dsfiles:
1396
1418
  s = 's' if fcnt > 1 else ''
@@ -1413,6 +1435,7 @@ class DsQuasar(PgCMD, PgSplit):
1413
1435
  pgrecs = self.pgmget("bfile", flds, dcnd, self.LGWNEX)
1414
1436
  bcnt = len(pgrecs['bid']) if pgrecs else 0
1415
1437
  for i in range(bcnt):
1438
+ self.check_batch_deadline()
1416
1439
  cnt = self.get_backup_infile(dsfiles, self.onerecord(pgrecs, i))
1417
1440
  if cnt:
1418
1441
  icnt += 1
@@ -1438,6 +1461,7 @@ class DsQuasar(PgCMD, PgSplit):
1438
1461
  pgrecs = self.pgmget("bfile", flds, dcnd, self.LGWNEX)
1439
1462
  bcnt = len(pgrecs['bid']) if pgrecs else 0
1440
1463
  for i in range(bcnt):
1464
+ self.check_batch_deadline()
1441
1465
  cnt = self.get_backup_tarfile(dsfiles, self.onerecord(pgrecs, i))
1442
1466
  if cnt:
1443
1467
  tcnt += 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_dsquasar
3
- Version: 3.0.15
3
+ Version: 3.0.17
4
4
  Summary: RDA Python package to backup and recover RDA data archives to and from GLOBUS Quasar backup server
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-dsquasar