buildgrid 0.3.0__py3-none-any.whl → 0.3.2__py3-none-any.whl

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.
@@ -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, logstream_instance = get_logstream_connection_info(logstream)
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, instance_name=instance_name, retries=retries)
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, 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, logstream_instance_name
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/grpc-connection-options" }
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, instance-name]
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
- grpc-connection-options:
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, instance-name]
793
+ required: [url]
796
794
 
797
795
  grpc-credentials:
798
796
  type: object
@@ -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=self._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=self._instance_name,
110
+ instance_name=instance_name,
111
111
  uris=uris,
112
112
  qualifiers=qualifiers_pb,
113
113
  expire_at=expire_at_pb,
@@ -311,7 +311,7 @@ def _curl_multi_run(
311
311
  m.remove_handle(c)
312
312
  curl_handles.clear()
313
313
 
314
- if retry_objects and attempt < S3_MAX_RETRIES:
314
+ if retry_objects:
315
315
  # Wait between attempts with truncated exponential backoff with jitter
316
316
  exp_backoff = 2 ** (attempt - 1)
317
317
  exp_backoff_with_jitter = random.random() * exp_backoff
@@ -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(action, action_digest, self.queued_action_retention_hours)
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,
@@ -1812,6 +1812,7 @@ class Scheduler:
1812
1812
  instance_name=instance_name,
1813
1813
  expiry_time=datetime.utcnow() + timedelta(seconds=self.bot_session_keepalive_timeout),
1814
1814
  capacity=bot_capacity,
1815
+ max_capacity=bot_capacity,
1815
1816
  cohort=bot_cohort,
1816
1817
  )
1817
1818
  )
@@ -1975,11 +1976,11 @@ class Scheduler:
1975
1976
  return None
1976
1977
 
1977
1978
  def _create_logstream_for_job(self, job: JobEntry, log_tags: Tags) -> None:
1978
- if self.logstream_channel and self.logstream_instance is not None:
1979
+ if self.logstream_channel:
1979
1980
  try:
1980
1981
  action_digest = string_to_digest(job.action_digest)
1981
1982
  parent_base = f"{action_digest.hash}_{action_digest.size_bytes}_{int(time())}"
1982
- with logstream_client(self.logstream_channel, self.logstream_instance) as ls_client:
1983
+ with logstream_client(self.logstream_channel, job.instance_name) as ls_client:
1983
1984
  stdout_stream = ls_client.create(f"{parent_base}_stdout")
1984
1985
  stderr_stream = ls_client.create(f"{parent_base}_stderr")
1985
1986
  job.stdout_stream_name = stdout_stream.name
@@ -2503,9 +2504,12 @@ class Scheduler:
2503
2504
  Action.FromString(job.action),
2504
2505
  string_to_digest(job.action_digest),
2505
2506
  retention_hours=self.completed_action_retention_hours,
2507
+ instance_name=job.instance_name,
2506
2508
  )
2507
2509
  if action_result.ByteSize() > 0:
2508
- self._update_action_result_retention(action_result, retention_hours=self.action_result_retention_hours)
2510
+ self._update_action_result_retention(
2511
+ action_result, retention_hours=self.action_result_retention_hours, instance_name=job.instance_name
2512
+ )
2509
2513
 
2510
2514
  worker_duration = None
2511
2515
  if job.worker_start_timestamp is not None and job.worker_completed_timestamp is not None:
@@ -2749,7 +2753,9 @@ class Scheduler:
2749
2753
  except Exception as exc:
2750
2754
  LOGGER.exception("Cannot publish resource usage.", tags=dict(job_name=job_name), exc_info=exc)
2751
2755
 
2752
- def _update_action_retention(self, action: Action, action_digest: Digest, retention_hours: float | None) -> None:
2756
+ def _update_action_retention(
2757
+ self, action: Action, action_digest: Digest, retention_hours: float | None, instance_name: str
2758
+ ) -> None:
2753
2759
  if not self.asset_client or not retention_hours:
2754
2760
  return
2755
2761
  uri = DIGEST_URI_TEMPLATE.format(digest_hash=action_digest.hash)
@@ -2766,6 +2772,7 @@ class Scheduler:
2766
2772
  expire_at=expire_at,
2767
2773
  referenced_blobs=referenced_blobs,
2768
2774
  referenced_directories=referenced_directories,
2775
+ instance_name=instance_name,
2769
2776
  )
2770
2777
  LOGGER.debug(
2771
2778
  "Extended the retention of action.", tags=dict(digest=action_digest, retention_hours=retention_hours)
@@ -2774,7 +2781,9 @@ class Scheduler:
2774
2781
  LOGGER.exception("Failed to push action as an asset.", tags=dict(digest=action_digest))
2775
2782
  # Not a fatal path, don't reraise here
2776
2783
 
2777
- def _update_action_result_retention(self, action_result: ActionResult, retention_hours: float | None) -> None:
2784
+ def _update_action_result_retention(
2785
+ self, action_result: ActionResult, retention_hours: float | None, instance_name: str
2786
+ ) -> None:
2778
2787
  if not self.asset_client or not retention_hours:
2779
2788
  return
2780
2789
  digest = None
@@ -2813,6 +2822,7 @@ class Scheduler:
2813
2822
  expire_at=expire_at,
2814
2823
  referenced_blobs=referenced_blobs,
2815
2824
  referenced_directories=referenced_directories,
2825
+ instance_name=instance_name,
2816
2826
  )
2817
2827
  LOGGER.debug(
2818
2828
  "Extended the retention of action result.", tags=dict(digest=digest, retention_hours=retention_hours)
@@ -84,7 +84,7 @@ REQUEST_METADATA_TOOL_NAME = "buildgrid"
84
84
  REQUEST_METADATA_TOOL_VERSION = __version__
85
85
 
86
86
  S3_USERAGENT_NAME = f"{REQUEST_METADATA_TOOL_NAME}/{REQUEST_METADATA_TOOL_VERSION}"
87
- S3_MAX_RETRIES = 4
87
+ S3_MAX_RETRIES = 5
88
88
  S3_MAX_UPLOAD_SIZE = 8 * 1024 * 1024
89
89
  S3_TIMEOUT_CONNECT = 120
90
90
  S3_TIMEOUT_READ = 120
@@ -0,0 +1,47 @@
1
+ # Copyright (C) 2025 Bloomberg LP
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # <http://www.apache.org/licenses/LICENSE-2.0>
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Add immutable jobs.max_capacity column
16
+
17
+ Revision ID: 8f7f43e4a833
18
+ Revises: 85096c931383
19
+ Create Date: 2025-12-09 14:03:01.907296
20
+
21
+ """
22
+
23
+ import sqlalchemy as sa
24
+ from alembic import op
25
+
26
+
27
+ # revision identifiers, used by Alembic.
28
+ revision = "8f7f43e4a833"
29
+ down_revision = "85096c931383"
30
+ branch_labels = None
31
+ depends_on = None
32
+
33
+
34
+ def upgrade() -> None:
35
+ # ### commands auto generated by Alembic - please adjust! ###
36
+ with op.batch_alter_table("bots", schema=None) as batch_op:
37
+ batch_op.add_column(sa.Column("max_capacity", sa.Integer(), server_default=sa.text("1"), nullable=False))
38
+
39
+ # ### end Alembic commands ###
40
+
41
+
42
+ def downgrade() -> None:
43
+ # ### commands auto generated by Alembic - please adjust! ###
44
+ with op.batch_alter_table("bots", schema=None) as batch_op:
45
+ batch_op.drop_column("max_capacity")
46
+
47
+ # ### end Alembic commands ###
@@ -277,6 +277,7 @@ class BotEntry(Base):
277
277
  name: Mapped[str] = mapped_column(primary_key=True)
278
278
  bot_id: Mapped[str] = mapped_column(index=True)
279
279
  instance_name: Mapped[str] = mapped_column(index=True)
280
+ max_capacity: Mapped[int] = mapped_column(server_default=text("1"))
280
281
 
281
282
  # Scheduling state
282
283
  bot_status: Mapped[int]
@@ -13,4 +13,4 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- __version__ = "0.3.0"
16
+ __version__ = "0.3.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildgrid
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: A remote execution service
5
5
  License: Apache License, Version 2.0
6
6
  Project-URL: Homepage, https://buildgrid.build
@@ -205,10 +205,10 @@ buildgrid/server/monitoring.py,sha256=Ic1qKWfvlmcQOXLN3fVq6Ya1Co1lEU_2aHeXXof2Bf
205
205
  buildgrid/server/sentry.py,sha256=U5i3x6_zuQlUKoscjDkZCz35TJ-zaNvwlFyjowEEoLk,1471
206
206
  buildgrid/server/server.py,sha256=l-UxfEB6IJEEAzXHbXtIklwjiM18tTMPxI3uB7IvzGQ,29438
207
207
  buildgrid/server/servicer.py,sha256=oqU9MaSxxHTDmSxobFTo9YmJctaUCklE2Dj-vfYWKkc,6542
208
- buildgrid/server/settings.py,sha256=Iy4eS9Putr5GroIVqYNeTcRY7gbvq29wgQoMDQgPJtA,5604
208
+ buildgrid/server/settings.py,sha256=I1UK-g4_GwkX0nGC3hdGS3Cc0Rh1HTYDv2aHU2sq_eU,5604
209
209
  buildgrid/server/threading.py,sha256=4QKQYev2KoO2Q-S_OyaoR9qpWyDTVzGMWVe9o2a1yIU,4743
210
210
  buildgrid/server/types.py,sha256=xG3bx64pbWMuEwXLuI0o8c2unt2rU2C4zsmUfmMT12c,1323
211
- buildgrid/server/version.py,sha256=YJSMuhVWkHaaftw-EYGH7w-GAiZQGnQrRBy8LqrQgWw,603
211
+ buildgrid/server/version.py,sha256=9hszMRmtGUkZbKKAfeEActwnrXaZkxNudCeHQb8v_8o,603
212
212
  buildgrid/server/actioncache/__init__.py,sha256=g9lb8Sn7NY5KOjkMr9GQoJovCVDEg_Fxz_EhdDbhP1I,579
213
213
  buildgrid/server/actioncache/instance.py,sha256=UCR7ZGkv4fJOXjeIILMAdTSFWcGgBSYlBg8fMaPJpaI,3139
214
214
  buildgrid/server/actioncache/service.py,sha256=WcikJAzFYOYX-tgiOfGGcOnPoubrCd4yP-EhKCHEW0c,2021
@@ -239,9 +239,9 @@ buildgrid/server/app/commands/rpc_utils.py,sha256=3C02_0Ba4Weksb2kX5mANSubmfWAFR
239
239
  buildgrid/server/app/settings/__init__.py,sha256=g9lb8Sn7NY5KOjkMr9GQoJovCVDEg_Fxz_EhdDbhP1I,579
240
240
  buildgrid/server/app/settings/config.py,sha256=3cmmnkvZtM44zXkc6meNpmA6rJoDBbrridHoj-Quapo,9649
241
241
  buildgrid/server/app/settings/mapper.py,sha256=sKD3LWyVXZWaFF16_JN1lbJkUE8vp5p06OJGOencxmU,752
242
- buildgrid/server/app/settings/parser.py,sha256=8hIlclUweGO9kcWdOEy9f_TeEshofjJhH56dwnKXFak,96742
242
+ buildgrid/server/app/settings/parser.py,sha256=i8B1Zy6sR2o3n4z8H_e_QlszMTKOiLFPxonVE25MkOo,96439
243
243
  buildgrid/server/app/settings/reference.yml,sha256=DTXNJ6TkccgBLcvzj5264XAv6HFlvsc5Lx6iowixHPE,10703
244
- buildgrid/server/app/settings/schema.yml,sha256=1Jgvo-ruEVXQhDK_g323-OjSV7-QGZ_D_86ch-7pZCs,32765
244
+ buildgrid/server/app/settings/schema.yml,sha256=DqWE6UaNYiJl0Ae5DSmDtU8CijLXeXAeSK9Qal0jwTA,32664
245
245
  buildgrid/server/auth/__init__.py,sha256=avyRxG9BSFd76mCHnGYInDDTqyqDn0UlhOuFzAkPQSs,579
246
246
  buildgrid/server/auth/config.py,sha256=sWcaSL9Oz7mLVnFBuFT7OaOGlxFd6hxEb-z30n3uTNU,2291
247
247
  buildgrid/server/auth/enums.py,sha256=O902XU3_C4rqWz23qVipEyQMcXXr1h8XCiPWmrs1_lc,1905
@@ -286,7 +286,7 @@ buildgrid/server/cleanup/janitor/types.py,sha256=R3F9OcF1OsRncmHPz6k7G2iSdOxqOw9
286
286
  buildgrid/server/cleanup/janitor/utils.py,sha256=eYxuJZFJ-7Hhlrj3B3qJvL9X3Se0GEAlkNlXf88swYU,1410
287
287
  buildgrid/server/client/__init__.py,sha256=g9lb8Sn7NY5KOjkMr9GQoJovCVDEg_Fxz_EhdDbhP1I,579
288
288
  buildgrid/server/client/actioncache.py,sha256=2Xd7HzDRzMWwyiWN1nno1glkGEXrQtjmIFzsa0SHfyQ,5021
289
- buildgrid/server/client/asset.py,sha256=3iEaf1ggGH6xYnU9xdprXyPpvqyVId5IJGWDX54X9tA,4454
289
+ buildgrid/server/client/asset.py,sha256=eZdMuqwrJgPy9U7Q2Qe98P1Vzrry0jZUgxXqH18ru_A,4426
290
290
  buildgrid/server/client/auth_token_loader.py,sha256=B95uDkAsHg5p98-jZwBWZAkXEfLVWjgWEhdAC1k8fDU,1604
291
291
  buildgrid/server/client/authentication.py,sha256=6J-5PKR5AhBm_CTXWegAsHjUrmwny1wYVCEgfbMs9TM,5140
292
292
  buildgrid/server/client/capabilities.py,sha256=2fKyjy-BZK5szC_wQRmGc7bfMx2-G_zl5VZ2uHt6RA4,1687
@@ -326,16 +326,16 @@ buildgrid/server/quota/service.py,sha256=YFV3zedluSCehFF32sBa_AWPWYS8w_bxHHIbGNv
326
326
  buildgrid/server/redis/__init__.py,sha256=avyRxG9BSFd76mCHnGYInDDTqyqDn0UlhOuFzAkPQSs,579
327
327
  buildgrid/server/redis/provider.py,sha256=oeN69kC0HGLwb-9e2pSOSUleSauUjKkR9NgBbDOfpW4,6270
328
328
  buildgrid/server/s3/__init__.py,sha256=zbeeRP9BEeDzR-Mx2Ip6SUr49J8eeXsuREgljJTrHkk,579
329
- buildgrid/server/s3/s3utils.py,sha256=_LzHob5ni5mvqeCPk4n_TozrQ3PUIaNx6hJfaS7PUfk,21697
329
+ buildgrid/server/s3/s3utils.py,sha256=AcOeUY-KkfwH1ydbulNsxYp3TMmnZj479d9Ceu8TWok,21668
330
330
  buildgrid/server/scheduler/__init__.py,sha256=arCg8LWFATeX1tj-s0keVYP8p3wwrrUlCV980bxcSII,1084
331
331
  buildgrid/server/scheduler/assigner.py,sha256=wHPAhyiQxYABZJXaUc2g5yFzM78Z0U5nvGV3X9h5pCM,10512
332
332
  buildgrid/server/scheduler/cohorts.py,sha256=L_5YZRiVOwPPGStfqnnQXknO5Ja-SC0vq0xjw4XgP-I,1426
333
333
  buildgrid/server/scheduler/events.py,sha256=cM7Z7Htr2pYKhltJxfg1YRo0q524yZaGm8yXvRehivk,1453
334
- buildgrid/server/scheduler/impl.py,sha256=jP0cpdmnVxroJ0mLbuNDN2nfKtpn8V3bim9FQOno25I,135536
334
+ buildgrid/server/scheduler/impl.py,sha256=NsZwiSQcQAdWgqh-Y6G0BPhtwJgbEbBa8UnmllsyFWE,135759
335
335
  buildgrid/server/scheduler/notifier.py,sha256=22ZsKwyf2oQirAjrwROkvgvr4C_TMUNyhOmtro4uM4I,7121
336
336
  buildgrid/server/scheduler/properties.py,sha256=2GydX8KUy9MFv1_JznIkGfWE_wOS0m_XapSv6Gp4pCM,11260
337
337
  buildgrid/server/sql/__init__.py,sha256=zbeeRP9BEeDzR-Mx2Ip6SUr49J8eeXsuREgljJTrHkk,579
338
- buildgrid/server/sql/models.py,sha256=jAuNLLvdlBWf7uZWlPLMSC1dTWHYlqlk9Pn5A04rQcg,14374
338
+ buildgrid/server/sql/models.py,sha256=EN7zle9sxSZ_nrv-w1ewXLmsTl1x3q-opwtJ2VPA4G4,14446
339
339
  buildgrid/server/sql/provider.py,sha256=CXOpjcUY-InwmGnZTpCd4_ziOdROiDY34_SRpqsBwwk,18965
340
340
  buildgrid/server/sql/utils.py,sha256=j76Z_qtGawz6O7vO4-zgCzBV4ylhKszcd_6iY0gV4W4,16470
341
341
  buildgrid/server/sql/alembic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38
@@ -351,6 +351,7 @@ buildgrid/server/sql/alembic/versions/55fcf6c874d3_remove_request_metadata_from_
351
351
  buildgrid/server/sql/alembic/versions/5745d1f0e537_drop_unused_indexes_and_create_.py,sha256=OjQrx8aTNSrwshVDozydcJzJYWmmJLSoGdnSlSMBcGM,2497
352
352
  buildgrid/server/sql/alembic/versions/5b90ed0e9d0b_drop_ix_jobs_worker_name_stage.py,sha256=keiHTEhWpor13V4SCW_LqfgEsMn4E8JL_f16JlUhl1U,1585
353
353
  buildgrid/server/sql/alembic/versions/85096c931383_drop_ix_jobs_stage_property_label_and_.py,sha256=9r4HEYorA5J4kFarDjdfoJZ-g1HGyEdEIZoVIxlSwAg,1926
354
+ buildgrid/server/sql/alembic/versions/8f7f43e4a833_add_immutable_jobs_max_capacity_column.py,sha256=sUrFN1c4yr82PXeUWaxdJb3nSG_BzXgJH94hLVjVeRw,1446
354
355
  buildgrid/server/sql/alembic/versions/8fd7118e215e_add_instanced_job_scheduling_index.py,sha256=U7gmqLlSdl3lsWN2LJYcJHFsIzufvzbHskdmSt5h-Xk,1737
355
356
  buildgrid/server/sql/alembic/versions/90bd87d052a0_add_an_audit_table_for_job_state_changes.py,sha256=NrD_D4yjEMQL1cvRZAymxMtU1eyGMkh4OvCsc5y-cXw,1622
356
357
  buildgrid/server/sql/alembic/versions/910398062924_add_property_labels_table.py,sha256=2gJlJHMX3zx7uV4bVxCyRXC4ZYsQLdu9nMStWmpx9VM,1755
@@ -365,9 +366,9 @@ buildgrid/server/utils/async_lru_cache.py,sha256=iLKeRPoZtZb1wC5AtcyQm8Wt0Bx-KZm
365
366
  buildgrid/server/utils/bots.py,sha256=c8hn7tbCecru-m2wicRmtKU5v5rSZPGlk97Yc6eUHgQ,1729
366
367
  buildgrid/server/utils/cancellation.py,sha256=pNETzKNoXg0AsXOXKCcLWlFl7SVKdkKinlqWl7MesRA,1703
367
368
  buildgrid/server/utils/digests.py,sha256=YNrWeHdbNp7OVTcsInjs30C33z_t9GQ_noMd14bpqPQ,2424
368
- buildgrid-0.3.0.dist-info/licenses/LICENSE,sha256=swa3Vs7GgALaG9p-e05M-WLkhd_U9QknacNkyVZ85xA,11338
369
- buildgrid-0.3.0.dist-info/METADATA,sha256=dZxwUseVWfUjfk3VSlPCxXeMmdLw58lpzN7PdQ0ivyA,7086
370
- buildgrid-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
371
- buildgrid-0.3.0.dist-info/entry_points.txt,sha256=uyFAXiR9d6EDfSA5vWT8xskz6xalt4PdTuRruT6Q8rk,49
372
- buildgrid-0.3.0.dist-info/top_level.txt,sha256=T6TYhI_k6NTm2871tIxGCyBIqzlKxylgF9KDLU0Hi7o,10
373
- buildgrid-0.3.0.dist-info/RECORD,,
369
+ buildgrid-0.3.2.dist-info/licenses/LICENSE,sha256=swa3Vs7GgALaG9p-e05M-WLkhd_U9QknacNkyVZ85xA,11338
370
+ buildgrid-0.3.2.dist-info/METADATA,sha256=ZbSgvpI9ItnWHDwTIWVew6XYP-4OnV42Y9NFBo9slhE,7086
371
+ buildgrid-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
372
+ buildgrid-0.3.2.dist-info/entry_points.txt,sha256=uyFAXiR9d6EDfSA5vWT8xskz6xalt4PdTuRruT6Q8rk,49
373
+ buildgrid-0.3.2.dist-info/top_level.txt,sha256=T6TYhI_k6NTm2871tIxGCyBIqzlKxylgF9KDLU0Hi7o,10
374
+ buildgrid-0.3.2.dist-info/RECORD,,