This issue has shown that, when we introduce new providers and propagate the configs to users, then remove the config ("asf" was removed and renamed to "default"), user configuration breaks
- #6358

One way of dealing with this is checking at startup time whether the configured providers are available, and if not, log a warning and fall back to the default provider.
state_dir: str
    lock: rwlock.RWLockable
    def __init__(self, state_dir: str = None, lock: rwlock.RWLockable = None):
        
        self.state_dir = state_dir
        
        self.lock = lock
class StateSerializer(abc.ABC):
    """A state serializer encapsulates the logic of persisting and loading service state to/from disk."""
    @abc.abstractmethod
    def restore_state(self, context: PersistenceContext):
        """Restore state from the underlying persistence file"""
        pass
    @abc.abstractmethod
    def update_state(self, context: PersistenceContext, request: Request):
        """Update persistence state based on the incoming request"""
        pass
    @abc.abstractmethod
    def is_write_request(self, request: Request) -> bool:
        """Returns whether the given request is a write request that should trigger serialization"""
        return False
    def get_lock_for_request(self, request: Request) -> Optional[rwlock.Lockable]:
        """Returns a lock (or None) that should be used to guard the given request, for concurrency control"""
        return None
    def get_context(self) -> PersistenceContext:
        """Returns the current persistence context"""
        return None
class StateSerializerComposite(StateSerializer):