shareddata 6.85.17__tar.gz → 6.85.18__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 (187) hide show
  1. {shareddata-6.85.17/src/shareddata.egg-info → shareddata-6.85.18}/PKG-INFO +1 -1
  2. {shareddata-6.85.17 → shareddata-6.85.18}/setup.py +1 -1
  3. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/MultiProc.py +3 -0
  4. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/WorkerLib.py +4 -4
  5. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/SharedData.py +23 -3
  6. {shareddata-6.85.17 → shareddata-6.85.18/src/shareddata.egg-info}/PKG-INFO +1 -1
  7. {shareddata-6.85.17 → shareddata-6.85.18}/LICENSE +0 -0
  8. {shareddata-6.85.17 → shareddata-6.85.18}/MANIFEST.in +0 -0
  9. {shareddata-6.85.17 → shareddata-6.85.18}/README.md +0 -0
  10. {shareddata-6.85.17 → shareddata-6.85.18}/pyproject.toml +0 -0
  11. {shareddata-6.85.17 → shareddata-6.85.18}/setup.cfg +0 -0
  12. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/ServerGunicorn.py +0 -0
  13. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/ServerWaitress.py +0 -0
  14. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/__init__.py +0 -0
  15. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/apidocs-dark.css +0 -0
  16. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/apidocs.yml +0 -0
  17. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/auth.py +0 -0
  18. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/constants.py +0 -0
  19. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/download_paths.py +0 -0
  20. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/download_slots.py +0 -0
  21. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/install/worker.ps1 +0 -0
  22. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/install/worker.sh +0 -0
  23. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/listcache.py +0 -0
  24. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/__init__.py +0 -0
  25. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/cache.py +0 -0
  26. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/collections.py +0 -0
  27. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/data.py +0 -0
  28. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/downloads.py +0 -0
  29. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/metadata.py +0 -0
  30. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/operations.py +0 -0
  31. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/schedules.py +0 -0
  32. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/sqlite.py +0 -0
  33. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/system.py +0 -0
  34. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/tables.py +0 -0
  35. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/timeseries.py +0 -0
  36. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/web_routes.py +0 -0
  37. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/routes/workers.py +0 -0
  38. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/API/utils.py +0 -0
  39. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Auth/__init__.py +0 -0
  40. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Auth/bootstrap.py +0 -0
  41. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Auth/migrate.py +0 -0
  42. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Auth/store.py +0 -0
  43. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Auth/workers.py +0 -0
  44. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/CacheRedis.py +0 -0
  45. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/CollectionMongoDB.py +0 -0
  46. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/__init__.py +0 -0
  47. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/catalog.py +0 -0
  48. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/config.py +0 -0
  49. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/errors.py +0 -0
  50. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/indexes.py +0 -0
  51. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/readers.py +0 -0
  52. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/resolve.py +0 -0
  53. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/DataAPI/service.py +0 -0
  54. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Database.py +0 -0
  55. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Defaults.py +0 -0
  56. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/AWSEC2.py +0 -0
  57. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/AWSS3.py +0 -0
  58. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/AutoDocstrings.py +0 -0
  59. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/ClientAPI.py +0 -0
  60. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/ClientSocket.py +0 -0
  61. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/ClientWebSocket.py +0 -0
  62. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/LogHandlerAPI.py +0 -0
  63. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/LogReader.py +0 -0
  64. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/MongoDBClient.py +0 -0
  65. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/SaveTables.py +0 -0
  66. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/ServerSocket.py +0 -0
  67. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/ServerWebSocket.py +0 -0
  68. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/StreamsCache.py +0 -0
  69. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/StreamsPersist.py +0 -0
  70. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/SyncTable.py +0 -0
  71. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/TunnelWebSocket.py +0 -0
  72. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/IO/__init__.py +0 -0
  73. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Listing.py +0 -0
  74. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/LockWaiters.py +0 -0
  75. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Logger.py +0 -0
  76. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/MCP/__init__.py +0 -0
  77. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/MCP/__main__.py +0 -0
  78. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/MCP/client.py +0 -0
  79. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/MCP/server.py +0 -0
  80. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Metadata.py +0 -0
  81. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/OpenFIGI.py +0 -0
  82. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Redaction.py +0 -0
  83. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/ArchiveOldCollections.py +0 -0
  84. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/BatchJob.py +0 -0
  85. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/ContainerHealth.py +0 -0
  86. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/JobStore.py +0 -0
  87. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/RoutineCommand.py +0 -0
  88. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/RoutineOrigin.py +0 -0
  89. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/Schedule.py +0 -0
  90. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/ScheduleMirror.py +0 -0
  91. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/ScheduleMonitor.py +0 -0
  92. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/ScheduleStore.py +0 -0
  93. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/Scheduler.py +0 -0
  94. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/UpdateActiveJobs.py +0 -0
  95. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/Worker.py +0 -0
  96. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/WorkerBootstrap.py +0 -0
  97. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/WorkerPool.py +0 -0
  98. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Routines/__init__.py +0 -0
  99. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/SQLite.py +0 -0
  100. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/SharedNumpy.py +0 -0
  101. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/StreamKafka.py +0 -0
  102. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Symbol.py +0 -0
  103. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Table.py +0 -0
  104. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableDisk.py +0 -0
  105. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndex.py +0 -0
  106. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndexJitFunctions.py +0 -0
  107. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndexJitFunctionsManual.py +0 -0
  108. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndexJitGenerate.py +0 -0
  109. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndexJitHash.py +0 -0
  110. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableIndexJitLoc.py +0 -0
  111. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableProtocol.py +0 -0
  112. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableRead.py +0 -0
  113. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TableRewrite.py +0 -0
  114. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TimeSeriesDisk.py +0 -0
  115. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/TimeseriesContainer.py +0 -0
  116. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Users.py +0 -0
  117. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Utils.py +0 -0
  118. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/ADDING_A_PAGE.md +0 -0
  119. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/__init__.py +0 -0
  120. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/activity_logger.py +0 -0
  121. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/app.py +0 -0
  122. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/dashAgGridComponentFunctions.js +0 -0
  123. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/dashAgGridFunctions.js +0 -0
  124. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/google_logo.png +0 -0
  125. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/kafka_keys.js +0 -0
  126. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/logs.css +0 -0
  127. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/sched.css +0 -0
  128. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/assets/styles.css +0 -0
  129. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/auth.py +0 -0
  130. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/backends.py +0 -0
  131. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/config.py +0 -0
  132. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/containers.py +0 -0
  133. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/identity.py +0 -0
  134. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/kafka_view.py +0 -0
  135. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/mongo_view.py +0 -0
  136. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/proc.py +0 -0
  137. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/redis_view.py +0 -0
  138. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/route_health.py +0 -0
  139. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/route_registry.py +0 -0
  140. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/sched.py +0 -0
  141. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/schedule_editor.py +0 -0
  142. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/server.py +0 -0
  143. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/services.py +0 -0
  144. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/shell.py +0 -0
  145. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/standalone.py +0 -0
  146. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/account.js +0 -0
  147. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/custom.css +0 -0
  148. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/favicon.ico +0 -0
  149. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/favicon.png +0 -0
  150. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/logo.png +0 -0
  151. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/logo_96x96.png +0 -0
  152. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/shareddata-mark.svg +0 -0
  153. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/shell.css +0 -0
  154. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/shell.js +0 -0
  155. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/standalone.css +0 -0
  156. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/static/standalone.js +0 -0
  157. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/suggest.py +0 -0
  158. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/account.html +0 -0
  159. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/base.html +0 -0
  160. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/claim.html +0 -0
  161. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/claim_done.html +0 -0
  162. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/dash.html +0 -0
  163. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/index.html +0 -0
  164. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/login.html +0 -0
  165. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/login_2fa.html +0 -0
  166. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/partials/navbar.html +0 -0
  167. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/partials/scripts.html +0 -0
  168. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/recovery_codes.html +0 -0
  169. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/shell.html +0 -0
  170. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/templates/standalone.html +0 -0
  171. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/twofactor.py +0 -0
  172. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/utils.py +0 -0
  173. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/Web/workerpool.py +0 -0
  174. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/__init__.py +0 -0
  175. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/build_info.py +0 -0
  176. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/fleet.py +0 -0
  177. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/preflight.py +0 -0
  178. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/private_files.py +0 -0
  179. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/release_backup.py +0 -0
  180. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/server.py +0 -0
  181. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/services.py +0 -0
  182. {shareddata-6.85.17 → shareddata-6.85.18}/src/SharedData/sharedmutexwin.pyd +0 -0
  183. {shareddata-6.85.17 → shareddata-6.85.18}/src/shareddata.egg-info/SOURCES.txt +0 -0
  184. {shareddata-6.85.17 → shareddata-6.85.18}/src/shareddata.egg-info/dependency_links.txt +0 -0
  185. {shareddata-6.85.17 → shareddata-6.85.18}/src/shareddata.egg-info/entry_points.txt +0 -0
  186. {shareddata-6.85.17 → shareddata-6.85.18}/src/shareddata.egg-info/requires.txt +0 -0
  187. {shareddata-6.85.17 → shareddata-6.85.18}/src/shareddata.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shareddata
3
- Version: 6.85.17
3
+ Version: 6.85.18
4
4
  Summary: Memory Mapped / Shared Memory Database with S3 repository
5
5
  Home-page: https://shareddata.net
6
6
  Author: shareddata
@@ -66,7 +66,7 @@ test_requires = [
66
66
 
67
67
  setup(
68
68
  name='shareddata',
69
- version='6.85.17',
69
+ version='6.85.18',
70
70
  description='Memory Mapped / Shared Memory Database with S3 repository',
71
71
  author='shareddata',
72
72
  author_email='admin@shareddata.net',
@@ -305,6 +305,9 @@ def io_bound_unordered(thread_func, iterator, args, maxproc=None, maxthreads=1,
305
305
  w.join(timeout=5) # Wait for 5 seconds for each worker to finish
306
306
  if w.is_alive():
307
307
  w.terminate()
308
+ w.join(timeout=5) # reap it: an unreaped worker stays a zombie,
309
+ # and a zombie holding a table semaphore is
310
+ # unrecoverable until this parent exits
308
311
 
309
312
  if not input_queue.empty():
310
313
  Logger.log.warning('Input queue not totally consumed!')
@@ -1022,16 +1022,16 @@ def _sync_audit(command, audit, state=None, state_path=None):
1022
1022
  # The first healthy start after a warned/refused one says so at the same severity
1023
1023
  # filter operators watch; it is not repeated (the stored record is then healthy).
1024
1024
  recovered = not condition and previous.get('alert') is True
1025
- level = 'debug'
1025
+ # A healthy pass that changed nothing is not logged at all: the central log
1026
+ # handler ships DEBUG, so even one record per window floods the operator's view.
1027
+ level = None
1026
1028
  if condition and not repeated:
1027
1029
  level = 'warning' if audit['outcome_class'] == 'offline' else 'error'
1028
1030
  elif recovered:
1029
1031
  level = 'warning'
1030
1032
  elif audit.get('changed'):
1031
1033
  level = 'info'
1032
- if level != 'debug' or not repeated:
1033
- # Identical no-op starts inside the window are one DEBUG record, not one per start:
1034
- # the central log handler ships DEBUG, so demotion alone does not quiet the panel.
1034
+ if level:
1035
1035
  getattr(Logger.log, level)('repo_sync %s', json.dumps(dict(
1036
1036
  repo=command['repo'], branch=command.get('branch') or 'main',
1037
1037
  trigger=_sync_trigger(command), **audit, **({'recovered': True} if recovered else {})),
@@ -776,14 +776,34 @@ class SharedData:
776
776
  """One monotonic deadline for both layers of a SCHEMA acquisition."""
777
777
  return time.monotonic() + 30.0 if SharedData._is_schema_relpath(relpath) else None
778
778
 
779
+ @staticmethod
780
+ def _holder_alive(pid):
781
+ """Holder liveness for the acquire() staleness recovery.
782
+
783
+ A zombie holder is dead: it exited without release() and will never
784
+ run again. psutil.pid_exists() alone still reports it alive (a zombie
785
+ keeps its pid until reaped), and the reaper is usually the parent —
786
+ which is itself the process stuck in acquire()'s wait loop, so the
787
+ pid would never disappear. Waiting on pid_exists() therefore hangs
788
+ forever; only treating the zombie as dead lets the waiter
789
+ force-reclaim the mutex. Any psutil error we cannot interpret keeps
790
+ the previous behavior (wait, as if alive)."""
791
+ try:
792
+ return psutil.Process(int(pid)).status() != psutil.STATUS_ZOMBIE
793
+ except psutil.NoSuchProcess:
794
+ return False
795
+ except psutil.Error:
796
+ return True
797
+
779
798
  @staticmethod
780
799
  def acquire(mutex, pid, relpath, deadline=None):
781
800
  """
782
801
  Spin-CAS acquire of a per-table MUTEX's `pid` field (1us sleep loop).
783
802
  Atomically sets `mutex.pid = pid` once it observes `mutex.pid == 0`.
784
803
  Staleness recovery: if the current holder PID is *dead*
785
- (`psutil.pid_exists` is False), force-acquires by CASing
786
- `holder_pid -> pid`.
804
+ (`_holder_alive` is False — includes zombie holders, which
805
+ `psutil.pid_exists` alone would keep reporting alive), force-acquires
806
+ by CASing `holder_pid -> pid`.
787
807
 
788
808
  =====================================================================
789
809
  *** NON-REENTRANT ***
@@ -862,7 +882,7 @@ class SharedData:
862
882
  telapsed = time.time() - tini
863
883
  if (telapsed > SharedData.LOCK_WAIT_REPORTED) | ((firstcheck) & (telapsed > 1)):
864
884
  lockingpid = mutex['pid']
865
- if not psutil.pid_exists(lockingpid):
885
+ if not SharedData._holder_alive(int(lockingpid)):
866
886
  if cpp.long_compare_and_swap(hdrptr, semseek, lockingpid, pid) != 0:
867
887
  break
868
888
  # A long wait is reported once, when it has lasted LOCK_WAIT_REPORTED
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shareddata
3
- Version: 6.85.17
3
+ Version: 6.85.18
4
4
  Summary: Memory Mapped / Shared Memory Database with S3 repository
5
5
  Home-page: https://shareddata.net
6
6
  Author: shareddata
File without changes
File without changes
File without changes
File without changes