diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py index 6145a9767ac6cb4f4e76b0a443573ade930a9fd8..2efd0ffcdf24393503a4448b6c6e2b37f6569841 100644 --- a/src/_zkapauthorizer/_storage_server.py +++ b/src/_zkapauthorizer/_storage_server.py @@ -350,9 +350,9 @@ class ZKAPAuthorizerStorageServer(Referenceable): validation, self._original, ) + result = self._original.remote_add_lease(storage_index, *a, **kw) self._metric_spending_successes.observe(len(validation.valid)) - - return self._original.remote_add_lease(storage_index, *a, **kw) + return result def remote_advise_corrupt_share(self, *a, **kw): """ diff --git a/src/_zkapauthorizer/tests/test_storage_server.py b/src/_zkapauthorizer/tests/test_storage_server.py index ee99a46ed808fb7b90c8b26e942bee758f816522..f303459f0cd7b8b36e7039bbcab68ea7f6c311f0 100644 --- a/src/_zkapauthorizer/tests/test_storage_server.py +++ b/src/_zkapauthorizer/tests/test_storage_server.py @@ -747,5 +747,64 @@ class PassValidationTests(TestCase): "Unexpected histogram bucket value", ) + @given( + storage_index=storage_indexes(), + renew_secret=lease_renew_secrets(), + cancel_secret=lease_cancel_secrets(), + sharenums=sharenum_sets(), + allocated_size=sizes(), + ) + def test_add_lease_metrics_on_failure(self, storage_index, renew_secret, cancel_secret, sharenums, allocated_size): + """ + If the ``add_lease`` operation fails then the successful pass spending + metric is not incremented. + """ + # Put some shares up there to target with the add_lease operation. + write_toy_shares( + self.anonymous_storage_server, + storage_index, + renew_secret, + cancel_secret, + sharenums, + allocated_size, + LocalReferenceable(None), + ) + + num_passes = required_passes( + self.storage_server._pass_value, [allocated_size] * len(sharenums) + ) + valid_passes = make_passes( + self.signing_key, + add_lease_message(storage_index), + list(RandomToken.create() for i in range(num_passes)), + ) -# Counter of invalid ZKAP spend attempts + # Tahoe doesn't make it very easy to make an add_lease operation fail + # so monkey-patch something broken in. After 1.17.0 we can set + # `reserved_space` on StorageServer to a very large number and the + # server should refuse to allocate space for a *new* lease (which + # means we need to use a different renew secret for the next step. + self.anonymous_storage_server.remote_add_lease = lambda *a, **kw: 1 / 0 + + try: + self.storage_server.doRemoteCall( + "add_lease", + (), + dict( + passes=valid_passes, + storage_index=storage_index, + renew_secret=renew_secret, + cancel_secret=cancel_secret, + ), + ) + except ZeroDivisionError: + pass + else: + self.fail("expected our ZeroDivisionError to be raised") + + after_count = read_count(self.storage_server) + self.expectThat( + after_count, + Equals(0), + "Expected no successful spending to be recorded in error case", + )