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.
- {buildgrid-0.2.52 → buildgrid-0.3.0}/PKG-INFO +3 -2
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/sql.py +29 -15
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/sql.py +4 -17
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/impl.py +45 -72
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/notifier.py +2 -38
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/0c17a7cb2bc5_initial_database_state.py +0 -4
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/models.py +2 -2
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/provider.py +23 -89
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/utils.py +8 -35
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/version.py +1 -1
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/PKG-INFO +3 -2
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/SOURCES.txt +0 -3
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/requires.txt +2 -1
- {buildgrid-0.2.52 → buildgrid-0.3.0}/pyproject.toml +6 -3
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_instance_pools.py +1 -1
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_scheduler.py +62 -18
- buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/__init__.py +0 -4
- buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/postgresqldelegate.py +0 -65
- buildgrid-0.2.52/buildgrid/server/cas/storage/index/sql_dialect_delegates/sqlitedelegate.py +0 -65
- {buildgrid-0.2.52 → buildgrid-0.3.0}/BuildGrid.doap +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/CONTRIBUTING.rst +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/LICENSE +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/MANIFEST.in +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/README.rst +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/client_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/api/http_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/action_cache_abc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/lru_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/mirrored_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/redis_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/remote_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/s3_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/sharded_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/with_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/caches/write_once_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/actioncache/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/cli.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_actioncache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_capabilities.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_cas.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_cleanup.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_execute.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_janitor.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_logstream.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_operation.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_quota.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/cmd_server.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/commands/rpc_utils.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/config.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/mapper.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/parser.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/reference.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/app/settings/schema.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/config.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/enums.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/exceptions.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/auth/manager.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/bots/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/build_events/storage.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/capabilities/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/disk.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/index_abc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/index/redis.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/lru_memory_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/redis.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/remote.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/replicated.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/s3.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/sharded.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/size_differentiated.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/storage_abc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cas/storage/with_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/cleanup.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/config.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/index.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/s3.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/sql.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/types.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/cleanup/janitor/utils.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/actioncache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/asset.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/auth_token_loader.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/authentication.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/capabilities.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/cas.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/channel.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/interceptors.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/logstream.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/quota.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/client/retrier.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/context.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/controller.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/authorize.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/errors.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/io.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/limiter.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/metadata.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/requestid.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/rpc.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/decorators/time.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/enums.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/exceptions.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/execution/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/introspection/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/limiter.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/logging.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metadata.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_names.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_tags.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/metrics_utils.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/monitoring.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/filter.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/filter_grammar.lark +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/interpreter.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/parser.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/filtering/sanitizer.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/operations/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/quota/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/quota/service.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/redis/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/redis/provider.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/s3/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/s3/s3utils.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/assigner.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/cohorts.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/events.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/scheduler/properties.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sentry.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/server.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/servicer.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/settings.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/README +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/env.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/script.py.mako +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/0596ea8f5c61_add_bot_locality_hints_table_and_.py +0 -0
- {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
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/1f959c3834d3_drop_the_leases_table.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/22cc661efef9_add_instance_quotas_table.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/55acd9b4ec38_add_ix_jobs_property_label_stage.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/55fcf6c874d3_remove_request_metadata_from_operations.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/5745d1f0e537_drop_unused_indexes_and_create_.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/5b90ed0e9d0b_drop_ix_jobs_worker_name_stage.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/85096c931383_drop_ix_jobs_stage_property_label_and_.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/8fd7118e215e_add_instanced_job_scheduling_index.py +0 -0
- {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
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/910398062924_add_property_labels_table.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/9e7a59ee4370_add_bot_platform_capabilities_to_the_.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/9ecd996412a9_add_worker_name_to_jobs_table.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/b3b9d7300155_add_capacity_to_bots.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/bde0df23383b_add_cohort_to_bots.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/d850621a10d8_add_assigner_name_to_jobs.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/sql/alembic/versions/fb8afebee8e6_add_ix_jobs_worker_name_stage.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/threading.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/types.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/__init__.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/async_lru_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/bots.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/cancellation.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid/server/utils/digests.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/dependency_links.txt +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/entry_points.txt +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/buildgrid.egg-info/top_level.txt +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/all-in-one.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/artifacts.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/bots-interface.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/cache.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/controller.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/default.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/logstream.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/monitoring-controller.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/multi-container.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/multi-layer-storage.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/redis-cache.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/s3-indexed-cas.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage-redis.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage-s3.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/storage.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/with-metering.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/data/config/with-pgbouncer.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/Makefile +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/basic-disk-cas.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/bazel-example-server.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/buildstream-example-server.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/cas-and-ac.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/cas-example-server.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/execution-and-bots.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/data/postgresql-index-cas-only.yml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/docs/source/index.rst +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/setup.cfg +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/setup.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/auth.yaml +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwks-valid.json +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-conflicting.secret +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-expired.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-matching.secret +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-unbounded.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-hs256-valid.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-conflicting.pub.key +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-expired.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-jwk-encrypted.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-matching.priv.key +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-matching.pub.key +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-unbounded.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/auth/data/jwt-rs256-valid.token +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_async_lru_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_example_configs.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_execution_instance.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_job_assigner.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_limiter.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_logging.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_metrics_tags.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_metrics_utils.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_mirrored_cache.py +0 -0
- {buildgrid-0.2.52 → buildgrid-0.3.0}/tests/test_request_metadata_utils.py +0 -0
- {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.
|
|
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
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
|
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"
|
|
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
|
-
|
|
91
|
-
|
|
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
|
|
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
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1706
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
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
|
|
2848
|
-
|
|
2849
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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",
|