Date: Tuesday, January 24, 2006 @ 11:11:51
  Author: gilles
    Path: /cvsroot/carob/carob

Modified: include/ControllerConnectPolicy.hpp (1.1 -> 1.2)
          src/ControllerConnectPolicy.cpp (1.2 -> 1.3)

Moved suspected_controllers as a static (shared) vector
Removed all ping thread related stuff (we won't use a thread)
Implemented suspectControllerOfFailure()
Added logging in getController()


-------------------------------------+
 include/ControllerConnectPolicy.hpp |   17 +------
 src/ControllerConnectPolicy.cpp     |   75 ++++++++++++++++++++++++++--------
 2 files changed, 63 insertions(+), 29 deletions(-)


Index: carob/include/ControllerConnectPolicy.hpp
diff -u carob/include/ControllerConnectPolicy.hpp:1.1 
carob/include/ControllerConnectPolicy.hpp:1.2
--- carob/include/ControllerConnectPolicy.hpp:1.1       Thu Jan  5 16:11:43 2006
+++ carob/include/ControllerConnectPolicy.hpp   Tue Jan 24 11:11:51 2006
@@ -1,6 +1,6 @@
 /*
  * Sequoia: Database clustering technology.
- * Copyright (C) 2005 Emic Networks
+ * Copyright (C) 2005-2006 Continuent, Inc.
  * Contact: [EMAIL PROTECTED]
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -67,21 +67,14 @@
    * Gets the list of controllers supposed valid
    * @return the list of controllers
    */
-  std::vector<ControllerInfo>   getControllerList() const
+  std::vector<ControllerInfo> getControllerList() const
                                   { return controller_list; }
   /**
-   * Gets the list of suspected controllers
-   * @return the list of suspected controllers
-   */
-  std::vector<ControllerInfo> getSuspectedControllers() const
-                                  { return suspected_controllers; }
-
-  /**
    * Returns true if the specified controller is suspected of failure.
    * @param controllerInfo the controller to check
    * @return true if the controller is in the suspect list
    */
-  bool                        isSuspectedOfFailure(
+  static bool                 isSuspectedOfFailure(
                                   const ControllerInfo& controllerInfo);
   /**
    * Adds the given controller to the list of suspects.
@@ -100,14 +93,12 @@
   std::vector<ControllerInfo> controller_list;
   /** list of suspected controllers */
   // Could have been a hash_set as in java but hash_set class is gnu specific
-  std::vector<ControllerInfo> suspected_controllers;
+  static std::vector<ControllerInfo> suspected_controllers;
   /** class wide mutex */
   CriticalSection             policy_CS;
   /** mutex on supected controllers */
   CriticalSection             suspected_controllers_CS;
 private:
-  /** Interval between two connection attempts */
-  long                        retry_interval_in_ms;
 };
 
 /**
Index: carob/src/ControllerConnectPolicy.cpp
diff -u carob/src/ControllerConnectPolicy.cpp:1.2 
carob/src/ControllerConnectPolicy.cpp:1.3
--- carob/src/ControllerConnectPolicy.cpp:1.2   Thu Jan 12 18:05:05 2006
+++ carob/src/ControllerConnectPolicy.cpp       Tue Jan 24 11:11:51 2006
@@ -27,6 +27,9 @@
 
 using namespace CarobNS;
 
+// Static list of suspected controllers
+std::vector<ControllerInfo> 
AbstractControllerConnectPolicy::suspected_controllers;
+
 AbstractControllerConnectPolicy::AbstractControllerConnectPolicy(
     const std::vector<ControllerInfo>& controllerList, long retryIntervalInMs)
         throw (DriverException, UnexpectedException)
@@ -35,23 +38,12 @@
     throw DriverException(
         L"Invalid empty controller list in connect policy constructor");
   controller_list = controllerList;
-  // TODO: do we really need to reserve this space ?
-  // suspected_controllers.reserve(controller_list.length());
-  retry_interval_in_ms = retryIntervalInMs;
+  suspected_controllers.reserve(controller_list.size());
 }
 
 AbstractControllerConnectPolicy::~AbstractControllerConnectPolicy()
 {
   controller_list.clear();
-  suspected_controllers.clear();
-  /*
-  // Kill controller ping thread
-  if (controllerPingThread != null)
-  synchronized (controllerPingThread)
-  {
-    controllerPingThread.notify();
-  }
-  */
 }
 
 bool AbstractControllerConnectPolicy::isSuspectedOfFailure(
@@ -66,6 +58,56 @@
   return false;
 }
 
+void AbstractControllerConnectPolicy::suspectControllerOfFailure(
+    const ControllerInfo& controllerInfo)
+{
+  wstring 
fctName(L"AbstractControllerConnectPolicy::suspectControllerOfFailure");
+
+  // First check that the controller is not already in the list of suspects
+  if (isSuspectedOfFailure(controllerInfo))
+    return;
+
+  // Check that the controllerInfo is correct and add it to the list
+  for (size_t i = 0; i < controller_list.size(); i++)
+  {
+    ControllerInfo controller = controller_list[i];
+    if (controller == controllerInfo)
+    {
+      LockScope scLs(&suspected_controllers_CS);
+      suspected_controllers.push_back(controllerInfo);
+      if (isDebugEnabled())
+        logDebug(fctName, L"Controller " + (wstring)controllerInfo
+            + L" is now suspected of failure");
+      return;
+    }
+  }
+}
+
+void AbstractControllerConnectPolicy::removeControllerFromSuspectList(
+    const ControllerInfo& controller)
+{
+  wstring 
fctName(L"AbstractControllerConnectPolicy::removeControllerFromSuspectList");
+  LockScope scLs(&suspected_controllers_CS);
+  for (std::vector<ControllerInfo>::iterator iter = 
suspected_controllers.begin();
+      iter != suspected_controllers.end(); iter++)
+  {
+    if (*iter == controller)
+    {
+      suspected_controllers.erase(iter);
+      if (isDebugEnabled())
+      {
+        logDebug(fctName, L"Controller " + (wstring)controller
+            + L" is removed from suspect list");
+      }
+      break;
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// ROUND ROBIN POLICY
+////////////////////////////////////////////////////////////////////////////////
+
 RoundRobinConnectPolicy::RoundRobinConnectPolicy(
     const std::vector<ControllerInfo>& controllerList, long retryIntervalInMs)
         throw (DriverException, UnexpectedException) :
@@ -77,6 +119,8 @@
 ControllerInfo RoundRobinConnectPolicy::getController()
     throw (NoMoreControllerException, UnexpectedException)
 {
+  wstring fctName(L"RoundRobinConnectPolicy::getController");
+
   LockScope ls(&policy_CS);
   {
     LockScope scLs(&suspected_controllers_CS);
@@ -90,10 +134,9 @@
     }
     while (isSuspectedOfFailure(controller_list[index]));
   }
-/*TODO:  if (debugLevel == SequoiaUrl.DEBUG_LEVEL_DEBUG)
-    System.out.println("Selected controller[" + index + "]:"
-        + controllerList[index]);
-*/
+  if (isDebugEnabled())
+    logDebug(fctName, L"Selected controller[" + toWString(index) + L"]:"
+        + (wstring)controller_list[index]);
   return controller_list[index];
 }
 

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to