Hiredis: الإبلاغ عن خطأ : مع طلب libuv غير المتزامن ، مشكلتان وحلول

تم إنشاؤها على ٦ نوفمبر ٢٠١٩  ·  13تعليقات  ·  مصدر: redis/hiredis

1- المشكلة الأولى:

تضمن

في هذا الملف :
// هذا صحيح ، لأن c-fd هو بالفعل مقبس fd.
--if (uv_poll_init (حلقة ، & p-> مقبض ، c-> fd)! = 0) {
++ if (uv_poll_init_socket (loop، & p-> handle، c-> fd)! = 0) {
إرجاع REDIS_ERR ؛
}
2.المشكلة الثانية
redisAsyncConnect -> ... -> _ redisContextConnectTcp:
في هذه الوظيفة ، (التقرير الأصلي "خطأ: setsockopt (TCP_NODELAY): خطأ في الإدخال / الإخراج")
إذا (حجب && redisSetBlocking (ج ، 1)! = REDIS_OK)
غوتو الخطأ
++ # ifndef _MSC_VER
++ النوم (0) ؛
++ # آخر
++ _sleep (0) ؛
++ # endif
إذا (redisSetTcpNoDelay (c)! = REDIS_OK)
غوتو الخطأ

يرجى تأكيده وإصلاحه.

ال 13 كومينتر

مرحبًا @ xingyun86 ، هل يمكنك نشر هذا على أنه git تصحيح يمكنني تطبيقه؟

مرحبًا @ xingyun86 ، هل يمكنك نشر هذا على أنه git تصحيح يمكنني تطبيقه؟

patch-20191107.zip

مرحبًا mnunberg ،mbitsnbites

ليس لدي جهاز يعمل بنظام Windows ولكن عند إلقاء نظرة على مستندات libuv ، يبدو أن هذا التغيير على المحولات / libuv.h قد يكون صحيحًا.

diff --git adapters/libuv.h adapters/libuv.h
index 39ef7cf..049096e 100644
--- adapters/libuv.h
+++ adapters/libuv.h
@@ -84,7 +84,6 @@ static void redisLibuvCleanup(void *privdata) {
   uv_close((uv_handle_t*)&p->handle, on_close);
 }

-
 static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {
   redisContext *c = &(ac->c);

@@ -106,7 +105,7 @@ static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {

   memset(p, 0, sizeof(*p));

-  if (uv_poll_init(loop, &p->handle, c->fd) != 0) {
+  if (uv_poll_init_socket(loop, &p->handle, c->fd) != 0) {
     return REDIS_ERR;
   }

القسم ذو الصلة:

int uv_poll_init_socket (uv_loop_t * loop ، uv_poll_t * handle ، uv_os_sock_t socket) ¶
قم بتهيئة المقبض باستخدام واصف مقبس. في نظام يونكس هذا مطابق لـ uv_poll_init (). على النوافذ يأخذ مقبض SOCKET.

و @ xingyun86 هل يمكن أن تشرح لماذا

diff --git net.c net.c
index e5f40b0..342d292 100644
--- net.c
+++ net.c
@@ -478,6 +478,13 @@ addrretry:
         }
         if (blocking && redisSetBlocking(c,1) != REDIS_OK)
             goto error;
+
+#ifndef _MSC_VER
+               sleep(0);
+#else
+               _sleep(0);
+#endif // !_MSC_VER
+

مرحبًا mnunberg ،mbitsnbites

ليس لدي جهاز يعمل بنظام Windows ولكن عند إلقاء نظرة على مستندات libuv ، يبدو أن هذا التغيير على المحولات / libuv.h قد يكون صحيحًا.

diff --git adapters/libuv.h adapters/libuv.h
index 39ef7cf..049096e 100644
--- adapters/libuv.h
+++ adapters/libuv.h
@@ -84,7 +84,6 @@ static void redisLibuvCleanup(void *privdata) {
   uv_close((uv_handle_t*)&p->handle, on_close);
 }

-
 static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {
   redisContext *c = &(ac->c);

@@ -106,7 +105,7 @@ static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {

   memset(p, 0, sizeof(*p));

-  if (uv_poll_init(loop, &p->handle, c->fd) != 0) {
+  if (uv_poll_init_socket(loop, &p->handle, c->fd) != 0) {
     return REDIS_ERR;
   }

القسم ذو الصلة:

int uv_poll_init_socket (uv_loop_t * loop ، uv_poll_t * handle ، uv_os_sock_t socket) ¶
قم بتهيئة المقبض باستخدام واصف مقبس. في نظام يونكس هذا مطابق لـ uv_poll_init (). على النوافذ يأخذ مقبض SOCKET.

و @ xingyun86 هل يمكن أن تشرح لماذا

diff --git net.c net.c
index e5f40b0..342d292 100644
--- net.c
+++ net.c
@@ -478,6 +478,13 @@ addrretry:
         }
         if (blocking && redisSetBlocking(c,1) != REDIS_OK)
             goto error;
+
+#ifndef _MSC_VER
+               sleep(0);
+#else
+               _sleep(0);
+#endif // !_MSC_VER
+

图片

图片

نعم ، أعتقد أنك محق بشأن وظيفة libuv init من مستنداتهم ، ليس لدي آلة Windows للتحقق منها. :ابتسامة:

////////////////////////////////////////////////////////////////////////////////////////////
diff --git net.c net.c
index e5f40b0..342d292 100644
--- net.c
+++ net.c
@@ -478,6 +478,13 @@ addrretry:
         }
         if (blocking && redisSetBlocking(c,1) != REDIS_OK)
             goto error;
+
+#ifndef _MSC_VER
+               sleep(0);
+#else
+               _sleep(0);
+#endif // !_MSC_VER
+
////////////////////////////////////////////////////////////////////////////////////////////

هذا التعديل على لينكس لا يحتاج. التعديل الأخير هو:

////////////////////////////////////////////////////////////////////////////////////////////
diff --git net.c net.c
index e5f40b0..342d292 100644
--- net.c
+++ net.c
@@ -478,6 +478,13 @@ addrretry:
         }
         if (blocking && redisSetBlocking(c,1) != REDIS_OK)
             goto error;
+
+#ifdef _MSC_VER
+               _sleep(0);
+#endif // !_MSC_VER
+
////////////////////////////////////////////////////////////////////////////////////////////

لقد اختبرت كلاً من Windows و Linux.

على الأقل قم بعمل PR من هذا قبل الدمج ، للحصول على اختبار Travis أولاً.

بالطبع. لقد قمت فقط بوضع علامة عليك لأنك ملتزم بالعديد من الالتزامات المستندة إلى Windows.

@ xingyun86 هل تمانع في إنشاء

بالطبع. لقد قمت فقط بوضع علامة عليك لأنك ملتزم بالعديد من الالتزامات المستندة إلى Windows.

@ xingyun86 هل تمانع في إنشاء

ماذا استطيع ان افعل؟ كيف افعلها؟

ما عليك سوى تقسيم الريبو ثم تنفيذ التغييرات التي تريدها وإرسال طلب سحب.

يسعدني القيام بذلك ولكن بعد ذلك لن تحصل على أي ائتمان (في سجل git). 😃

ما عليك سوى تقسيم الريبو ثم تنفيذ التغييرات التي تريدها وإرسال طلب سحب.

يسعدني القيام بذلك ولكن بعد ذلك لن تحصل على أي ائتمان (في سجل git). 😃

حسنًا ، لقد فعلتها. https://github.com/redis/hiredis/pull/736

إغلاق لصالح # 736

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات