Changes to Subscription Handler
[ric-app/hw.git] / src / xapp-mgmt / subs_mgmt.hpp
index 4cc328a..c500827 100644 (file)
 #include <mutex>
 #include <condition_variable>
 #include <unordered_map>
+#include <algorithm>
+#include <ctime>
+#include <unistd.h>
 #include <chrono>
 #include <tuple>
-#include <string>
+#include <rmr/RIC_message_types.h>
 
-#include "../xapp-asn/e2ap/subscription_delete_request.hpp"
-#include "../xapp-asn/e2ap/subscription_delete_response.hpp"
-#include "../xapp-asn/e2ap/subscription_request.hpp"
-#include "../xapp-asn/e2ap/subscription_response.hpp"
+#include "subscription_delete_request.hpp"
+#include "subscription_delete_response.hpp"
+#include "subscription_request.hpp"
+#include "subscription_response.hpp"
 
 #define SUBSCR_SUCCESS 1
 #define SUBSCR_ERR_TX -1
@@ -87,12 +90,10 @@ typedef enum {
     request_pending = 1,
     request_success,
     request_failed,
-    delete_request_pending,
-    delete_request_success,
-    delete_request_failed,
     request_duplicate
 }Subscription_Status_Types;
 
+
 using transaction_identifier = std::string;
 using transaction_status = Subscription_Status_Types;
 
@@ -100,7 +101,7 @@ class SubscriptionHandler {
                            
 public:
 
-  SubscriptionHandler(unsigned int timeout_seconds = 10);
+  SubscriptionHandler(unsigned int timeout_seconds = 30);
   
   template <typename AppTransmitter>
   int manage_subscription_request(transaction_identifier, AppTransmitter &&);
@@ -110,13 +111,15 @@ public:
 
   void manage_subscription_response(int message_type, transaction_identifier id);
 
-  int const get_request_status(transaction_identifier);
+  int  get_request_status(transaction_identifier);
   bool set_request_status(transaction_identifier, transaction_status);
   bool is_request_entry(transaction_identifier);
   void set_timeout(unsigned int);
   void clear(void);
   void set_ignore_subs_resp(bool b){_ignore_subs_resp = b;};
 
+  void print_subscription_status(){ for(auto it:status_table){std::cout << it.first << "::" << it.second << std::endl;}};
+
 private:
   
   bool add_request_entry(transaction_identifier, transaction_status);
@@ -138,6 +141,7 @@ private:
 
 template <typename AppTransmitter>
 bool SubscriptionHandler::add_transmitter_entry(transaction_identifier id, AppTransmitter &&trans){
+         mdclog_write(MDCLOG_INFO,"Entry added for Transaction ID: %s",id.c_str());
 
   // add entry in hash table if it does not exist
   auto search = trans_table.find(id);
@@ -187,70 +191,14 @@ int SubscriptionHandler::manage_subscription_request(transaction_identifier rmr_
 
   // record time stamp ..
   auto start = std::chrono::system_clock::now();
-  res = SUBSCR_ERR_UNKNOWN;
-
-
-  while(1){
-         // release lock and wait to be woken up
-         _cv.get()->wait_for(_local_lock, _time_out);
-
-         // we have woken and acquired data_lock
-         // check status and return appropriate object
-         int status = get_request_status(rmr_trans_id);
-
-         if (status == request_success){
-                 mdclog_write(MDCLOG_INFO, "Successfully subscribed for request for trans_id %s", rmr_trans_id.c_str());
-                 res = SUBSCR_SUCCESS;
-                 break;
-         }
-
-         if (status == request_pending){
-                 // woken up spuriously or timed out
-                 auto end = std::chrono::system_clock::now();
-                 std::chrono::duration<double> f = end - start;
-
-                 if ( f > _time_out){
-
-                         mdclog_write(MDCLOG_ERR, "%s, %d:: Subscription request with transaction id %s timed out waiting for response ", __FILE__, __LINE__, rmr_trans_id.c_str());
-
-                         res = SUBSCR_ERR_TIMEOUT;
-                         //sunny side scenario. assuming subscription response is received.
-                         //res = SUBSCR_SUCCESS;
-                         break;
-                 }
-                 else{
-                                mdclog_write(MDCLOG_INFO, "Subscription request with transaction id %s Waiting for response....", rmr_trans_id.c_str());
-                                continue;
-                 }
-
-         }
-
-         if(status == request_failed){
-                 mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Subscription Request with transaction id %s  got failure response .. \n", __FILE__, __LINE__, rmr_trans_id);
-                 res = SUBSCR_ERR_FAIL;
-                 break;
-         }
-
-         if (status == request_duplicate){
-                 mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Subscription Request with transaction id %s is duplicate : subscription already present in table .. \n", __FILE__, __LINE__, rmr_trans_id);
-                 res = SUBSCR_ERR_DUPLICATE;
-                 break;
-
-         }
+  std::chrono::milliseconds t_out(_time_out);
 
-         // if we are here, some spurious
-         // status obtained or request failed . we return appropriate error code
-         mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Spurious time out caused by invalid state of request %s, and state = %d. Deleting request entry and failing .. \n", __FILE__, __LINE__, rmr_trans_id, status);
-         res = SUBSCR_ERR_UNKNOWN;
-         break;
-  };
+  //the wait functionality has been removed.
 
-  delete_request_entry(rmr_trans_id);
 
-  // release data lock
   _local_lock.unlock();
- // std::cout <<"Returning  res = " << res << " for request = " << rmr_trans_id  << std::endl;
-  return res;
 // std::cout <<"Returning  res = " << res << " for request = " << rmr_trans_id  << std::endl;
+   return res;
 };
 
 #endif