Skip to content

Commit 832b228

Browse files
TDemecoffarallsnowmead
authoredFeb 27, 2025
feat: ✨ MSP stop storing buckets for insolvent user task (Moonsong-Labs#366)
* refactor: ⚡ update move bucket requests for clarity and storage efficiency * chore: 🏷️ run typegen * fix: 🐛 remove `previous_msp_id` from move bucket request metadata This change is made since a bucket status (such as its MSP) could change between the request was made and the new MSP responds, so it's not reliable * feat: 🚧 initial impl of stop storing bucket for insolvent user * chore: 🎨 run cargo fmt * fix: 🚨 update file system benchmark * fix: 🩹 update `get_provider_id` call * chore: 🏷️ run typegen * test: ✅ add tests for `msp_stop_storing_bucket_for_insolvent_user` * test: ✅ fix testing * chore: 🏷️ run typegen * fix: 🐛 add solvency check when issuing storage requests Added a check to make sure the payment stream between the MSP and the user exists when the user issues a new storage request. This is so we don't allow users that just stopped being insolvent to issue storage requests for buckets that the MSP hasn't deleted yet * chore: 🏷️ run typegen * feat: ✨ add task for MSP to stop storing buckets of insolvent user * fix: 🐛 avoid the task processing multiple times the same bucket * fix: 🐛 get only buckets stored by the current MSP (instead of all) * perf: ⚡ remove unneeded fetch from indexer db * feat: 📈 benchmark file system * perf: ⚡ drop file write lock asap * test: ✅ add integration test for MSP stop storing bucket for insolvent user * chore: 🏷️ Update api-augment after merge * fix: 🚨 Fix compiler errors in test after merge * refactor: ♻️ Rename `MoveBucketRequestedForNewMsp` -> `MoveBucketRequestedForMsp` * fix: 🩹 fix after merge from main * chore: 🏷️ Update `api-augment` after merge * fix: 🩹 Fix typo * fix: 🩹 minor fixes after merge from main * docs: 💡 Minor improvement of doc comment of task * impl query_buckets_for_insolvent_user runtime api in favor of querying index db for buckets stored by insolvent users * remove `get_by_msp_id_and_owner` indexer db function. remove `ProcessStopStoringForInsolventUserRequest` event processing from `MspStopStoringInsolventUserTask` * refactor: 🔥 remove now unneeded handling of `MspStopStoringBucketInsolventUser` event * refactor: ⚡ make stop storing buckets for insolvent user task parallelizable * test: ✅ fix integration test after changes * test: 🔥 remove `only` from MSP stop storing bucket for insolvent user integration test * Update node/src/tasks/msp_stop_storing_insolvent_user.rs Co-authored-by: Facundo Farall <[email protected]> * chore: 🏷️ run typegen --------- Co-authored-by: Facundo Farall <[email protected]> Co-authored-by: Michael Assaf <[email protected]> Co-authored-by: Michael Assaf <[email protected]>
1 parent bfc03d2 commit 832b228

File tree

25 files changed

+1050
-22
lines changed

25 files changed

+1050
-22
lines changed
 

‎api-augment/dist/types/interfaces/augment-api-runtime.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ import type {
6666
QueryAvailableStorageCapacityError,
6767
QueryBspConfirmChunksToProveForFileError,
6868
QueryBucketsForMspError,
69+
QueryBucketsOfUserStoredByMspError,
6970
QueryEarliestChangeCapacityBlockError,
7071
QueryFileEarliestVolunteerBlockError,
7172
QueryMspConfirmChunksToProveForFileError,
@@ -689,6 +690,16 @@ declare module "@polkadot/api-base/types/calls" {
689690
mspId: MainStorageProviderId | string | Uint8Array
690691
) => Observable<Result<Vec<BucketId>, QueryBucketsForMspError>>
691692
>;
693+
/**
694+
* Query the buckets stored by an MSP that belong to a specific user.
695+
**/
696+
queryBucketsOfUserStoredByMsp: AugmentedCall<
697+
ApiType,
698+
(
699+
mspId: ProviderId | string | Uint8Array,
700+
user: AccountId | string | Uint8Array
701+
) => Observable<Result<Vec<H256>, QueryBucketsOfUserStoredByMspError>>
702+
>;
692703
/**
693704
* Query the earliest block number that a BSP can change its capacity.
694705
**/

‎api-augment/dist/types/interfaces/augment-types.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,7 @@ import type {
13441344
QueryAvailableStorageCapacityError,
13451345
QueryBspConfirmChunksToProveForFileError,
13461346
QueryBucketsForMspError,
1347+
QueryBucketsOfUserStoredByMspError,
13471348
QueryConfirmChunksToProveForFileError,
13481349
QueryEarliestChangeCapacityBlockError,
13491350
QueryFileEarliestVolunteerBlockError,
@@ -2219,6 +2220,7 @@ declare module "@polkadot/types/types/registry" {
22192220
QueryAvailableStorageCapacityError: QueryAvailableStorageCapacityError;
22202221
QueryBspConfirmChunksToProveForFileError: QueryBspConfirmChunksToProveForFileError;
22212222
QueryBucketsForMspError: QueryBucketsForMspError;
2223+
QueryBucketsOfUserStoredByMspError: QueryBucketsOfUserStoredByMspError;
22222224
QueryConfirmChunksToProveForFileError: QueryConfirmChunksToProveForFileError;
22232225
QueryEarliestChangeCapacityBlockError: QueryEarliestChangeCapacityBlockError;
22242226
QueryFileEarliestVolunteerBlockError: QueryFileEarliestVolunteerBlockError;

‎api-augment/dist/types/interfaces/storagehubclient/types.d.ts

+6
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ export interface QueryBucketsForMspError extends Enum {
174174
readonly isInternalError: boolean;
175175
readonly type: "ProviderNotRegistered" | "InternalError";
176176
}
177+
/** @name QueryBucketsOfUserStoredByMspError */
178+
export interface QueryBucketsOfUserStoredByMspError extends Enum {
179+
readonly isNotAnMsp: boolean;
180+
readonly isInternalError: boolean;
181+
readonly type: "NotAnMsp" | "InternalError";
182+
}
177183
/** @name QueryConfirmChunksToProveForFileError */
178184
export interface QueryConfirmChunksToProveForFileError extends Enum {
179185
readonly isChallengedChunkToChunkIdError: boolean;

‎api-augment/src/interfaces/augment-api-runtime.ts

+11
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ import type {
7272
QueryAvailableStorageCapacityError,
7373
QueryBspConfirmChunksToProveForFileError,
7474
QueryBucketsForMspError,
75+
QueryBucketsOfUserStoredByMspError,
7576
QueryEarliestChangeCapacityBlockError,
7677
QueryFileEarliestVolunteerBlockError,
7778
QueryMspConfirmChunksToProveForFileError,
@@ -639,6 +640,16 @@ declare module "@polkadot/api-base/types/calls" {
639640
mspId: MainStorageProviderId | string | Uint8Array
640641
) => Observable<Result<Vec<BucketId>, QueryBucketsForMspError>>
641642
>;
643+
/**
644+
* Query the buckets stored by an MSP that belong to a specific user.
645+
**/
646+
queryBucketsOfUserStoredByMsp: AugmentedCall<
647+
ApiType,
648+
(
649+
mspId: ProviderId | string | Uint8Array,
650+
user: AccountId | string | Uint8Array
651+
) => Observable<Result<Vec<H256>, QueryBucketsOfUserStoredByMspError>>
652+
>;
642653
/**
643654
* Query the earliest block number that a BSP can change its capacity.
644655
**/

‎api-augment/src/interfaces/augment-types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,7 @@ import type {
13501350
QueryAvailableStorageCapacityError,
13511351
QueryBspConfirmChunksToProveForFileError,
13521352
QueryBucketsForMspError,
1353+
QueryBucketsOfUserStoredByMspError,
13531354
QueryConfirmChunksToProveForFileError,
13541355
QueryEarliestChangeCapacityBlockError,
13551356
QueryFileEarliestVolunteerBlockError,
@@ -2226,6 +2227,7 @@ declare module "@polkadot/types/types/registry" {
22262227
QueryAvailableStorageCapacityError: QueryAvailableStorageCapacityError;
22272228
QueryBspConfirmChunksToProveForFileError: QueryBspConfirmChunksToProveForFileError;
22282229
QueryBucketsForMspError: QueryBucketsForMspError;
2230+
QueryBucketsOfUserStoredByMspError: QueryBucketsOfUserStoredByMspError;
22292231
QueryConfirmChunksToProveForFileError: QueryConfirmChunksToProveForFileError;
22302232
QueryEarliestChangeCapacityBlockError: QueryEarliestChangeCapacityBlockError;
22312233
QueryFileEarliestVolunteerBlockError: QueryFileEarliestVolunteerBlockError;

‎api-augment/src/interfaces/storagehubclient/types.ts

+7
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ export interface QueryBucketsForMspError extends Enum {
205205
readonly type: "ProviderNotRegistered" | "InternalError";
206206
}
207207

208+
/** @name QueryBucketsOfUserStoredByMspError */
209+
export interface QueryBucketsOfUserStoredByMspError extends Enum {
210+
readonly isNotAnMsp: boolean;
211+
readonly isInternalError: boolean;
212+
readonly type: "NotAnMsp" | "InternalError";
213+
}
214+
208215
/** @name QueryConfirmChunksToProveForFileError */
209216
export interface QueryConfirmChunksToProveForFileError extends Enum {
210217
readonly isChallengedChunkToChunkIdError: boolean;

‎client/blockchain-service/src/commands.rs

+32-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ use pallet_proofs_dealer_runtime_api::{
1616
GetChallengePeriodError, GetCheckpointChallengesError, GetProofSubmissionRecordError,
1717
};
1818
use pallet_storage_providers_runtime_api::{
19-
GetBspInfoError, QueryAvailableStorageCapacityError, QueryEarliestChangeCapacityBlockError,
20-
QueryMspIdOfBucketIdError, QueryProviderMultiaddressesError, QueryStorageProviderCapacityError,
19+
GetBspInfoError, QueryAvailableStorageCapacityError, QueryBucketsOfUserStoredByMspError,
20+
QueryEarliestChangeCapacityBlockError, QueryMspIdOfBucketIdError,
21+
QueryProviderMultiaddressesError, QueryStorageProviderCapacityError,
2122
};
2223
use shc_actors_framework::actor::ActorHandle;
2324
use shc_common::types::{
@@ -201,6 +202,12 @@ pub enum BlockchainServiceCommand {
201202
request: FileDeletionRequest,
202203
callback: tokio::sync::oneshot::Sender<Result<()>>,
203204
},
205+
QueryBucketsOfUserStoredByMsp {
206+
msp_id: ProviderId,
207+
user: AccountId,
208+
callback:
209+
tokio::sync::oneshot::Sender<Result<Vec<BucketId>, QueryBucketsOfUserStoredByMspError>>,
210+
},
204211
}
205212

206213
/// Interface for interacting with the BlockchainService actor.
@@ -395,6 +402,13 @@ pub trait BlockchainServiceInterface {
395402
&self,
396403
forest_root_write_tx: tokio::sync::oneshot::Sender<()>,
397404
) -> Result<()>;
405+
406+
/// Helper function to query all the buckets stored by an MSP that belong to a specific user.
407+
async fn query_buckets_of_user_stored_by_msp(
408+
&self,
409+
msp_id: ProviderId,
410+
user: AccountId,
411+
) -> Result<Vec<BucketId>, QueryBucketsOfUserStoredByMspError>;
398412
}
399413

400414
/// Implement the BlockchainServiceInterface for the ActorHandle<BlockchainService>.
@@ -903,4 +917,20 @@ where
903917
self.send(message).await;
904918
rx.await.expect("Failed to receive response from BlockchainService. Probably means BlockchainService has crashed.")
905919
}
920+
921+
/// Helper function to query all the buckets stored by an MSP that belong to a specific user.
922+
async fn query_buckets_of_user_stored_by_msp(
923+
&self,
924+
msp_id: ProviderId,
925+
user: AccountId,
926+
) -> Result<Vec<BucketId>, QueryBucketsOfUserStoredByMspError> {
927+
let (callback, rx) = tokio::sync::oneshot::channel();
928+
let message = BlockchainServiceCommand::QueryBucketsOfUserStoredByMsp {
929+
msp_id,
930+
user,
931+
callback,
932+
};
933+
self.send(message).await;
934+
rx.await.expect("Failed to receive response from BlockchainService. Probably means BlockchainService has crashed.")
935+
}
906936
}

‎client/blockchain-service/src/events.rs

+23
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,18 @@ pub struct SpStopStoringInsolventUser {
270270
}
271271
impl EventBusMessage for SpStopStoringInsolventUser {}
272272

273+
/// A MSP stopped storing a bucket for an insolvent user event was finalised.
274+
///
275+
/// This event is emitted when the relay chain block to which a block in which a MSP stopped storing a bucket
276+
/// for an insolvent user event is anchored has been finalised.
277+
#[derive(Debug, Clone)]
278+
pub struct FinalisedMspStopStoringBucketInsolventUser {
279+
pub msp_id: ProofsDealerProviderId,
280+
pub bucket_id: BucketId,
281+
}
282+
283+
impl EventBusMessage for FinalisedMspStopStoringBucketInsolventUser {}
284+
273285
/// A user has requested to move one of its bucket to a new MSP.
274286
///
275287
/// This event is emitted so the BSP can allow the new MSP to download the files from the bucket.
@@ -462,6 +474,8 @@ pub struct BlockchainServiceEventBusProvider {
462474
last_chargeable_info_updated_event_bus: EventBus<LastChargeableInfoUpdated>,
463475
user_without_funds_event_bus: EventBus<UserWithoutFunds>,
464476
sp_stop_storing_insolvent_user_event_bus: EventBus<SpStopStoringInsolventUser>,
477+
finalised_msp_stop_storing_bucket_insolvent_user_event_bus:
478+
EventBus<FinalisedMspStopStoringBucketInsolventUser>,
465479
finalised_msp_stopped_storing_bucket_event_bus: EventBus<FinalisedMspStoppedStoringBucket>,
466480
move_bucket_requested_event_bus: EventBus<MoveBucketRequested>,
467481
move_bucket_rejected_event_bus: EventBus<MoveBucketRejected>,
@@ -496,6 +510,7 @@ impl BlockchainServiceEventBusProvider {
496510
last_chargeable_info_updated_event_bus: EventBus::new(),
497511
user_without_funds_event_bus: EventBus::new(),
498512
sp_stop_storing_insolvent_user_event_bus: EventBus::new(),
513+
finalised_msp_stop_storing_bucket_insolvent_user_event_bus: EventBus::new(),
499514
finalised_msp_stopped_storing_bucket_event_bus: EventBus::new(),
500515
move_bucket_requested_event_bus: EventBus::new(),
501516
move_bucket_rejected_event_bus: EventBus::new(),
@@ -599,6 +614,14 @@ impl ProvidesEventBus<SpStopStoringInsolventUser> for BlockchainServiceEventBusP
599614
}
600615
}
601616

617+
impl ProvidesEventBus<FinalisedMspStopStoringBucketInsolventUser>
618+
for BlockchainServiceEventBusProvider
619+
{
620+
fn event_bus(&self) -> &EventBus<FinalisedMspStopStoringBucketInsolventUser> {
621+
&self.finalised_msp_stop_storing_bucket_insolvent_user_event_bus
622+
}
623+
}
624+
602625
impl ProvidesEventBus<FinalisedMspStoppedStoringBucket> for BlockchainServiceEventBusProvider {
603626
fn event_bus(&self) -> &EventBus<FinalisedMspStoppedStoringBucket> {
604627
&self.finalised_msp_stopped_storing_bucket_event_bus

‎client/blockchain-service/src/handler.rs

+47-9
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ use pallet_proofs_dealer_runtime_api::{
3232
ProofsDealerApi,
3333
};
3434
use pallet_storage_providers_runtime_api::{
35-
GetBspInfoError, QueryAvailableStorageCapacityError, QueryEarliestChangeCapacityBlockError,
36-
QueryMspIdOfBucketIdError, QueryProviderMultiaddressesError, QueryStorageProviderCapacityError,
37-
StorageProvidersApi,
35+
GetBspInfoError, QueryAvailableStorageCapacityError, QueryBucketsOfUserStoredByMspError,
36+
QueryEarliestChangeCapacityBlockError, QueryMspIdOfBucketIdError,
37+
QueryProviderMultiaddressesError, QueryStorageProviderCapacityError, StorageProvidersApi,
3838
};
3939
use shc_actors_framework::actor::{Actor, ActorEventLoop};
4040
use shc_common::{
@@ -52,11 +52,11 @@ use crate::{
5252
events::{
5353
AcceptedBspVolunteer, BlockchainServiceEventBusProvider, BspConfirmStoppedStoring,
5454
FileDeletionRequest, FinalisedBspConfirmStoppedStoring, FinalisedBucketMovedAway,
55-
FinalisedMspStoppedStoringBucket, FinalisedProofSubmittedForPendingFileDeletionRequest,
56-
FinalisedTrieRemoveMutationsApplied, LastChargeableInfoUpdated, MoveBucketAccepted,
57-
MoveBucketExpired, MoveBucketRejected, MoveBucketRequested, MoveBucketRequestedForMsp,
58-
NewStorageRequest, SlashableProvider, SpStopStoringInsolventUser, StartMovedBucketDownload,
59-
UserWithoutFunds,
55+
FinalisedMspStopStoringBucketInsolventUser, FinalisedMspStoppedStoringBucket,
56+
FinalisedProofSubmittedForPendingFileDeletionRequest, FinalisedTrieRemoveMutationsApplied,
57+
LastChargeableInfoUpdated, MoveBucketAccepted, MoveBucketExpired, MoveBucketRejected,
58+
MoveBucketRequested, MoveBucketRequestedForMsp, NewStorageRequest, SlashableProvider,
59+
SpStopStoringInsolventUser, StartMovedBucketDownload, UserWithoutFunds,
6060
},
6161
state::{
6262
BlockchainServiceStateStore, LastProcessedBlockNumberCf,
@@ -986,6 +986,29 @@ where
986986
}
987987
}
988988
}
989+
BlockchainServiceCommand::QueryBucketsOfUserStoredByMsp {
990+
msp_id,
991+
user,
992+
callback,
993+
} => {
994+
let current_block_hash = self.client.info().best_hash;
995+
996+
let buckets = self
997+
.client
998+
.runtime_api()
999+
.query_buckets_of_user_stored_by_msp(current_block_hash, &msp_id, &user)
1000+
.unwrap_or_else(|e| {
1001+
error!(target: LOG_TARGET, "{}", e);
1002+
Err(QueryBucketsOfUserStoredByMspError::InternalError)
1003+
});
1004+
1005+
match callback.send(buckets) {
1006+
Ok(_) => {}
1007+
Err(e) => {
1008+
error!(target: LOG_TARGET, "Failed to send back buckets: {:?}", e);
1009+
}
1010+
}
1011+
}
9891012
BlockchainServiceCommand::ReleaseForestRootWriteLock {
9901013
forest_root_write_tx,
9911014
callback,
@@ -1007,7 +1030,7 @@ where
10071030
match callback.send(forest_root_write_result) {
10081031
Ok(_) => {}
10091032
Err(e) => {
1010-
error!(target: LOG_TARGET, "Failed to send forest write lock release result: {:?}", e);
1033+
error!(target: LOG_TARGET, "Failed to send back forest root write result: {:?}", e);
10111034
}
10121035
}
10131036
}
@@ -1627,6 +1650,21 @@ where
16271650
}
16281651
}
16291652
}
1653+
RuntimeEvent::FileSystem(pallet_file_system::Event::MspStopStoringBucketInsolventUser {
1654+
msp_id,
1655+
owner: _,
1656+
bucket_id
1657+
}) => {
1658+
// This event is relevant in case the Provider managed is the MSP of the event.
1659+
if let Some(StorageProviderId::MainStorageProvider(managed_msp_id)) = &self.provider_id {
1660+
if msp_id == *managed_msp_id {
1661+
self.emit(FinalisedMspStopStoringBucketInsolventUser {
1662+
msp_id,
1663+
bucket_id
1664+
})
1665+
}
1666+
}
1667+
}
16301668
RuntimeEvent::FileSystem(
16311669
pallet_file_system::Event::BspConfirmStoppedStoring {
16321670
bsp_id,

‎node/src/services/handler.rs

+33-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ use shc_actors_framework::{
88
use shc_blockchain_service::{
99
events::{
1010
AcceptedBspVolunteer, FileDeletionRequest, FinalisedBspConfirmStoppedStoring,
11-
FinalisedBucketMovedAway, FinalisedMspStoppedStoringBucket,
12-
FinalisedProofSubmittedForPendingFileDeletionRequest, LastChargeableInfoUpdated,
13-
MoveBucketAccepted, MoveBucketExpired, MoveBucketRejected, MoveBucketRequested,
14-
MoveBucketRequestedForMsp, MultipleNewChallengeSeeds, NewStorageRequest, NotifyPeriod,
15-
ProcessConfirmStoringRequest, ProcessFileDeletionRequest, ProcessMspRespondStoringRequest,
16-
ProcessStopStoringForInsolventUserRequest, ProcessSubmitProofRequest, SlashableProvider,
17-
SpStopStoringInsolventUser, StartMovedBucketDownload, UserWithoutFunds,
11+
FinalisedBucketMovedAway, FinalisedMspStopStoringBucketInsolventUser,
12+
FinalisedMspStoppedStoringBucket, FinalisedProofSubmittedForPendingFileDeletionRequest,
13+
LastChargeableInfoUpdated, MoveBucketAccepted, MoveBucketExpired, MoveBucketRejected,
14+
MoveBucketRequested, MoveBucketRequestedForMsp, MultipleNewChallengeSeeds,
15+
NewStorageRequest, NotifyPeriod, ProcessConfirmStoringRequest, ProcessFileDeletionRequest,
16+
ProcessMspRespondStoringRequest, ProcessStopStoringForInsolventUserRequest,
17+
ProcessSubmitProofRequest, SlashableProvider, SpStopStoringInsolventUser,
18+
StartMovedBucketDownload, UserWithoutFunds,
1819
},
1920
BlockchainService,
2021
};
@@ -38,6 +39,7 @@ use crate::{
3839
bsp_submit_proof::BspSubmitProofTask, bsp_upload_file::BspUploadFileTask,
3940
msp_charge_fees::MspChargeFeesTask, msp_delete_bucket::MspDeleteBucketTask,
4041
msp_delete_file::MspDeleteFileTask, msp_move_bucket::MspRespondMoveBucketTask,
42+
msp_stop_storing_insolvent_user::MspStopStoringInsolventUserTask,
4143
msp_upload_file::MspUploadFileTask, sp_slash_provider::SlashProviderTask,
4244
user_sends_file::UserSendsFileTask,
4345
},
@@ -290,6 +292,30 @@ where
290292

291293
let msp_charge_fees_task = MspChargeFeesTask::new(self.clone());
292294

295+
// MspStopStoringInsolventUserTask handles events for deleting buckets owned by users that have become insolvent.
296+
let msp_stop_storing_insolvent_user = MspStopStoringInsolventUserTask::new(self.clone());
297+
298+
// Subscribing to UserInsolvent event from the BlockchainService to delete all stored buckets owned by a
299+
// user that has been declared as without funds.
300+
let user_without_funds_event_bus_listener: EventBusListener<UserWithoutFunds, _> =
301+
msp_stop_storing_insolvent_user.clone().subscribe_to(
302+
&self.task_spawner,
303+
&self.blockchain,
304+
true,
305+
);
306+
user_without_funds_event_bus_listener.start();
307+
308+
// Subscribing to FinalisedMspStopStoringBucketInsolventUser event from the BlockchainService.
309+
let finalised_msp_stop_storing_bucket_insolvent_user_event_bus_listener: EventBusListener<
310+
FinalisedMspStopStoringBucketInsolventUser,
311+
_,
312+
> = msp_stop_storing_insolvent_user.clone().subscribe_to(
313+
&self.task_spawner,
314+
&self.blockchain,
315+
true,
316+
);
317+
finalised_msp_stop_storing_bucket_insolvent_user_event_bus_listener.start();
318+
293319
// Subscribing to NotifyPeriod event from the BlockchainService.
294320
let notify_period_event_bus_listener: EventBusListener<NotifyPeriod, _> =
295321
msp_charge_fees_task

‎node/src/tasks/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub mod msp_charge_fees;
1010
pub mod msp_delete_bucket;
1111
pub mod msp_delete_file;
1212
pub mod msp_move_bucket;
13+
pub mod msp_stop_storing_insolvent_user;
1314
pub mod msp_upload_file;
1415
pub mod sp_slash_provider;
1516
pub mod user_sends_file;

0 commit comments

Comments
 (0)
Please sign in to comment.