diff mbox series

[v3] libceph: remove the max extents check for sparse read

Message ID 20231107014458.299637-1-xiubli@redhat.com (mailing list archive)
State New, archived
Headers show
Series [v3] libceph: remove the max extents check for sparse read | expand

Commit Message

Xiubo Li Nov. 7, 2023, 1:44 a.m. UTC
From: Xiubo Li <xiubli@redhat.com>

There is no any limit for the extent array size and it's possible
that when reading with a large size contents the total number of
extents will exceed 4096. Then the messager will fail by reseting
the connection and keeps resending the inflight IOs infinitely.

URL: https://tracker.ceph.com/issues/62081
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---

V3:
- Remove the max extents check and add one debug log.

V2:
- Increase the MAX_EXTENTS instead of removing it.
- Do not return an errno when hit the limit.




 net/ceph/osd_client.c | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

Comments

Ilya Dryomov Nov. 7, 2023, 10:14 a.m. UTC | #1
On Tue, Nov 7, 2023 at 2:47 AM <xiubli@redhat.com> wrote:
>
> From: Xiubo Li <xiubli@redhat.com>
>
> There is no any limit for the extent array size and it's possible
> that when reading with a large size contents the total number of
> extents will exceed 4096. Then the messager will fail by reseting
> the connection and keeps resending the inflight IOs infinitely.
>
> URL: https://tracker.ceph.com/issues/62081
> Signed-off-by: Xiubo Li <xiubli@redhat.com>
> ---
>
> V3:
> - Remove the max extents check and add one debug log.
>
> V2:
> - Increase the MAX_EXTENTS instead of removing it.
> - Do not return an errno when hit the limit.
>
>
>
>
>  net/ceph/osd_client.c | 17 ++++-------------
>  1 file changed, 4 insertions(+), 13 deletions(-)
>
> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
> index c03d48bd3aff..5f10ab76d0f3 100644
> --- a/net/ceph/osd_client.c
> +++ b/net/ceph/osd_client.c
> @@ -5850,8 +5850,6 @@ static inline void convert_extent_map(struct ceph_sparse_read *sr)
>  }
>  #endif
>
> -#define MAX_EXTENTS 4096
> -
>  static int osd_sparse_read(struct ceph_connection *con,
>                            struct ceph_msg_data_cursor *cursor,
>                            char **pbuf)
> @@ -5882,23 +5880,16 @@ static int osd_sparse_read(struct ceph_connection *con,
>
>                 if (count > 0) {
>                         if (!sr->sr_extent || count > sr->sr_ext_len) {
> -                               /*
> -                                * Apply a hard cap to the number of extents.
> -                                * If we have more, assume something is wrong.
> -                                */
> -                               if (count > MAX_EXTENTS) {
> -                                       dout("%s: OSD returned 0x%x extents in a single reply!\n",
> -                                            __func__, count);
> -                                       return -EREMOTEIO;
> -                               }
> -
>                                 /* no extent array provided, or too short */
>                                 kfree(sr->sr_extent);
>                                 sr->sr_extent = kmalloc_array(count,
>                                                               sizeof(*sr->sr_extent),
>                                                               GFP_NOIO);
> -                               if (!sr->sr_extent)
> +                               if (!sr->sr_extent) {
> +                                       pr_err("%s: failed to allocate %u sparse read extents\n",
> +                                              __func__, count);

Hi Xiubo,

No need to include the function name: a) this is an error message as
opposed to a debug message and b) such allocation is done only in one
place anyway.

Otherwise LGTM!

Thanks,

                Ilya
Xiubo Li Nov. 7, 2023, 10:42 a.m. UTC | #2
On 11/7/23 18:14, Ilya Dryomov wrote:
> On Tue, Nov 7, 2023 at 2:47 AM <xiubli@redhat.com> wrote:
>> From: Xiubo Li <xiubli@redhat.com>
>>
>> There is no any limit for the extent array size and it's possible
>> that when reading with a large size contents the total number of
>> extents will exceed 4096. Then the messager will fail by reseting
>> the connection and keeps resending the inflight IOs infinitely.
>>
>> URL: https://tracker.ceph.com/issues/62081
>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>> ---
>>
>> V3:
>> - Remove the max extents check and add one debug log.
>>
>> V2:
>> - Increase the MAX_EXTENTS instead of removing it.
>> - Do not return an errno when hit the limit.
>>
>>
>>
>>
>>   net/ceph/osd_client.c | 17 ++++-------------
>>   1 file changed, 4 insertions(+), 13 deletions(-)
>>
>> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
>> index c03d48bd3aff..5f10ab76d0f3 100644
>> --- a/net/ceph/osd_client.c
>> +++ b/net/ceph/osd_client.c
>> @@ -5850,8 +5850,6 @@ static inline void convert_extent_map(struct ceph_sparse_read *sr)
>>   }
>>   #endif
>>
>> -#define MAX_EXTENTS 4096
>> -
>>   static int osd_sparse_read(struct ceph_connection *con,
>>                             struct ceph_msg_data_cursor *cursor,
>>                             char **pbuf)
>> @@ -5882,23 +5880,16 @@ static int osd_sparse_read(struct ceph_connection *con,
>>
>>                  if (count > 0) {
>>                          if (!sr->sr_extent || count > sr->sr_ext_len) {
>> -                               /*
>> -                                * Apply a hard cap to the number of extents.
>> -                                * If we have more, assume something is wrong.
>> -                                */
>> -                               if (count > MAX_EXTENTS) {
>> -                                       dout("%s: OSD returned 0x%x extents in a single reply!\n",
>> -                                            __func__, count);
>> -                                       return -EREMOTEIO;
>> -                               }
>> -
>>                                  /* no extent array provided, or too short */
>>                                  kfree(sr->sr_extent);
>>                                  sr->sr_extent = kmalloc_array(count,
>>                                                                sizeof(*sr->sr_extent),
>>                                                                GFP_NOIO);
>> -                               if (!sr->sr_extent)
>> +                               if (!sr->sr_extent) {
>> +                                       pr_err("%s: failed to allocate %u sparse read extents\n",
>> +                                              __func__, count);
> Hi Xiubo,
>
> No need to include the function name: a) this is an error message as
> opposed to a debug message and b) such allocation is done only in one
> place anyway.

Okay, will remove it.

Thanks

- Xiubo


> Otherwise LGTM!
>
> Thanks,
>
>                  Ilya
>
diff mbox series

Patch

diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index c03d48bd3aff..5f10ab76d0f3 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -5850,8 +5850,6 @@  static inline void convert_extent_map(struct ceph_sparse_read *sr)
 }
 #endif
 
-#define MAX_EXTENTS 4096
-
 static int osd_sparse_read(struct ceph_connection *con,
 			   struct ceph_msg_data_cursor *cursor,
 			   char **pbuf)
@@ -5882,23 +5880,16 @@  static int osd_sparse_read(struct ceph_connection *con,
 
 		if (count > 0) {
 			if (!sr->sr_extent || count > sr->sr_ext_len) {
-				/*
-				 * Apply a hard cap to the number of extents.
-				 * If we have more, assume something is wrong.
-				 */
-				if (count > MAX_EXTENTS) {
-					dout("%s: OSD returned 0x%x extents in a single reply!\n",
-					     __func__, count);
-					return -EREMOTEIO;
-				}
-
 				/* no extent array provided, or too short */
 				kfree(sr->sr_extent);
 				sr->sr_extent = kmalloc_array(count,
 							      sizeof(*sr->sr_extent),
 							      GFP_NOIO);
-				if (!sr->sr_extent)
+				if (!sr->sr_extent) {
+					pr_err("%s: failed to allocate %u sparse read extents\n",
+					       __func__, count);
 					return -ENOMEM;
+				}
 				sr->sr_ext_len = count;
 			}
 			ret = count * sizeof(*sr->sr_extent);