buildgrid 0.2.52__tar.gz → 0.3.0__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 (438) hide show
  1. {buildgrid-0.2.52 → buildgrid-0.3.0}/PKG-INFO +3 -2
  2. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/sql.py +29 -15
  3. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/sql.py +4 -17
  4. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/impl.py +45 -72
  5. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/notifier.py +2 -38
  6. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/0c17a7cb2bc5_initial_database_state.py +0 -4
  7. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/models.py +2 -2
  8. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/provider.py +23 -89
  9. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/utils.py +8 -35
  10. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/version.py +1 -1
  11. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/PKG-INFO +3 -2
  12. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/SOURCES.txt +0 -3
  13. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/requires.txt +2 -1
  14. {buildgrid-0.2.52 → buildgrid-0.3.0}/pyproject.toml +6 -3
  15. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_instance_pools.py +1 -1
  16. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_scheduler.py +62 -18
  17. buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/__init__.py +0 -4
  18. buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/postgresqldelegate.py +0 -65
  19. buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/sqlitedelegate.py +0 -65
  20. {buildgrid-0.2.52 → buildgrid-0.3.0}/BuildGrid.doap +0 -0
  21. {buildgrid-0.2.52 → buildgrid-0.3.0}/CONTRIBUTING.rst +0 -0
  22. {buildgrid-0.2.52 → buildgrid-0.3.0}/LICENSE +0 -0
  23. {buildgrid-0.2.52 → buildgrid-0.3.0}/MANIFEST.in +0 -0
  24. {buildgrid-0.2.52 → buildgrid-0.3.0}/README.rst +0 -0
  25. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/__init__.py +0 -0
  26. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/__init__.py +0 -0
  27. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/__init__.py +0 -0
  28. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/__init__.py +0 -0
  29. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/__init__.py +0 -0
  30. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/__init__.py +0 -0
  31. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/__init__.py +0 -0
  32. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py +0 -0
  33. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.pyi +0 -0
  34. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py +0 -0
  35. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.pyi +0 -0
  36. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.py +0 -0
  37. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.pyi +0 -0
  38. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/__init__.py +0 -0
  39. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/__init__.py +0 -0
  40. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py +0 -0
  41. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.pyi +0 -0
  42. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py +0 -0
  43. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.pyi +0 -0
  44. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.py +0 -0
  45. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.pyi +0 -0
  46. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/__init__.py +0 -0
  47. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/__init__.py +0 -0
  48. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.py +0 -0
  49. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.pyi +0 -0
  50. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.py +0 -0
  51. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.pyi +0 -0
  52. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.py +0 -0
  53. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.pyi +0 -0
  54. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/__init__.py +0 -0
  55. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2.py +0 -0
  56. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2.pyi +0 -0
  57. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.py +0 -0
  58. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.pyi +0 -0
  59. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.py +0 -0
  60. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.pyi +0 -0
  61. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/__init__.py +0 -0
  62. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2.py +0 -0
  63. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2.pyi +0 -0
  64. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.py +0 -0
  65. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.pyi +0 -0
  66. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.py +0 -0
  67. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.pyi +0 -0
  68. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/__init__.py +0 -0
  69. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2.py +0 -0
  70. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2.pyi +0 -0
  71. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.py +0 -0
  72. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.pyi +0 -0
  73. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.py +0 -0
  74. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.pyi +0 -0
  75. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2.py +0 -0
  76. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2.pyi +0 -0
  77. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.py +0 -0
  78. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.pyi +0 -0
  79. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.py +0 -0
  80. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.pyi +0 -0
  81. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2.py +0 -0
  82. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2.pyi +0 -0
  83. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.py +0 -0
  84. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.pyi +0 -0
  85. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.py +0 -0
  86. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.pyi +0 -0
  87. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2.py +0 -0
  88. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2.pyi +0 -0
  89. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.py +0 -0
  90. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.pyi +0 -0
  91. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.py +0 -0
  92. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.pyi +0 -0
  93. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.py +0 -0
  94. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.pyi +0 -0
  95. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.py +0 -0
  96. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.pyi +0 -0
  97. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.py +0 -0
  98. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.pyi +0 -0
  99. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2.py +0 -0
  100. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2.pyi +0 -0
  101. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.py +0 -0
  102. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.pyi +0 -0
  103. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.py +0 -0
  104. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.pyi +0 -0
  105. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2.py +0 -0
  106. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2.pyi +0 -0
  107. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.py +0 -0
  108. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.pyi +0 -0
  109. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.py +0 -0
  110. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.pyi +0 -0
  111. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/__init__.py +0 -0
  112. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/__init__.py +0 -0
  113. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2.py +0 -0
  114. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2.pyi +0 -0
  115. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc.py +0 -0
  116. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc.pyi +0 -0
  117. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.py +0 -0
  118. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.pyi +0 -0
  119. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2.py +0 -0
  120. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2.pyi +0 -0
  121. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc.py +0 -0
  122. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc.pyi +0 -0
  123. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc_aio.py +0 -0
  124. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc_aio.pyi +0 -0
  125. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2.py +0 -0
  126. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2.pyi +0 -0
  127. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.py +0 -0
  128. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.pyi +0 -0
  129. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.py +0 -0
  130. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.pyi +0 -0
  131. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2.py +0 -0
  132. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2.pyi +0 -0
  133. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc.py +0 -0
  134. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc.pyi +0 -0
  135. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc_aio.py +0 -0
  136. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc_aio.pyi +0 -0
  137. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/__init__.py +0 -0
  138. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2.py +0 -0
  139. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2.pyi +0 -0
  140. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.py +0 -0
  141. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.pyi +0 -0
  142. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.py +0 -0
  143. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.pyi +0 -0
  144. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/__init__.py +0 -0
  145. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/__init__.py +0 -0
  146. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/__init__.py +0 -0
  147. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.py +0 -0
  148. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.pyi +0 -0
  149. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.py +0 -0
  150. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.pyi +0 -0
  151. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.py +0 -0
  152. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.pyi +0 -0
  153. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.py +0 -0
  154. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.pyi +0 -0
  155. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.py +0 -0
  156. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.pyi +0 -0
  157. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.py +0 -0
  158. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.pyi +0 -0
  159. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.py +0 -0
  160. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.pyi +0 -0
  161. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.py +0 -0
  162. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.pyi +0 -0
  163. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.py +0 -0
  164. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.pyi +0 -0
  165. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/__init__.py +0 -0
  166. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/__init__.py +0 -0
  167. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.py +0 -0
  168. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.pyi +0 -0
  169. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.py +0 -0
  170. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.pyi +0 -0
  171. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.py +0 -0
  172. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.pyi +0 -0
  173. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.py +0 -0
  174. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.pyi +0 -0
  175. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.py +0 -0
  176. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.pyi +0 -0
  177. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.py +0 -0
  178. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.pyi +0 -0
  179. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.py +0 -0
  180. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.pyi +0 -0
  181. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.py +0 -0
  182. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.pyi +0 -0
  183. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.py +0 -0
  184. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.pyi +0 -0
  185. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.py +0 -0
  186. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.pyi +0 -0
  187. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.py +0 -0
  188. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.pyi +0 -0
  189. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.py +0 -0
  190. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.pyi +0 -0
  191. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/__init__.py +0 -0
  192. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2.py +0 -0
  193. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2.pyi +0 -0
  194. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.py +0 -0
  195. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.pyi +0 -0
  196. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.py +0 -0
  197. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.pyi +0 -0
  198. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/__init__.py +0 -0
  199. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2.py +0 -0
  200. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2.pyi +0 -0
  201. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc.py +0 -0
  202. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc.pyi +0 -0
  203. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.py +0 -0
  204. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.pyi +0 -0
  205. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2.py +0 -0
  206. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2.pyi +0 -0
  207. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.py +0 -0
  208. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.pyi +0 -0
  209. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.py +0 -0
  210. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.pyi +0 -0
  211. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2.py +0 -0
  212. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2.pyi +0 -0
  213. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc.py +0 -0
  214. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc.pyi +0 -0
  215. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.py +0 -0
  216. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.pyi +0 -0
  217. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/__init__.py +0 -0
  218. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/__init__.py +0 -0
  219. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/__init__.py +0 -0
  220. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/action_cache_abc.py +0 -0
  221. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/lru_cache.py +0 -0
  222. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/mirrored_cache.py +0 -0
  223. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/redis_cache.py +0 -0
  224. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/remote_cache.py +0 -0
  225. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/s3_cache.py +0 -0
  226. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/sharded_cache.py +0 -0
  227. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/with_cache.py +0 -0
  228. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/write_once_cache.py +0 -0
  229. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/instance.py +0 -0
  230. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/service.py +0 -0
  231. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/__init__.py +0 -0
  232. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/cli.py +0 -0
  233. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/__init__.py +0 -0
  234. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_actioncache.py +0 -0
  235. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_capabilities.py +0 -0
  236. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_cas.py +0 -0
  237. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_cleanup.py +0 -0
  238. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_execute.py +0 -0
  239. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_janitor.py +0 -0
  240. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_logstream.py +0 -0
  241. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_operation.py +0 -0
  242. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_quota.py +0 -0
  243. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_server.py +0 -0
  244. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/rpc_utils.py +0 -0
  245. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/__init__.py +0 -0
  246. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/config.py +0 -0
  247. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/mapper.py +0 -0
  248. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/parser.py +0 -0
  249. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/reference.yml +0 -0
  250. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/schema.yml +0 -0
  251. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/__init__.py +0 -0
  252. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/config.py +0 -0
  253. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/enums.py +0 -0
  254. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/exceptions.py +0 -0
  255. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/manager.py +0 -0
  256. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/__init__.py +0 -0
  257. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/instance.py +0 -0
  258. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/service.py +0 -0
  259. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/__init__.py +0 -0
  260. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/service.py +0 -0
  261. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/storage.py +0 -0
  262. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/__init__.py +0 -0
  263. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/instance.py +0 -0
  264. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/service.py +0 -0
  265. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/__init__.py +0 -0
  266. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/instance.py +0 -0
  267. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/service.py +0 -0
  268. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/__init__.py +0 -0
  269. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/disk.py +0 -0
  270. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/__init__.py +0 -0
  271. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/index_abc.py +0 -0
  272. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/redis.py +0 -0
  273. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/lru_memory_cache.py +0 -0
  274. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/redis.py +0 -0
  275. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/remote.py +0 -0
  276. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/replicated.py +0 -0
  277. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/s3.py +0 -0
  278. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/sharded.py +0 -0
  279. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/size_differentiated.py +0 -0
  280. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/storage_abc.py +0 -0
  281. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/with_cache.py +0 -0
  282. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/__init__.py +0 -0
  283. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/cleanup.py +0 -0
  284. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/__init__.py +0 -0
  285. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/config.py +0 -0
  286. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/index.py +0 -0
  287. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/s3.py +0 -0
  288. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/sql.py +0 -0
  289. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/types.py +0 -0
  290. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/utils.py +0 -0
  291. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/__init__.py +0 -0
  292. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/actioncache.py +0 -0
  293. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/asset.py +0 -0
  294. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/auth_token_loader.py +0 -0
  295. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/authentication.py +0 -0
  296. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/capabilities.py +0 -0
  297. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/cas.py +0 -0
  298. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/channel.py +0 -0
  299. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/interceptors.py +0 -0
  300. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/logstream.py +0 -0
  301. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/quota.py +0 -0
  302. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/retrier.py +0 -0
  303. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/context.py +0 -0
  304. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/controller.py +0 -0
  305. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/__init__.py +0 -0
  306. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/authorize.py +0 -0
  307. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/errors.py +0 -0
  308. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/instance.py +0 -0
  309. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/io.py +0 -0
  310. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/limiter.py +0 -0
  311. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/metadata.py +0 -0
  312. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/requestid.py +0 -0
  313. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/rpc.py +0 -0
  314. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/time.py +0 -0
  315. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/enums.py +0 -0
  316. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/exceptions.py +0 -0
  317. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/__init__.py +0 -0
  318. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/instance.py +0 -0
  319. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/service.py +0 -0
  320. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/__init__.py +0 -0
  321. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/instance.py +0 -0
  322. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/service.py +0 -0
  323. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/limiter.py +0 -0
  324. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/logging.py +0 -0
  325. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metadata.py +0 -0
  326. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_names.py +0 -0
  327. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_tags.py +0 -0
  328. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_utils.py +0 -0
  329. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/monitoring.py +0 -0
  330. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/__init__.py +0 -0
  331. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/__init__.py +0 -0
  332. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/filter.py +0 -0
  333. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/filter_grammar.lark +0 -0
  334. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/interpreter.py +0 -0
  335. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/parser.py +0 -0
  336. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/sanitizer.py +0 -0
  337. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/instance.py +0 -0
  338. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/service.py +0 -0
  339. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/quota/__init__.py +0 -0
  340. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/quota/service.py +0 -0
  341. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/redis/__init__.py +0 -0
  342. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/redis/provider.py +0 -0
  343. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/s3/__init__.py +0 -0
  344. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/s3/s3utils.py +0 -0
  345. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/__init__.py +0 -0
  346. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/assigner.py +0 -0
  347. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/cohorts.py +0 -0
  348. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/events.py +0 -0
  349. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/properties.py +0 -0
  350. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sentry.py +0 -0
  351. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/server.py +0 -0
  352. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/servicer.py +0 -0
  353. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/settings.py +0 -0
  354. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/__init__.py +0 -0
  355. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/README +0 -0
  356. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/env.py +0 -0
  357. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/script.py.mako +0 -0
  358. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/0596ea8f5c61_add_bot_locality_hints_table_and_.py +0 -0
  359. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/12992085e81a_add_a_job_index_on_worker_name_and_.py +0 -0
  360. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/1f959c3834d3_drop_the_leases_table.py +0 -0
  361. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/22cc661efef9_add_instance_quotas_table.py +0 -0
  362. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/55acd9b4ec38_add_ix_jobs_property_label_stage.py +0 -0
  363. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/55fcf6c874d3_remove_request_metadata_from_operations.py +0 -0
  364. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/5745d1f0e537_drop_unused_indexes_and_create_.py +0 -0
  365. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/5b90ed0e9d0b_drop_ix_jobs_worker_name_stage.py +0 -0
  366. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/85096c931383_drop_ix_jobs_stage_property_label_and_.py +0 -0
  367. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/8fd7118e215e_add_instanced_job_scheduling_index.py +0 -0
  368. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/90bd87d052a0_add_an_audit_table_for_job_state_changes.py +0 -0
  369. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/910398062924_add_property_labels_table.py +0 -0
  370. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/9e7a59ee4370_add_bot_platform_capabilities_to_the_.py +0 -0
  371. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/9ecd996412a9_add_worker_name_to_jobs_table.py +0 -0
  372. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/b3b9d7300155_add_capacity_to_bots.py +0 -0
  373. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/bde0df23383b_add_cohort_to_bots.py +0 -0
  374. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/d850621a10d8_add_assigner_name_to_jobs.py +0 -0
  375. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/fb8afebee8e6_add_ix_jobs_worker_name_stage.py +0 -0
  376. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/threading.py +0 -0
  377. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/types.py +0 -0
  378. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/__init__.py +0 -0
  379. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/async_lru_cache.py +0 -0
  380. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/bots.py +0 -0
  381. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/cancellation.py +0 -0
  382. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/digests.py +0 -0
  383. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/dependency_links.txt +0 -0
  384. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/entry_points.txt +0 -0
  385. {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/top_level.txt +0 -0
  386. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/all-in-one.yml +0 -0
  387. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/artifacts.yml +0 -0
  388. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/bots-interface.yml +0 -0
  389. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/cache.yml +0 -0
  390. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/controller.yml +0 -0
  391. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/default.yml +0 -0
  392. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/logstream.yml +0 -0
  393. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/monitoring-controller.yml +0 -0
  394. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/multi-container.yml +0 -0
  395. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/multi-layer-storage.yml +0 -0
  396. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/redis-cache.yml +0 -0
  397. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/s3-indexed-cas.yml +0 -0
  398. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage-redis.yml +0 -0
  399. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage-s3.yml +0 -0
  400. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage.yml +0 -0
  401. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/with-metering.yml +0 -0
  402. {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/with-pgbouncer.yml +0 -0
  403. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/Makefile +0 -0
  404. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/basic-disk-cas.yml +0 -0
  405. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/bazel-example-server.yml +0 -0
  406. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/buildstream-example-server.yml +0 -0
  407. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/cas-and-ac.yml +0 -0
  408. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/cas-example-server.yml +0 -0
  409. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/execution-and-bots.yml +0 -0
  410. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/postgresql-index-cas-only.yml +0 -0
  411. {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/index.rst +0 -0
  412. {buildgrid-0.2.52 → buildgrid-0.3.0}/setup.cfg +0 -0
  413. {buildgrid-0.2.52 → buildgrid-0.3.0}/setup.py +0 -0
  414. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/auth.yaml +0 -0
  415. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwks-valid.json +0 -0
  416. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-conflicting.secret +0 -0
  417. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-expired.token +0 -0
  418. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-matching.secret +0 -0
  419. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-unbounded.token +0 -0
  420. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-valid.token +0 -0
  421. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-conflicting.pub.key +0 -0
  422. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-expired.token +0 -0
  423. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-jwk-encrypted.token +0 -0
  424. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-matching.priv.key +0 -0
  425. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-matching.pub.key +0 -0
  426. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-unbounded.token +0 -0
  427. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-valid.token +0 -0
  428. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_async_lru_cache.py +0 -0
  429. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_example_configs.py +0 -0
  430. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_execution_instance.py +0 -0
  431. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_job_assigner.py +0 -0
  432. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_limiter.py +0 -0
  433. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_logging.py +0 -0
  434. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_metrics_tags.py +0 -0
  435. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_metrics_utils.py +0 -0
  436. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_mirrored_cache.py +0 -0
  437. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_request_metadata_utils.py +0 -0
  438. {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildgrid
3
- Version: 0.2.52
3
+ Version: 0.3.0
4
4
  Summary: A remote execution service
5
5
  License: Apache License, Version 2.0
6
6
  Project-URL: Homepage, https://buildgrid.build
@@ -42,7 +42,7 @@ Requires-Dist: fakeredis>=2.10.1; extra == "redis"
42
42
  Requires-Dist: redis>=4.5.1; extra == "redis"
43
43
  Requires-Dist: hiredis; extra == "redis"
44
44
  Provides-Extra: docs
45
- Requires-Dist: Sphinx; extra == "docs"
45
+ Requires-Dist: Sphinx<=8; extra == "docs"
46
46
  Requires-Dist: sphinx-click; extra == "docs"
47
47
  Requires-Dist: sphinx-rtd-theme; extra == "docs"
48
48
  Requires-Dist: sphinxcontrib-apidoc; extra == "docs"
@@ -77,6 +77,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
77
77
  Requires-Dist: memray; extra == "dev"
78
78
  Requires-Dist: ruff; extra == "dev"
79
79
  Requires-Dist: grpcio-tools; extra == "dev"
80
+ Requires-Dist: bump4version; extra == "dev"
80
81
  Provides-Extra: mypy
81
82
  Requires-Dist: mypy; extra == "mypy"
82
83
  Requires-Dist: SQLAlchemy[mypy]; extra == "mypy"
@@ -17,8 +17,7 @@
17
17
  SQLIndex
18
18
  ==================
19
19
 
20
- A SQL index implementation. This can be pointed to either a remote SQL server
21
- or a local SQLite database.
20
+ A SQL index implementation. This must be pointed to a remote SQL server.
22
21
 
23
22
  """
24
23
 
@@ -35,6 +34,8 @@ from sqlalchemy.orm import InstrumentedAttribute, Session, load_only
35
34
  from sqlalchemy.orm.exc import StaleDataError
36
35
  from sqlalchemy.orm.query import Query
37
36
  from sqlalchemy.orm.session import Session as SessionType
37
+ from sqlalchemy.dialects.postgresql import insert
38
+ from sqlalchemy.sql.functions import coalesce
38
39
 
39
40
  from buildgrid._protos.build.bazel.remote.execution.v2.remote_execution_pb2 import Digest
40
41
  from buildgrid._protos.google.rpc import code_pb2
@@ -49,10 +50,8 @@ from buildgrid.server.sql.provider import SqlProvider
49
50
 
50
51
  from ..storage_abc import StorageABC
51
52
  from .index_abc import IndexABC
52
- from .sql_dialect_delegates import PostgreSQLDelegate, SQLiteDelegate
53
53
 
54
54
  LOGGER = buildgrid_logger(__name__)
55
- DIALECT_DELEGATES = {"postgresql": PostgreSQLDelegate, "sqlite": SQLiteDelegate}
56
55
 
57
56
  INLINE_BLOB_SIZE_HARD_MAXIMUM = 1000000000
58
57
 
@@ -151,9 +150,6 @@ class SQLIndex(IndexABC):
151
150
  unknown_args = kwargs_keys - available_options
152
151
  raise TypeError(f"Unknown keyword arguments: [{unknown_args}]")
153
152
 
154
- # Dialect-specific initialization
155
- self._dialect_delegate = DIALECT_DELEGATES.get(self._sql.dialect)
156
-
157
153
  if inclause_limit > 0:
158
154
  if inclause_limit > window_size:
159
155
  LOGGER.warning(
@@ -377,14 +373,32 @@ class SQLIndex(IndexABC):
377
373
 
378
374
  digest_blob_pairs = sorted(digest_blob_pairs, key=lambda pair: (pair[0].hash, pair[0].size_bytes))
379
375
 
380
- if self._dialect_delegate:
381
- try:
382
- self._dialect_delegate._save_digests_to_index( # type: ignore
383
- digest_blob_pairs, session, self._max_inline_blob_size
384
- )
385
- return
386
- except AttributeError:
387
- pass
376
+ # See discussion of __table__ typing in https://github.com/sqlalchemy/sqlalchemy/issues/9130
377
+ index_table = cast(Table, IndexEntry.__table__)
378
+ update_time = datetime.utcnow()
379
+ new_rows = [
380
+ {
381
+ "digest_hash": digest.hash,
382
+ "digest_size_bytes": digest.size_bytes,
383
+ "accessed_timestamp": update_time,
384
+ "inline_blob": (blob if digest.size_bytes <= self._max_inline_blob_size else None),
385
+ "deleted": False,
386
+ }
387
+ for (digest, blob) in digest_blob_pairs
388
+ ]
389
+
390
+ base_insert_stmt = insert(index_table).values(new_rows)
391
+
392
+ update_stmt = base_insert_stmt.on_conflict_do_update(
393
+ index_elements=["digest_hash"],
394
+ set_={
395
+ "accessed_timestamp": update_time,
396
+ "inline_blob": coalesce(base_insert_stmt.excluded.inline_blob, index_table.c.inline_blob),
397
+ "deleted": False,
398
+ },
399
+ )
400
+
401
+ session.execute(update_stmt)
388
402
 
389
403
  update_time = datetime.utcnow()
390
404
  # Figure out which digests we can just update
@@ -26,8 +26,7 @@ from io import BytesIO
26
26
  from typing import IO, Any, Iterator, Sequence, TypedDict, cast
27
27
 
28
28
  from sqlalchemy import CursorResult, delete, func, select
29
- from sqlalchemy.dialects.postgresql import insert as postgresql_insert
30
- from sqlalchemy.dialects.sqlite import insert as sqlite_insert
29
+ from sqlalchemy.dialects.postgresql import insert
31
30
  from sqlalchemy.exc import DBAPIError
32
31
  from sqlalchemy.orm.exc import StaleDataError
33
32
 
@@ -59,7 +58,7 @@ class SQLStorage(StorageABC):
59
58
  self._sql_ro = sql_ro_provider or sql_provider
60
59
  self._inclause_limit = self._sql.default_inlimit
61
60
 
62
- supported_dialects = ["postgresql", "sqlite"]
61
+ supported_dialects = ["postgresql"]
63
62
 
64
63
  if self._sql.dialect not in supported_dialects:
65
64
  raise RuntimeError(
@@ -71,14 +70,6 @@ class SQLStorage(StorageABC):
71
70
  with self._sql.session() as session:
72
71
  session.query(BlobEntry).first()
73
72
 
74
- def _sqlite_bulk_insert(self, new_rows: list[DigestRow]) -> None:
75
- with self._sql.session() as session:
76
- session.execute(sqlite_insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
77
-
78
- def _postgresql_bulk_insert(self, new_rows: list[DigestRow]) -> None:
79
- with self._sql.session() as session:
80
- session.execute(postgresql_insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
81
-
82
73
  def _bulk_insert(self, digests: list[tuple[Digest, bytes]]) -> None:
83
74
  # Sort digests by hash to ensure consistent order to minimize deadlocks
84
75
  # when BatchUpdateBlobs requests have overlapping blobs
@@ -87,12 +78,8 @@ class SQLStorage(StorageABC):
87
78
  for (digest, blob) in sorted(digests, key=lambda x: x[0].hash)
88
79
  ]
89
80
 
90
- if self._sql.dialect == "sqlite":
91
- self._sqlite_bulk_insert(new_rows)
92
- elif self._sql.dialect == "postgresql":
93
- self._postgresql_bulk_insert(new_rows)
94
- else:
95
- raise RuntimeError(f"Unsupported dialect {self._sql.dialect} for bulk_insert")
81
+ with self._sql.session() as session:
82
+ session.execute(insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
96
83
 
97
84
  @timed(METRIC.STORAGE.STAT_DURATION, type=TYPE)
98
85
  def has_blob(self, digest: Digest) -> bool:
@@ -31,7 +31,7 @@ from google.protobuf.internal.containers import RepeatedCompositeFieldContainer
31
31
  from google.protobuf.timestamp_pb2 import Timestamp
32
32
  from grpc import Channel
33
33
  from sqlalchemy import ColumnExpressionArgument, CursorResult, and_, delete, func, insert, or_, select, text, update
34
- from sqlalchemy.dialects import postgresql, sqlite
34
+ from sqlalchemy.dialects import postgresql
35
35
  from sqlalchemy.exc import IntegrityError
36
36
  from sqlalchemy.orm import Session, joinedload
37
37
  from sqlalchemy.sql.expression import Insert, Select
@@ -760,11 +760,10 @@ class Scheduler:
760
760
  )
761
761
 
762
762
  def _notify_job_updated(self, job_names: str | list[str], session: Session) -> None:
763
- if self._sql.dialect == "postgresql":
764
- if isinstance(job_names, str):
765
- job_names = [job_names]
766
- for job_name in job_names:
767
- session.execute(text(f"NOTIFY {NotificationChannel.JOB_UPDATED.value}, '{job_name}';"))
763
+ if isinstance(job_names, str):
764
+ job_names = [job_names]
765
+ for job_name in job_names:
766
+ session.execute(text(f"NOTIFY {NotificationChannel.JOB_UPDATED.value}, '{job_name}';"))
768
767
 
769
768
  def _get_operation(self, operation_name: str, session: Session) -> OperationEntry | None:
770
769
  statement = (
@@ -776,7 +775,7 @@ class Scheduler:
776
775
 
777
776
  def _batch_timeout_jobs(self, job_select_stmt: Select[Any], status_code: int, message: str) -> int:
778
777
  """Timeout all jobs selected by a query"""
779
- with self._sql.session(sqlite_lock_immediately=True, exceptions_to_not_raise_on=[Exception]) as session:
778
+ with self._sql.session(exceptions_to_not_raise_on=[Exception]) as session:
780
779
  # Get the full list of jobs to timeout
781
780
  job_entries = session.execute(job_select_stmt).scalars().all()
782
781
  jobs = []
@@ -838,7 +837,7 @@ class Scheduler:
838
837
  .limit(1)
839
838
  .with_for_update(skip_locked=True)
840
839
  )
841
- with self._sql.session(sqlite_lock_immediately=True, exceptions_to_not_raise_on=[Exception]) as session:
840
+ with self._sql.session(exceptions_to_not_raise_on=[Exception]) as session:
842
841
  job = session.execute(stale_job_statement).scalar_one_or_none()
843
842
  if not job:
844
843
  return False
@@ -916,22 +915,14 @@ class Scheduler:
916
915
  job.cancelled = True
917
916
 
918
917
  # If the job was assigned to a bot, we need to update the quota / capacity
919
- if self._sql.dialect == "postgresql":
920
- update_query = (
921
- update(BotEntry)
922
- .where(BotEntry.bot_id == job.worker_name)
923
- .values(capacity=BotEntry.capacity + 1)
924
- .returning(BotEntry.cohort)
925
- )
926
- if cohort := session.execute(update_query).scalar_one_or_none():
927
- self._update_instance_quota_usage(session, cohort, job.instance_name, -1, guard=None)
928
- else:
929
- if bot := session.execute(
930
- select(BotEntry).where(BotEntry.bot_id == job.worker_name).with_for_update()
931
- ).scalar_one_or_none():
932
- bot.capacity += 1
933
- if bot.cohort:
934
- self._update_instance_quota_usage(session, bot.cohort, job.instance_name, -1, guard=None)
918
+ update_query = (
919
+ update(BotEntry)
920
+ .where(BotEntry.bot_id == job.worker_name)
921
+ .values(capacity=BotEntry.capacity + 1)
922
+ .returning(BotEntry.cohort)
923
+ )
924
+ if cohort := session.execute(update_query).scalar_one_or_none():
925
+ self._update_instance_quota_usage(session, cohort, job.instance_name, -1, guard=None)
935
926
 
936
927
  session.add(
937
928
  JobHistoryEntry(
@@ -1157,8 +1148,7 @@ class Scheduler:
1157
1148
  self._notify_job_updated(job.name, session)
1158
1149
 
1159
1150
  LOGGER.debug("Assigned job to bot", tags=log_tags)
1160
- if self._sql.dialect == "postgresql":
1161
- session.execute(text(f"NOTIFY {NotificationChannel.JOB_ASSIGNED.value}, '{bot.name}';"))
1151
+ session.execute(text(f"NOTIFY {NotificationChannel.JOB_ASSIGNED.value}, '{bot.name}';"))
1162
1152
 
1163
1153
  def _match_bot_by_sampling(
1164
1154
  self, session: Session, query: Select[tuple[BotEntry]], sampling: SamplingConfig
@@ -1523,7 +1513,7 @@ class Scheduler:
1523
1513
  )
1524
1514
 
1525
1515
  updated = False
1526
- with self._sql.session(sqlite_lock_immediately=True) as session:
1516
+ with self._sql.session() as session:
1527
1517
  job = session.execute(job_statement).scalar_one_or_none()
1528
1518
  if job is not None:
1529
1519
  self._match_job_to_bot(session, job, failure_backoff, bot_assignment_fn, assigner_name)
@@ -1558,7 +1548,7 @@ class Scheduler:
1558
1548
  )
1559
1549
 
1560
1550
  updated = False
1561
- with self._sql.session(sqlite_lock_immediately=True) as session:
1551
+ with self._sql.session() as session:
1562
1552
  job = session.execute(job_statement).scalar_one_or_none()
1563
1553
  if job is not None:
1564
1554
  self._match_job_to_bot(session, job, failure_backoff, bot_assignment_fn, assigner_name)
@@ -1702,22 +1692,8 @@ class Scheduler:
1702
1692
  return num_rows_deleted
1703
1693
 
1704
1694
  def _insert_on_conflict_do_nothing(self, model: type[OrmBase]) -> Insert:
1705
- # `Insert.on_conflict_do_nothing` is a SQLAlchemy "generative method", it
1706
- # returns a modified copy of the statement it is called on. For
1707
- # some reason mypy can't understand this, so the errors are ignored here.
1708
- if self._sql.dialect == "sqlite":
1709
- sqlite_insert: sqlite.Insert = sqlite.insert(model)
1710
- return sqlite_insert.on_conflict_do_nothing()
1711
-
1712
- elif self._sql.dialect == "postgresql":
1713
- insertion: postgresql.Insert = postgresql.insert(model)
1714
- return insertion.on_conflict_do_nothing()
1715
-
1716
- else:
1717
- # Fall back to the non-specific insert implementation. This doesn't
1718
- # support `ON CONFLICT DO NOTHING`, so callers need to be careful to
1719
- # still catch IntegrityErrors if other database backends are possible.
1720
- return insert(model)
1695
+ insertion: postgresql.Insert = postgresql.insert(model)
1696
+ return insertion.on_conflict_do_nothing()
1721
1697
 
1722
1698
  def get_or_create_client_identity_in_store(
1723
1699
  self, session: Session, client_id: ClientIdentityEntry
@@ -1744,7 +1720,7 @@ class Scheduler:
1744
1720
  try:
1745
1721
  session.execute(insertion)
1746
1722
 
1747
- # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL or SQLite)
1723
+ # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL)
1748
1724
  except IntegrityError:
1749
1725
  LOGGER.debug("Handled IntegrityError when inserting client identity.")
1750
1726
 
@@ -1777,7 +1753,7 @@ class Scheduler:
1777
1753
  try:
1778
1754
  session.execute(insertion)
1779
1755
 
1780
- # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL or SQLite)
1756
+ # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL)
1781
1757
  except IntegrityError:
1782
1758
  LOGGER.debug("Handled IntegrityError when inserting request metadata.")
1783
1759
 
@@ -1949,7 +1925,9 @@ class Scheduler:
1949
1925
  )
1950
1926
 
1951
1927
  @timed(METRIC.SCHEDULER.ASSIGNMENT_DURATION)
1952
- def _fetch_job_for_bot(self, session: Session, bot: BotEntry, log_tags: Tags) -> JobEntry | None:
1928
+ def _fetch_job_for_bot(
1929
+ self, session: Session, bot: BotEntry, usage_diffs: InstanceQuotaUsageDiffs, log_tags: Tags
1930
+ ) -> JobEntry | None:
1953
1931
  # Attempt to fetch a new job for a bot to work on.
1954
1932
  # This can help if there are usually more jobs available than bots.
1955
1933
 
@@ -1959,15 +1937,22 @@ class Scheduler:
1959
1937
  if bot.instance_name != "*":
1960
1938
  job_statement = job_statement.where(self._job_in_instance_pool())
1961
1939
 
1962
- # Prioritize instance where usage <= max_quota - bot.capacity
1963
- # `- bot.capacity` to avoid over-assigning jobs to bots when nearing quota limits
1964
- instances_query = select(InstanceQuota.instance_name).where(
1965
- InstanceQuota.bot_cohort == bot.cohort,
1966
- InstanceQuota.current_usage <= InstanceQuota.max_quota - bot.capacity,
1967
- )
1968
- instances = session.execute(instances_query).scalars().all()
1969
- if instances:
1970
- job_statement = job_statement.where(JobEntry.instance_name.in_(instances))
1940
+ if bot.cohort:
1941
+ # Prioritize instance where usage <= max_quota - bot.capacity
1942
+ # `- bot.capacity` to avoid over-assigning jobs to bots when nearing quota limits
1943
+ instances_query = select(InstanceQuota.instance_name).where(
1944
+ InstanceQuota.bot_cohort == bot.cohort,
1945
+ InstanceQuota.current_usage <= InstanceQuota.max_quota - bot.capacity,
1946
+ )
1947
+ instances: set[str] = set()
1948
+ instances.update(session.execute(instances_query).scalars().all())
1949
+ # Always allow scheduling more jobs of an instance if we're returning usage
1950
+ instances.update(
1951
+ {instance for (cohort, instance), diff in usage_diffs.items() if cohort == bot.cohort and diff < 0}
1952
+ )
1953
+
1954
+ if instances:
1955
+ job_statement = job_statement.where(JobEntry.instance_name.in_(instances))
1971
1956
 
1972
1957
  if next_job := session.execute(job_statement).scalar_one_or_none():
1973
1958
  log_tags["db.next_job_name"] = next_job.name
@@ -2321,7 +2306,7 @@ class Scheduler:
2321
2306
 
2322
2307
  for _ in range(fetch_limit):
2323
2308
  # Try to fill up the newly free capacity with new jobs.
2324
- if new_job := self._fetch_job_for_bot(session, bot, log_tags):
2309
+ if new_job := self._fetch_job_for_bot(session, bot, usage_diffs, log_tags):
2325
2310
  if bot.cohort:
2326
2311
  usage_diffs[(bot.cohort, new_job.instance_name)] += 1
2327
2312
  synchronized_leases.append(new_job.to_lease_proto())
@@ -2844,18 +2829,9 @@ class Scheduler:
2844
2829
  if self.bot_locality_hint_limit == 0:
2845
2830
  return
2846
2831
 
2847
- # Insert new hint with dialect-specific seq handling
2848
- if self._sql.dialect == "postgresql":
2849
- # For PostgreSQL, use the sequence to get the next seq number
2850
- next_seq = None
2851
- else:
2852
- # For SQLite, manually find the max seq number
2853
- max_seq = session.execute(
2854
- select(func.coalesce(func.max(BotLocalityHintEntry.sequence_number), 0)).where(
2855
- BotLocalityHintEntry.bot_name == bot_name
2856
- )
2857
- ).scalar_one()
2858
- next_seq = max_seq + 1
2832
+ # Insert new hint with seq handling
2833
+ # For PostgreSQL, use the sequence to get the next seq number
2834
+ next_seq = None
2859
2835
 
2860
2836
  new_hint = BotLocalityHintEntry(
2861
2837
  bot_name=bot_name,
@@ -2960,9 +2936,6 @@ class Scheduler:
2960
2936
  # `greatest(0,_)` is needed if this feature is released when there are already running jobs
2961
2937
  # TODO: remove the safe-guard after the next minor version bump
2962
2938
  new_usage: Any = func.greatest(0, InstanceQuota.current_usage + delta)
2963
- if self._sql.dialect == "sqlite":
2964
- # SQLite does not support `greatest`, so we use a simpler update for it.
2965
- new_usage = InstanceQuota.current_usage + delta
2966
2939
 
2967
2940
  update_usage_query = (
2968
2941
  update(InstanceQuota)
@@ -25,7 +25,7 @@ from sqlalchemy import select as sql_select
25
25
  from sqlalchemy.orm import Session
26
26
 
27
27
  from buildgrid.server.logging import buildgrid_logger
28
- from buildgrid.server.sql.models import BotEntry, JobEntry
28
+ from buildgrid.server.sql.models import BotEntry
29
29
  from buildgrid.server.sql.provider import SqlProvider
30
30
  from buildgrid.server.threading import ContextWorker
31
31
 
@@ -79,10 +79,7 @@ class Notifier(Generic[T]):
79
79
  while not shutdown_requested.is_set():
80
80
  try:
81
81
  with self._sql.session() as session:
82
- if self._sql.dialect == "postgresql":
83
- self._listen_for_updates(shutdown_requested, session)
84
- else:
85
- self._poll_for_updates(shutdown_requested, session)
82
+ self._listen_for_updates(shutdown_requested, session)
86
83
  except Exception as e:
87
84
  LOGGER.warning(
88
85
  f"OperationsNotifier encountered exception: {e}.",
@@ -122,23 +119,6 @@ class Notifier(Generic[T]):
122
119
  notify = dbapi_connection.notifies.pop()
123
120
  self.notify(notify.payload)
124
121
 
125
- def _poll(self, names: list[str], session: Session) -> dict[str, T]:
126
- raise NotImplementedError()
127
-
128
- def _poll_for_updates(self, shutdown_requested: Event, session: Session) -> None:
129
- prev_data: dict[str, T] = {}
130
- while not shutdown_requested.is_set():
131
- with self._lock:
132
- names = list(self._listeners)
133
-
134
- next_data: dict[str, T] = self._poll(names, session)
135
- for name in next_data:
136
- if name not in prev_data or prev_data[name] != next_data[name]:
137
- self.notify(name)
138
-
139
- prev_data = next_data
140
- shutdown_requested.wait(timeout=self.poll_interval)
141
-
142
122
  def notify(self, listener_name: str) -> None:
143
123
  with self._lock:
144
124
  if listener_name in self._listeners:
@@ -179,27 +159,11 @@ class OperationsNotifier(Notifier[tuple[bool, int]]):
179
159
  """
180
160
  super().__init__(sql_provider, NotificationChannel.JOB_UPDATED, "OperationsNotifier", poll_interval)
181
161
 
182
- def _poll(self, names: list[str], session: Session) -> dict[str, tuple[bool, int]]:
183
- # Only query for the minimal amount of data required.
184
- # The subscribers can choose how they want to act (e.g. by querying the full job data).
185
- statement = sql_select(JobEntry.name, JobEntry.cancelled, JobEntry.stage).where(JobEntry.name.in_(names))
186
- next_data: dict[str, tuple[bool, int]] = {}
187
- for [name, cancelled, stage] in session.execute(statement).all():
188
- next_data[name] = (cancelled, stage)
189
- return next_data
190
-
191
162
 
192
163
  class BotNotifier(Notifier[str]):
193
164
  def __init__(self, sql_provider: SqlProvider, poll_interval: float = 1.0) -> None:
194
165
  super().__init__(sql_provider, NotificationChannel.JOB_ASSIGNED, "BotNotifier", poll_interval)
195
166
 
196
- def _poll(self, names: list[str], session: Session) -> dict[str, str]:
197
- statement = sql_select(BotEntry.name, BotEntry.lease_id).where(BotEntry.name.in_(names))
198
- next_data = {}
199
- for name, lease_id in session.execute(statement).all():
200
- next_data[name] = lease_id
201
- return next_data
202
-
203
167
  def listener_count_for_instance(self, instance_name: str) -> int:
204
168
  with self._lock:
205
169
  stmt = sql_select(func.count(BotEntry.name)).where(
@@ -119,7 +119,6 @@ def upgrade() -> None:
119
119
  ["worker_completed_timestamp"],
120
120
  unique=False,
121
121
  postgresql_where=sa.text("worker_completed_timestamp IS NOT NULL"),
122
- sqlite_where=sa.text("worker_completed_timestamp IS NOT NULL"),
123
122
  )
124
123
  op.create_index(
125
124
  "ix_worker_start_timestamp",
@@ -127,7 +126,6 @@ def upgrade() -> None:
127
126
  ["worker_start_timestamp"],
128
127
  unique=False,
129
128
  postgresql_where=sa.text("worker_start_timestamp IS NOT NULL"),
130
- sqlite_where=sa.text("worker_start_timestamp IS NOT NULL"),
131
129
  )
132
130
  op.create_table(
133
131
  "platform_properties",
@@ -220,13 +218,11 @@ def downgrade() -> None:
220
218
  "ix_worker_start_timestamp",
221
219
  table_name="jobs",
222
220
  postgresql_where=sa.text("worker_start_timestamp IS NOT NULL"),
223
- sqlite_where=sa.text("worker_start_timestamp IS NOT NULL"),
224
221
  )
225
222
  op.drop_index(
226
223
  "ix_worker_completed_timestamp",
227
224
  table_name="jobs",
228
225
  postgresql_where=sa.text("worker_completed_timestamp IS NOT NULL"),
229
- sqlite_where=sa.text("worker_completed_timestamp IS NOT NULL"),
230
226
  )
231
227
  op.drop_index(op.f("ix_jobs_worker_name"), table_name="jobs")
232
228
  op.drop_index("ix_jobs_stage_property_label", table_name="jobs")
@@ -37,7 +37,8 @@ from buildgrid.server.enums import LeaseState, OperationStage
37
37
 
38
38
  bigint = Annotated[int, "bigint"]
39
39
  # This gives us something to reference in the type_annotation_map to specify the JSONB variant when
40
- # using postgresql. When we drop SQLite support this won't be necessary versus just using JSONB in
40
+ # using postgresql.
41
+ # TODO now SQLite support has been dropped this won't be necessary versus just using JSONB in
41
42
  # the model directly.
42
43
  json = Annotated[JSON, "json"]
43
44
 
@@ -133,7 +134,6 @@ class JobEntry(Base):
133
134
  "worker_completed_timestamp",
134
135
  unique=False,
135
136
  postgresql_where=worker_completed_timestamp.isnot(None),
136
- sqlite_where=worker_completed_timestamp.isnot(None),
137
137
  ),
138
138
  Index(
139
139
  "ix_jobs_property_label_stage",