buildgrid 0.2.53__tar.gz → 0.3.1__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.53 → buildgrid-0.3.1}/PKG-INFO +3 -2
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/parser.py +4 -9
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/schema.yml +4 -6
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/sql.py +29 -15
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/sql.py +4 -17
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/asset.py +4 -4
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/impl.py +42 -69
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/notifier.py +2 -38
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/0c17a7cb2bc5_initial_database_state.py +0 -4
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/models.py +2 -2
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/provider.py +23 -89
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/utils.py +8 -35
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/version.py +1 -1
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/PKG-INFO +3 -2
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/SOURCES.txt +0 -3
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/requires.txt +2 -1
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/bots-interface.yml +0 -1
- {buildgrid-0.2.53 → buildgrid-0.3.1}/pyproject.toml +6 -3
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_instance_pools.py +1 -1
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_scheduler.py +29 -22
- buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/__init__.py +0 -4
- buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/postgresqldelegate.py +0 -65
- buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/sqlitedelegate.py +0 -65
- {buildgrid-0.2.53 → buildgrid-0.3.1}/BuildGrid.doap +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/CONTRIBUTING.rst +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/LICENSE +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/MANIFEST.in +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/README.rst +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.pyi +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/action_cache_abc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/lru_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/mirrored_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/redis_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/remote_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/s3_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/sharded_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/with_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/write_once_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/cli.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_actioncache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_capabilities.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_cas.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_cleanup.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_execute.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_janitor.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_logstream.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_operation.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_quota.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_server.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/rpc_utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/config.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/mapper.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/reference.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/config.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/enums.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/exceptions.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/manager.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/storage.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/disk.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/index_abc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/redis.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/lru_memory_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/redis.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/remote.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/replicated.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/s3.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/sharded.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/size_differentiated.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/storage_abc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/with_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/cleanup.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/config.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/index.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/s3.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/sql.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/types.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/actioncache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/auth_token_loader.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/authentication.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/capabilities.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/cas.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/channel.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/interceptors.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/logstream.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/quota.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/retrier.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/context.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/controller.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/authorize.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/errors.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/io.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/limiter.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/metadata.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/requestid.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/rpc.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/time.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/enums.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/exceptions.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/limiter.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/logging.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metadata.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_names.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_tags.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/monitoring.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/filter.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/filter_grammar.lark +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/interpreter.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/parser.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/sanitizer.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/quota/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/quota/service.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/redis/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/redis/provider.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/s3/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/s3/s3utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/assigner.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/cohorts.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/events.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/properties.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sentry.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/server.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/servicer.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/settings.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/README +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/env.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/script.py.mako +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/0596ea8f5c61_add_bot_locality_hints_table_and_.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/12992085e81a_add_a_job_index_on_worker_name_and_.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/1f959c3834d3_drop_the_leases_table.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/22cc661efef9_add_instance_quotas_table.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/55acd9b4ec38_add_ix_jobs_property_label_stage.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/55fcf6c874d3_remove_request_metadata_from_operations.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/5745d1f0e537_drop_unused_indexes_and_create_.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/5b90ed0e9d0b_drop_ix_jobs_worker_name_stage.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/85096c931383_drop_ix_jobs_stage_property_label_and_.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/8fd7118e215e_add_instanced_job_scheduling_index.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/90bd87d052a0_add_an_audit_table_for_job_state_changes.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/910398062924_add_property_labels_table.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/9e7a59ee4370_add_bot_platform_capabilities_to_the_.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/9ecd996412a9_add_worker_name_to_jobs_table.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/b3b9d7300155_add_capacity_to_bots.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/bde0df23383b_add_cohort_to_bots.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/d850621a10d8_add_assigner_name_to_jobs.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/fb8afebee8e6_add_ix_jobs_worker_name_stage.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/threading.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/types.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/__init__.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/async_lru_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/bots.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/cancellation.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/digests.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/dependency_links.txt +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/entry_points.txt +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/top_level.txt +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/all-in-one.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/artifacts.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/cache.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/controller.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/default.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/logstream.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/monitoring-controller.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/multi-container.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/multi-layer-storage.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/redis-cache.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/s3-indexed-cas.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage-redis.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage-s3.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/with-metering.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/with-pgbouncer.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/Makefile +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/basic-disk-cas.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/bazel-example-server.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/buildstream-example-server.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/cas-and-ac.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/cas-example-server.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/execution-and-bots.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/postgresql-index-cas-only.yml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/index.rst +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/setup.cfg +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/setup.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/auth.yaml +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwks-valid.json +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-conflicting.secret +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-expired.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-matching.secret +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-unbounded.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-valid.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-conflicting.pub.key +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-expired.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-jwk-encrypted.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-matching.priv.key +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-matching.pub.key +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-unbounded.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-valid.token +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_async_lru_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_example_configs.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_execution_instance.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_job_assigner.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_limiter.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_logging.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_metrics_tags.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_metrics_utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_mirrored_cache.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_request_metadata_utils.py +0 -0
- {buildgrid-0.2.53 → buildgrid-0.3.1}/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.1
|
|
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"
|
|
@@ -1025,7 +1025,7 @@ def load_sql_scheduler(
|
|
|
1025
1025
|
sql_ro = sql_ro or sql
|
|
1026
1026
|
sql_notifier = sql_notifier or sql
|
|
1027
1027
|
|
|
1028
|
-
logstream_url, logstream_credentials
|
|
1028
|
+
logstream_url, logstream_credentials = get_logstream_connection_info(logstream)
|
|
1029
1029
|
logstream_channel: grpc.Channel | None = None
|
|
1030
1030
|
if logstream_url is not None:
|
|
1031
1031
|
logstream_credentials = logstream_credentials or {}
|
|
@@ -1081,7 +1081,6 @@ def load_sql_scheduler(
|
|
|
1081
1081
|
),
|
|
1082
1082
|
bot_session_keepalive_timeout=bot_session_keepalive_timeout,
|
|
1083
1083
|
logstream_channel=logstream_channel,
|
|
1084
|
-
logstream_instance=logstream_instance,
|
|
1085
1084
|
asset_client=asset_client,
|
|
1086
1085
|
queued_action_retention_hours=queued_action_retention_hours,
|
|
1087
1086
|
completed_action_retention_hours=completed_action_retention_hours,
|
|
@@ -2150,7 +2149,6 @@ def load_metering_service_client(
|
|
|
2150
2149
|
def load_asset_client(
|
|
2151
2150
|
url: str,
|
|
2152
2151
|
credentials: ClientCredentials | None = None,
|
|
2153
|
-
instance_name: str = "",
|
|
2154
2152
|
request_timeout: float = 5.0,
|
|
2155
2153
|
retries: int = 3,
|
|
2156
2154
|
) -> AssetClient:
|
|
@@ -2162,7 +2160,6 @@ def load_asset_client(
|
|
|
2162
2160
|
|
|
2163
2161
|
- !asset-client
|
|
2164
2162
|
url: https://remote-asset.com
|
|
2165
|
-
instance-name: dev
|
|
2166
2163
|
credentials:
|
|
2167
2164
|
tls-client-cert: /path/to/cert
|
|
2168
2165
|
auth-token: /path/to/token
|
|
@@ -2179,7 +2176,7 @@ def load_asset_client(
|
|
|
2179
2176
|
server_cert=credentials.get("tls-server-cert"),
|
|
2180
2177
|
timeout=request_timeout,
|
|
2181
2178
|
)
|
|
2182
|
-
return AssetClient(channel=channel,
|
|
2179
|
+
return AssetClient(channel=channel, retries=retries)
|
|
2183
2180
|
|
|
2184
2181
|
|
|
2185
2182
|
@object_tag("!introspection")
|
|
@@ -2378,18 +2375,16 @@ def _validate_server_credentials(credentials: dict[str, str] | None) -> None:
|
|
|
2378
2375
|
sys.exit(-1)
|
|
2379
2376
|
|
|
2380
2377
|
|
|
2381
|
-
def get_logstream_connection_info(logstream: Any) -> tuple[str | None, dict[str, str] | None
|
|
2378
|
+
def get_logstream_connection_info(logstream: Any) -> tuple[str | None, dict[str, str] | None]:
|
|
2382
2379
|
logstream_url = None
|
|
2383
2380
|
credentials = None
|
|
2384
|
-
logstream_instance_name = None
|
|
2385
2381
|
if logstream:
|
|
2386
2382
|
logstream_url = logstream["url"]
|
|
2387
2383
|
credentials = logstream.get("credentials")
|
|
2388
2384
|
if not _validate_url_and_credentials(logstream_url, credentials=credentials):
|
|
2389
2385
|
sys.exit(-1)
|
|
2390
|
-
logstream_instance_name = logstream.get("instance-name", "")
|
|
2391
2386
|
|
|
2392
|
-
return logstream_url, credentials
|
|
2387
|
+
return logstream_url, credentials
|
|
2393
2388
|
|
|
2394
2389
|
|
|
2395
2390
|
def get_schema(strict: bool = False) -> Any:
|
|
@@ -472,7 +472,7 @@ definitions:
|
|
|
472
472
|
priority-assignment-percentage: { type: number, minimum: 0 }
|
|
473
473
|
metering-service-client: { "$ref": "#/definitions/metering-service-client" }
|
|
474
474
|
metering-throttle-action: { type: string, enum: [deprioritize, reject] }
|
|
475
|
-
logstream: { "$ref": "#/definitions/
|
|
475
|
+
logstream: { "$ref": "#/definitions/logstream-connection-options" }
|
|
476
476
|
asset-client: { "$ref": "#/definitions/asset-client" }
|
|
477
477
|
action-browser-url: { type: string }
|
|
478
478
|
poll-interval: { type: number, minimum: 0 }
|
|
@@ -645,12 +645,11 @@ definitions:
|
|
|
645
645
|
properties:
|
|
646
646
|
kind: { type: string, enum: [ "!asset-client" ] }
|
|
647
647
|
url: { type: string }
|
|
648
|
-
instance-name: { type: string }
|
|
649
648
|
channel-options: { type: object, propertyNames: { pattern: "^[a-z0-9-]+$" } }
|
|
650
649
|
request-timeout: { type: number }
|
|
651
650
|
credentials: { "$ref": "#/definitions/grpc-credentials" }
|
|
652
651
|
retries: { type: number }
|
|
653
|
-
required: [kind, url
|
|
652
|
+
required: [kind, url]
|
|
654
653
|
|
|
655
654
|
metering-service-client:
|
|
656
655
|
type: object
|
|
@@ -783,16 +782,15 @@ definitions:
|
|
|
783
782
|
retry-limit: { type: integer, min: 0 }
|
|
784
783
|
required: [instance-name, index, high-watermark, low-watermark, batch-size]
|
|
785
784
|
|
|
786
|
-
|
|
785
|
+
logstream-connection-options:
|
|
787
786
|
type: object
|
|
788
787
|
propertyNames: { pattern: "^[A-Za-z0-9-]*$" }
|
|
789
788
|
properties:
|
|
790
789
|
url: { type: string }
|
|
791
|
-
instance-name: { type: string }
|
|
792
790
|
channel-options: { type: object, propertyNames: { pattern: "^[a-z0-9-]+$" } }
|
|
793
791
|
request-timeout: { type: number }
|
|
794
792
|
credentials: { "$ref": "#/definitions/grpc-credentials" }
|
|
795
|
-
required: [url
|
|
793
|
+
required: [url]
|
|
796
794
|
|
|
797
795
|
grpc-credentials:
|
|
798
796
|
type: object
|
|
@@ -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:
|
|
@@ -41,13 +41,11 @@ class AssetClient:
|
|
|
41
41
|
def __init__(
|
|
42
42
|
self,
|
|
43
43
|
channel: grpc.Channel,
|
|
44
|
-
instance_name: str,
|
|
45
44
|
retries: int = 0,
|
|
46
45
|
max_backoff: int = 64,
|
|
47
46
|
should_backoff: bool = True,
|
|
48
47
|
) -> None:
|
|
49
48
|
self._channel = channel
|
|
50
|
-
self._instance_name = instance_name
|
|
51
49
|
self._push_stub = PushStub(channel)
|
|
52
50
|
self._fetch_stub = FetchStub(channel)
|
|
53
51
|
self._retrier = GrpcRetrier(retries=retries, max_backoff=max_backoff, should_backoff=should_backoff)
|
|
@@ -68,6 +66,7 @@ class AssetClient:
|
|
|
68
66
|
expire_at: datetime | None = None,
|
|
69
67
|
referenced_blobs: Iterable[Digest] = [],
|
|
70
68
|
referenced_directories: Iterable[Digest] = [],
|
|
69
|
+
instance_name: str,
|
|
71
70
|
) -> PushBlobResponse:
|
|
72
71
|
def _push_blob() -> PushBlobResponse:
|
|
73
72
|
qualifiers_pb = [Qualifier(name=name, value=value) for name, value in qualifiers.items()]
|
|
@@ -77,7 +76,7 @@ class AssetClient:
|
|
|
77
76
|
expire_at_pb.FromDatetime(expire_at)
|
|
78
77
|
|
|
79
78
|
request = PushBlobRequest(
|
|
80
|
-
instance_name=
|
|
79
|
+
instance_name=instance_name,
|
|
81
80
|
uris=uris,
|
|
82
81
|
qualifiers=qualifiers_pb,
|
|
83
82
|
expire_at=expire_at_pb,
|
|
@@ -98,6 +97,7 @@ class AssetClient:
|
|
|
98
97
|
expire_at: datetime | None = None,
|
|
99
98
|
referenced_blobs: Iterable[Digest] = [],
|
|
100
99
|
referenced_directories: Iterable[Digest] = [],
|
|
100
|
+
instance_name: str,
|
|
101
101
|
) -> PushDirectoryResponse:
|
|
102
102
|
def _push_directory() -> PushDirectoryResponse:
|
|
103
103
|
qualifiers_pb = [Qualifier(name=name, value=value) for name, value in qualifiers.items()]
|
|
@@ -107,7 +107,7 @@ class AssetClient:
|
|
|
107
107
|
expire_at_pb.FromDatetime(expire_at)
|
|
108
108
|
|
|
109
109
|
request = PushDirectoryRequest(
|
|
110
|
-
instance_name=
|
|
110
|
+
instance_name=instance_name,
|
|
111
111
|
uris=uris,
|
|
112
112
|
qualifiers=qualifiers_pb,
|
|
113
113
|
expire_at=expire_at_pb,
|
|
@@ -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
|
|
@@ -218,7 +218,6 @@ class Scheduler:
|
|
|
218
218
|
metering_throttle_action: MeteringThrottleAction | None = None,
|
|
219
219
|
bot_session_keepalive_timeout: int = 600,
|
|
220
220
|
logstream_channel: Channel | None = None,
|
|
221
|
-
logstream_instance: str | None = None,
|
|
222
221
|
asset_client: AssetClient | None = None,
|
|
223
222
|
queued_action_retention_hours: float | None = None,
|
|
224
223
|
completed_action_retention_hours: float | None = None,
|
|
@@ -268,7 +267,6 @@ class Scheduler:
|
|
|
268
267
|
self.metering_throttle_action = metering_throttle_action or MeteringThrottleAction.DEPRIORITIZE
|
|
269
268
|
self.bot_session_keepalive_timeout = bot_session_keepalive_timeout
|
|
270
269
|
self.logstream_channel = logstream_channel
|
|
271
|
-
self.logstream_instance = logstream_instance
|
|
272
270
|
self.asset_client = asset_client
|
|
273
271
|
self.queued_action_retention_hours = queued_action_retention_hours
|
|
274
272
|
self.completed_action_retention_hours = completed_action_retention_hours
|
|
@@ -414,7 +412,9 @@ class Scheduler:
|
|
|
414
412
|
LOGGER.exception("Checking ActionCache for action failed.", tags=dict(digest=action_digest))
|
|
415
413
|
|
|
416
414
|
# Extend retention for action
|
|
417
|
-
self._update_action_retention(
|
|
415
|
+
self._update_action_retention(
|
|
416
|
+
action, action_digest, self.queued_action_retention_hours, instance_name=current_instance()
|
|
417
|
+
)
|
|
418
418
|
|
|
419
419
|
return self.create_operation_for_new_job(
|
|
420
420
|
action=action,
|
|
@@ -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
|
|
|
@@ -1999,11 +1975,11 @@ class Scheduler:
|
|
|
1999
1975
|
return None
|
|
2000
1976
|
|
|
2001
1977
|
def _create_logstream_for_job(self, job: JobEntry, log_tags: Tags) -> None:
|
|
2002
|
-
if self.logstream_channel
|
|
1978
|
+
if self.logstream_channel:
|
|
2003
1979
|
try:
|
|
2004
1980
|
action_digest = string_to_digest(job.action_digest)
|
|
2005
1981
|
parent_base = f"{action_digest.hash}_{action_digest.size_bytes}_{int(time())}"
|
|
2006
|
-
with logstream_client(self.logstream_channel,
|
|
1982
|
+
with logstream_client(self.logstream_channel, job.instance_name) as ls_client:
|
|
2007
1983
|
stdout_stream = ls_client.create(f"{parent_base}_stdout")
|
|
2008
1984
|
stderr_stream = ls_client.create(f"{parent_base}_stderr")
|
|
2009
1985
|
job.stdout_stream_name = stdout_stream.name
|
|
@@ -2527,9 +2503,12 @@ class Scheduler:
|
|
|
2527
2503
|
Action.FromString(job.action),
|
|
2528
2504
|
string_to_digest(job.action_digest),
|
|
2529
2505
|
retention_hours=self.completed_action_retention_hours,
|
|
2506
|
+
instance_name=job.instance_name,
|
|
2530
2507
|
)
|
|
2531
2508
|
if action_result.ByteSize() > 0:
|
|
2532
|
-
self._update_action_result_retention(
|
|
2509
|
+
self._update_action_result_retention(
|
|
2510
|
+
action_result, retention_hours=self.action_result_retention_hours, instance_name=job.instance_name
|
|
2511
|
+
)
|
|
2533
2512
|
|
|
2534
2513
|
worker_duration = None
|
|
2535
2514
|
if job.worker_start_timestamp is not None and job.worker_completed_timestamp is not None:
|
|
@@ -2773,7 +2752,9 @@ class Scheduler:
|
|
|
2773
2752
|
except Exception as exc:
|
|
2774
2753
|
LOGGER.exception("Cannot publish resource usage.", tags=dict(job_name=job_name), exc_info=exc)
|
|
2775
2754
|
|
|
2776
|
-
def _update_action_retention(
|
|
2755
|
+
def _update_action_retention(
|
|
2756
|
+
self, action: Action, action_digest: Digest, retention_hours: float | None, instance_name: str
|
|
2757
|
+
) -> None:
|
|
2777
2758
|
if not self.asset_client or not retention_hours:
|
|
2778
2759
|
return
|
|
2779
2760
|
uri = DIGEST_URI_TEMPLATE.format(digest_hash=action_digest.hash)
|
|
@@ -2790,6 +2771,7 @@ class Scheduler:
|
|
|
2790
2771
|
expire_at=expire_at,
|
|
2791
2772
|
referenced_blobs=referenced_blobs,
|
|
2792
2773
|
referenced_directories=referenced_directories,
|
|
2774
|
+
instance_name=instance_name,
|
|
2793
2775
|
)
|
|
2794
2776
|
LOGGER.debug(
|
|
2795
2777
|
"Extended the retention of action.", tags=dict(digest=action_digest, retention_hours=retention_hours)
|
|
@@ -2798,7 +2780,9 @@ class Scheduler:
|
|
|
2798
2780
|
LOGGER.exception("Failed to push action as an asset.", tags=dict(digest=action_digest))
|
|
2799
2781
|
# Not a fatal path, don't reraise here
|
|
2800
2782
|
|
|
2801
|
-
def _update_action_result_retention(
|
|
2783
|
+
def _update_action_result_retention(
|
|
2784
|
+
self, action_result: ActionResult, retention_hours: float | None, instance_name: str
|
|
2785
|
+
) -> None:
|
|
2802
2786
|
if not self.asset_client or not retention_hours:
|
|
2803
2787
|
return
|
|
2804
2788
|
digest = None
|
|
@@ -2837,6 +2821,7 @@ class Scheduler:
|
|
|
2837
2821
|
expire_at=expire_at,
|
|
2838
2822
|
referenced_blobs=referenced_blobs,
|
|
2839
2823
|
referenced_directories=referenced_directories,
|
|
2824
|
+
instance_name=instance_name,
|
|
2840
2825
|
)
|
|
2841
2826
|
LOGGER.debug(
|
|
2842
2827
|
"Extended the retention of action result.", tags=dict(digest=digest, retention_hours=retention_hours)
|
|
@@ -2853,18 +2838,9 @@ class Scheduler:
|
|
|
2853
2838
|
if self.bot_locality_hint_limit == 0:
|
|
2854
2839
|
return
|
|
2855
2840
|
|
|
2856
|
-
# Insert new hint with
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
next_seq = None
|
|
2860
|
-
else:
|
|
2861
|
-
# For SQLite, manually find the max seq number
|
|
2862
|
-
max_seq = session.execute(
|
|
2863
|
-
select(func.coalesce(func.max(BotLocalityHintEntry.sequence_number), 0)).where(
|
|
2864
|
-
BotLocalityHintEntry.bot_name == bot_name
|
|
2865
|
-
)
|
|
2866
|
-
).scalar_one()
|
|
2867
|
-
next_seq = max_seq + 1
|
|
2841
|
+
# Insert new hint with seq handling
|
|
2842
|
+
# For PostgreSQL, use the sequence to get the next seq number
|
|
2843
|
+
next_seq = None
|
|
2868
2844
|
|
|
2869
2845
|
new_hint = BotLocalityHintEntry(
|
|
2870
2846
|
bot_name=bot_name,
|
|
@@ -2969,9 +2945,6 @@ class Scheduler:
|
|
|
2969
2945
|
# `greatest(0,_)` is needed if this feature is released when there are already running jobs
|
|
2970
2946
|
# TODO: remove the safe-guard after the next minor version bump
|
|
2971
2947
|
new_usage: Any = func.greatest(0, InstanceQuota.current_usage + delta)
|
|
2972
|
-
if self._sql.dialect == "sqlite":
|
|
2973
|
-
# SQLite does not support `greatest`, so we use a simpler update for it.
|
|
2974
|
-
new_usage = InstanceQuota.current_usage + delta
|
|
2975
2948
|
|
|
2976
2949
|
update_usage_query = (
|
|
2977
2950
|
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(
|