async def METHOD_NAME(
    self, session_id: str, data_key: str, obj: object, level: StorageLevel
):
    size = calc_data_size(obj)
    await self.request_quota_with_spill(level, size)
    # sleep to trigger `NoDataToSpill`
    await asyncio.sleep(0.5)
    object_info = await self._clients[level].METHOD_NAME(obj)
    data_info = build_data_info(object_info, level, size)
    await self._data_manager_ref.put_data_info(
        session_id, data_key, data_info, object_info
    )
    if object_info.size is not None and data_info.memory_size != object_info.size:
        await self._quota_refs[level].update_quota(
            object_info.size - data_info.memory_size
        )
    await self.notify_spillable_space(level)
    return data_info