You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by du...@apache.org on 2019/02/22 16:05:12 UTC

[trafficserver] branch master updated: set thread affinity using type info

This is an automated email from the ASF dual-hosted git repository.

duke8253 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 4266403  set thread affinity using type info
4266403 is described below

commit 426640346798589dcd7d5b87c9f64e748208ceaf
Author: Fei Deng <du...@gmail.com>
AuthorDate: Thu Feb 21 15:18:47 2019 -0600

    set thread affinity using type info
---
 iocore/eventsystem/P_UnixEventProcessor.h          |  3 +++
 src/traffic_server/InkAPI.cc                       | 14 ++----------
 .../cont_schedule/gold/thread_affinity.gold        |  4 ++--
 tests/tools/plugins/cont_schedule.cc               | 26 +++++++++++++---------
 4 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/iocore/eventsystem/P_UnixEventProcessor.h b/iocore/eventsystem/P_UnixEventProcessor.h
index 90f08b9..003d425 100644
--- a/iocore/eventsystem/P_UnixEventProcessor.h
+++ b/iocore/eventsystem/P_UnixEventProcessor.h
@@ -71,6 +71,9 @@ EventProcessor::schedule(Event *e, EventType etype, bool fast_signal)
     e->ethread = ethread;
   } else {
     e->ethread = assign_thread(etype);
+    if (ethread == nullptr) {
+      e->continuation->setThreadAffinity(e->ethread);
+    }
   }
 
   if (e->continuation->mutex) {
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 5b63750..e7d1080 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -4409,8 +4409,7 @@ TSContSchedule(TSCont contp, TSHRTime timeout)
 
   EThread *eth = i->getThreadAffinity();
   if (eth == nullptr) {
-    eth = this_event_thread();
-    i->setThreadAffinity(eth);
+    return nullptr;
   }
 
   TSAction action;
@@ -4438,10 +4437,6 @@ TSContScheduleOnPool(TSCont contp, TSHRTime timeout, TSThreadPool tp)
     ink_assert(!"not reached");
   }
 
-  if (i->getThreadAffinity() == nullptr) {
-    i->setThreadAffinity(this_event_thread());
-  }
-
   EventType etype;
 
   switch (tp) {
@@ -4527,8 +4522,7 @@ TSContScheduleEvery(TSCont contp, TSHRTime every /* millisecs */)
 
   EThread *eth = i->getThreadAffinity();
   if (eth == nullptr) {
-    eth = this_event_thread();
-    i->setThreadAffinity(eth);
+    return nullptr;
   }
 
   TSAction action = reinterpret_cast<TSAction>(eth->schedule_every(i, HRTIME_MSECONDS(every)));
@@ -4551,10 +4545,6 @@ TSContScheduleEveryOnPool(TSCont contp, TSHRTime every, TSThreadPool tp)
     ink_assert(!"not reached");
   }
 
-  if (i->getThreadAffinity() == nullptr) {
-    i->setThreadAffinity(this_event_thread());
-  }
-
   EventType etype;
 
   switch (tp) {
diff --git a/tests/gold_tests/cont_schedule/gold/thread_affinity.gold b/tests/gold_tests/cont_schedule/gold/thread_affinity.gold
index b81b4f5..09a79cf 100644
--- a/tests/gold_tests/cont_schedule/gold/thread_affinity.gold
+++ b/tests/gold_tests/cont_schedule/gold/thread_affinity.gold
@@ -1,5 +1,5 @@
 ``
-``pass [affinity thread is null]
-``pass [affinity thread is set]
+``pass [affinity thread is not null]
 ``pass [affinity thread is cleared]
+``pass [affinity thread is set]
 ``
diff --git a/tests/tools/plugins/cont_schedule.cc b/tests/tools/plugins/cont_schedule.cc
index accf3db..abc8066 100644
--- a/tests/tools/plugins/cont_schedule.cc
+++ b/tests/tools/plugins/cont_schedule.cc
@@ -175,22 +175,22 @@ TSContThreadAffinity_handler(TSCont contp, TSEvent event, void *edata)
 
   test_thread = TSEventThreadSelf();
 
-  if (TSContThreadAffinityGet(contp) == nullptr) {
-    TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is null]");
-    TSContThreadAffinitySet(contp, TSEventThreadSelf());
-    if (TSContThreadAffinityGet(contp) == test_thread) {
-      TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is set]");
-      TSContThreadAffinityClear(contp);
-      if (TSContThreadAffinityGet(contp) == nullptr) {
-        TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is cleared]");
+  if (TSContThreadAffinityGet(contp) != nullptr) {
+    TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is not null]");
+    TSContThreadAffinityClear(contp);
+    if (TSContThreadAffinityGet(contp) == nullptr) {
+      TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is cleared]");
+      TSContThreadAffinitySet(contp, TSEventThreadSelf());
+      if (TSContThreadAffinityGet(contp) == test_thread) {
+        TSDebug(DEBUG_TAG_CHK, "pass [affinity thread is set]");
       } else {
-        TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is not cleared]");
+        TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is not set]");
       }
     } else {
-      TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is not set]");
+      TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is not cleared]");
     }
   } else {
-    TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is not null]");
+    TSDebug(DEBUG_TAG_CHK, "fail [affinity thread is null]");
   }
 
   return 0;
@@ -207,6 +207,7 @@ TSContSchedule_test()
   } else {
     TSDebug(DEBUG_TAG_SCHD, "[%s] scheduling continuation", plugin_name);
     TSContScheduleOnPool(contp, 0, TS_THREAD_POOL_NET);
+    TSContThreadAffinityClear(contp);
     TSContScheduleOnPool(contp, 200, TS_THREAD_POOL_NET);
   }
 }
@@ -223,8 +224,10 @@ TSContScheduleOnPool_test()
   } else {
     TSDebug(DEBUG_TAG_SCHD, "[%s] scheduling continuation", plugin_name);
     TSContScheduleOnPool(contp_1, 0, TS_THREAD_POOL_NET);
+    TSContThreadAffinityClear(contp_1);
     TSContScheduleOnPool(contp_1, 100, TS_THREAD_POOL_NET);
     TSContScheduleOnPool(contp_2, 200, TS_THREAD_POOL_TASK);
+    TSContThreadAffinityClear(contp_2);
     TSContScheduleOnPool(contp_2, 300, TS_THREAD_POOL_TASK);
   }
 }
@@ -240,6 +243,7 @@ TSContScheduleOnThread_test()
   } else {
     TSDebug(DEBUG_TAG_SCHD, "[%s] scheduling continuation", plugin_name);
     TSContScheduleOnPool(contp, 0, TS_THREAD_POOL_NET);
+    TSContThreadAffinityClear(contp);
     TSContScheduleOnPool(contp, 200, TS_THREAD_POOL_NET);
   }
 }