Cassandra throw NoHostAvailableException - cassandra
I am using the following code to connect my .net client (CQL based) to 3 node Cassandra cluster. I am getting the data (from RabbitMQ) 30 records/sec and they get stored in cassandra upto 800-900 rows smoothly. But after that i am getting this follwing exception. Can anyone please tell me what are the optimization/changes i can make to avoid this exception. I could't find specific solution to this problem anywhere.
Error: ERROR ErrorLog - error in Cassandra GetCWCRow Function Connection :None of the hosts tried for query are available (tried: X.X.X.201:9042, X.X.X.200:9042, X.X.X.X:9042)
Code :
using Cassandra;
using Consumer;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace RabbitMqCarWaleUserTracking
{
class DataAccessCassandra
{
public bool InsertCookieLogData(string cwc, string page_uri)
{
try
{
Logs.WriteInfoLog("Cassandra InsertCookieLogData a Function called");
Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build();
ISession session = cluster.Connect(ConfigurationManager.AppSettings["cassandraKeySpace"].ToString());
string pageCategory = string.Empty;
try
{
if ((Regex.IsMatch(page_uri, "/newcars/upcomingcars", RegexOptions.IgnoreCase)))
{
pageCategory = "upcomingCars";
}
else
if ((Regex.IsMatch(page_uri, "/newcars/dealers/newCarDealerShowroom", RegexOptions.IgnoreCase)) || (Regex.IsMatch(page_uri, "/newcars/dealers/listnewcardealersbycity", RegexOptions.IgnoreCase)
|| (Regex.IsMatch(page_uri, "/newcars/dealers/dealerdetails", RegexOptions.IgnoreCase))))
{
pageCategory = "newcarsDealers";
}
else
if ((Regex.IsMatch(page_uri, "/offers", RegexOptions.IgnoreCase)) || (Regex.IsMatch(page_uri, "/alloffers", RegexOptions.IgnoreCase)))
{
pageCategory = "offers";
}
else
if ((Regex.IsMatch(page_uri, "/dealer/testdrive", RegexOptions.IgnoreCase)))
{
pageCategory = "dealerTestDrive";
}
if (pageCategory != string.Empty)
{
Row result = session.Execute("select logdate from pageWiseCookieLog where cwc ='" + cwc + "' and page_uri ='" + pageCategory + "' and logdate= '" + DateTime.Today.ToString("yyyy-MM-dd") + "'").FirstOrDefault();
if (result == null)
{
session.Execute("insert into pageWiseCookieLog (cwc, page_uri, logdate) values ('" + cwc + "' , '" + pageCategory + "' , '" + DateTime.Now.ToString("yyyy-MM-dd") + "' )");
session.Execute("insert into pageWiseCookieLogByld (cwc, page_uri, logdate) values ('" + cwc + "' , '" + pageCategory + "' , '" + DateTime.Now.ToString("yyyy-MM-dd") + "' )");
session.Dispose();
cluster.Dispose();
return true;
}
}
else
{
//don't want to store the data for rest of the page category but need to return true
session.Dispose();
cluster.Dispose();
return true;
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra InsertCookieLogData function with cwc :" + cwc + "error is :" + ex.Message);
SendMail.HandleException(ex, subject);
session.Dispose();
cluster.Dispose();
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra InsertCookieLogData function connection :" + ex.Message);
SendMail.HandleException(ex, subject);
}
return false;
}
public string GetCWCRow(string cwc, int index, string mobileId)
{
try
{
Logs.WriteInfoLog("Cassandra GetCWCRow Function called");
Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build();
ISession session = cluster.Connect(ConfigurationManager.AppSettings["cassandraKeySpace"].ToString());
try
{
Row result = session.Execute("select cur_visit_id from usertracking where cwc ='" + cwc + "'").FirstOrDefault();
if (result != null)
{
session.Dispose();
cluster.Dispose();
return result[0].ToString();
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra GetCWCRow function with cwc :" + cwc + "error is :" + ex.Message);
SendMail.HandleException(ex, subject);
session.Dispose();
cluster.Dispose();
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra GetCWCRow Function Connection :" + ex.Message);
SendMail.HandleException(ex, subject);
}
return string.Empty;
}
public bool InsertCWCRecords(string cwv, Cut_Case caseType, int index, string mobileId)
{
try
{
Logs.WriteInfoLog("Cassandra InsertCWCRecords function called for case:" + caseType);
Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build();
ISession session = cluster.Connect(ConfigurationManager.AppSettings["cassandraKeySpace"].ToString());
try
{
bool _isProcessed = false;
string visitCount = "";
string[] leadParameters = cwv.Split('.');
string cwc = leadParameters[0];
string visitId = leadParameters[1];
string visitStartTime = leadParameters[2];
string visitPrevPageTime = leadParameters[3];
string visitLastPageTime = leadParameters[4];
if (leadParameters.Length == 6)
{
visitCount = leadParameters[5];
}
string TOT_TIME_SPENT = (Convert.ToInt64(visitLastPageTime) - Convert.ToInt64(visitPrevPageTime)).ToString();
if ((int)caseType == 1) //to enter new cwc data in summary table
{
session.Execute("insert into usertracking (cwc, cur_visit_id, cur_visit_last_ts, tot_page_view, tot_time_spent, tot_visit_count, cur_visit_datetime) values ('" + cwc + "' , '" + visitId + "' ," + visitStartTime + "," + "1" + "," + TOT_TIME_SPENT + "," + "1" + ", '" + DateTime.Today.ToString("yyyy-MM-dd") + "' )");
_isProcessed = true;
}
if ((int)caseType == 2) //if cwc exits and visit id is same
{
Row result = session.Execute("select tot_page_view, tot_time_spent from usertracking where cwc ='" + cwc + "'").FirstOrDefault();
int page_cnt_val = int.Parse(result[0].ToString()) + 1;
Int64 time_spt_val = Int64.Parse(result[1].ToString()) + Convert.ToInt64(visitLastPageTime) - Convert.ToInt64(visitPrevPageTime);
session.Execute("update usertracking SET cur_visit_last_ts = " + visitLastPageTime + ", tot_page_view = " + page_cnt_val + ", tot_time_spent = " + time_spt_val + " WHERE cwc = '" + cwc.Trim() + "'");
_isProcessed = true;
}
if ((int)caseType == 3) //if cwc exits ans visit id is different
{
Row result = session.Execute("select tot_page_view, tot_time_spent, tot_visit_count, cur_visit_last_ts, cur_visit_datetime from usertracking where cwc = '" + cwc + "'").First();
int page_cnt_val = int.Parse(result[0].ToString()) + 1;
Int64 time_spt_val = Int64.Parse(result[1].ToString()) + Convert.ToInt64(visitLastPageTime) - Convert.ToInt64(visitPrevPageTime);
int visit_val = int.Parse(result[2].ToString()) + 1;
Int64 prev_visit_ts_val = Int64.Parse(result[3].ToString());
String prev_visit_datetime_val = Convert.ToDateTime(result[4].ToString()).ToString("yyyy-MM-dd");
session.Execute("update usertracking SET cur_visit_id = '" + visitId + "' , tot_visit_count= " + visit_val
+ " , prev_visit_last_ts= " + prev_visit_ts_val + ", prev_visit_datetime = '" + prev_visit_datetime_val
+ "' , cur_visit_last_ts = " + visitLastPageTime
+ ", tot_page_view = " + page_cnt_val + ", tot_time_spent = " + time_spt_val
+ ", cur_visit_datetime='" + DateTime.Today.ToString("yyyy-MM-dd")
+ "' WHERE cwc = '" + cwc.Trim() + "'");
_isProcessed = true;
}
session.Dispose();
cluster.Dispose();
return _isProcessed;
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra InsertCWCRecords function with cwv :" + cwv + "error is :" + ex.Message);
SendMail.HandleException(ex, subject);
session.Dispose();
cluster.Dispose();
return false;
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra InsertCWCRecords function connection :" + ex.Message);
SendMail.HandleException(ex, subject);
return false;
}
}
public bool UpdateReferrerTimeSpent(string cwc, int referrerCategoryId, double referrerTimeSpent, int index, string mobileId)
{
bool _isUpdated = false;
try
{
Logs.WriteInfoLog("Cassandra UpdateReferrerTimeSpent function called");
Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build();
ISession session = cluster.Connect("cw");
try
{
Row result = session.Execute("select time_spent_in_sec from userTimeSpentPage WHERE cwc = '" + cwc.Trim() + "' And logdate = '" + DateTime.Today.ToString("yyyy-MM-dd") + "' And page_category_id =" + referrerCategoryId).FirstOrDefault();
if (result != null)
{
if (result[0].ToString().Trim() != string.Empty)
{
Int64 page_time_spent_val = Int64.Parse(result[0].ToString());
Int64 tot_time_spt_val = page_time_spent_val + Int64.Parse(referrerTimeSpent.ToString());
session.Execute("update userTimeSpentPage set time_spent_in_sec= " + tot_time_spt_val + "WHERE cwc = '" + cwc.Trim() + "' And logdate = '" + DateTime.Today.ToString("yyyy-MM-dd") + "' And page_category_id=" + referrerCategoryId);
}
}
else
{
session.Execute("insert into userTimeSpentPage (cwc, page_category_id, time_spent_in_sec, logdate) values ('" + cwc + "' ," + referrerCategoryId + "," + referrerTimeSpent + ", '" + DateTime.Now.ToString("yyyy-MM-dd") + "' )");
}
_isUpdated = true;
session.Dispose();
cluster.Dispose();
return _isUpdated;
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra UpdateReferrerTimeSpent function with cwc:" + cwc + "error is :" + ex.Message);
SendMail.HandleException(ex, subject);
session.Dispose();
cluster.Dispose();
return _isUpdated;
}
}
catch (Exception ex)
{
string subject = string.Concat(ex.Source, " : ", Environment.MachineName);
Logs.WriteErrorLog("error in Cassandra UpdateReferrerTimeSpent function connection" + ex.Message);
SendMail.HandleException(ex, subject);
return _isUpdated;
}
}
}
}
Edited Question:
output of netstat -an | awk '/^tcp/ {print $NF}' | sort | uniq -c | sort -rn
On Machine 1 While cassandra running :
773 ESTABLISHED
36 LISTEN
1 CLOSE_WAIT
After cassandra stopped :
274 ESTABLISHED
36 LISTEN
1 CLOSE_WAIT
Machine 2 while cassandra running :
3941 ESTABLISHED
26 LISTEN
7 CLOSE_WAIT
After cassandra stopped :
26 LISTEN
9 ESTABLISHED
On machine 3 while cassandra running :
500 ESTABLISHED
21 LISTEN
After cassandra stopped :
21 LISTEN
13 ESTABLISHED
The NoHostAvailableException can be thrown for many reasons. However this is all about the problem described in the driver documentation:
Exception thrown when a query cannot be performed because no host are
available. This exception is thrown if
either there is no host live in
the cluster at the moment of the query
all host that have been tried
have failed due to a connection problem
Now why is this happening - there could be several reasons for this.
Possibility of simultaneous major Garbage collection on all 3 nodes. I personally don't think it is the case, but you should definitely read on this and see if it may apply to your case. Here is a link to a very nice documednt describing how to tune GC in Cassandra. The fact that you create cluster and session objects practically for any call instead of storing them as singletons and just reusing them, may make things even worse.
After looking at the function that throws an error, I am more or less convinced that the problem is that after so many inserts, your nodes just timeout while reading the wide row during this statement: Row result = session.Execute("select cur_visit_id from usertracking where cwc ='" + cwc + "'").FirstOrDefault();. Further down the road you're performing a lot of updates for the same clustering key cws which, due to immutable nature of the SSTables, makes a lot of versioned data, resulting in added data retrieval time, since the cluster needs to combine all of this data for each your request.
It is hard to make recommendations without any table schema, and reverse engineering won't help much either, but I would recommend somehow utilizing a composite primary key for faster lookups. Tune your JVMs, and make session and cluster singletons and reuse them in your code. See if this helps.
Read through the Cassandra cluster logs, focusing on the times around when the issues happen. See if any clues are in these logs, like Garbage collection activity, or timeout errors.
HTH
Roman
Related
How to solve report generation issue on Azure?
I am facing some issue when I published over azure it's not working please tell me if any person have a solution about it. public ActionResult GenerateReport(string ReportName) { LocalReport localReport = new LocalReport(); localReport.ReportPath = Server.MapPath(#"~/Areas/RemoteAnalysis/rptAlarm.rdlc"); List<clsReport> lstOverallData = new List<clsReport>(); using (DBClass context = new DBClass()) { context.AddParameter("#FileID", Convert.ToInt32(Session["FileID"])); context.AddParameter("#UserID", Session["UserName"]); DataTable dtReportData = context.getData("GetRouteDetailForReport", CommandType.StoredProcedure); if (dtReportData.Rows.Count > 0) { foreach (DataRow dr in dtReportData.Rows) { try { lstOverallData.Add(new clsReport { FileID = Convert.ToInt32(dr["Fileid"]), PlantID = Convert.ToString(dr["PlantID"]), PlantName = Convert.ToString(dr["PlantName"]), AreaID = Convert.ToString(dr["AreaID"]), AreaName = Convert.ToString(dr["AreaName"]), TrainID = Convert.ToString(dr["TrainID"]), TrainName = Convert.ToString(dr["TrainName"]), MachineID = Convert.ToString(dr["MachineID"]), MachineName = Convert.ToString(dr["MachineName"]), PointID = Convert.ToString(dr["PointID"]), PointName = Convert.ToString(dr["PointName"]), AalrmID = Convert.ToInt32(dr["PointAlarmID"]), AlarmName = Convert.ToString(dr["AlarmName"]), HighValue = Convert.ToDouble(dr["HighValue"]), LowValue = Convert.ToDouble(dr["LowValue"]), MeasurementTime = Convert.ToDateTime("2018-04-17 14:44:02.293"), OverallChnlA = Convert.ToDouble(dr["OverallValueChnlA"]), UnitChnlA = Convert.ToString(dr["OverallUnitChnlA"]), OverallChnlB = Convert.ToDouble(dr["OverallValueChnlB"]), UnitChnlB = Convert.ToString(dr["OverallUnitChnlB"]), DataID = Convert.ToInt32(dr["DataID"]) }); } catch (Exception ex) { throw ex; } } } } //code changes from here on 5 march 2021.. ReportDataSource reportDataSource = new ReportDataSource("dsOverall", lstOverallData); localReport.DataSources.Add(reportDataSource); localReport.Refresh(); string reportType = ""; //"PDF"; //Enter downloading format according to your choice/if condition string mimeType; string encoding; string fileNameExtension; string format = ""; string filename = ""; string deviceInfo = ""; //The DeviceInfo settings should be changed based on the reportType if (ReportName == "pdf") { reportType = "PDF"; format = "application/pdf"; filename = "AlaramReport.pdf"; deviceInfo = "<DeviceInfo>" + " <OutputFormat>pdf</OutputFormat>" + " <PageTitle> Report</PageTitle>" + " <PageWidth>9.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>0.5in</MarginLeft>" + " <MarginRight>0.5in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; } else if (ReportName == "doc") { reportType = "Word"; format = "application/doc"; filename = "AlaramReport.doc"; deviceInfo = "<DeviceInfo>" + " <OutputFormat>doc</OutputFormat>" + " <PageTitle> Report</PageTitle>" + " <PageWidth>9.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>0.5in</MarginLeft>" + " <MarginRight>0.5in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; } else if (ReportName == "xls") { reportType = "Excel"; format = "application/xls"; filename = "AlaramReport.xls"; deviceInfo = "<DeviceInfo>" + " <OutputFormat>xls</OutputFormat>" + " <PageTitle> Report</PageTitle>" + " <PageWidth>9.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>0.5in</MarginLeft>" + " <MarginRight>0.5in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; } else if (ReportName == "jpg") { reportType = "Image"; format = "application/jpg"; filename = "AlaramReport.jpg"; deviceInfo = "<DeviceInfo>" + " <OutputFormat>jpg</OutputFormat>" + " <PageTitle> Report</PageTitle>" + " <PageWidth>9.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>0.5in</MarginLeft>" + " <MarginRight>0.5in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; } else { reportType = "PDF"; format = "application/pdf"; filename = "AlaramReport.pdf"; deviceInfo = "<DeviceInfo>" + " <OutputFormat>pdf</OutputFormat>" + " <PageTitle> Report</PageTitle>" + " <PageWidth>9.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>0.5in</MarginLeft>" + " <MarginRight>0.5in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; } //Render the report Warning[] warnings; string[] streams; byte[] renderedBytes; renderedBytes = localReport.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); ViewBag.Title = "Alarm Report"; return File(renderedBytes, format, filename); } The above one is my code which is used to generate a report on local serer but when I publish on Azure then it was not working and shows me an error like server error. How to resolve this issue please anyone tell me. tried lots of code for this issue but nothing to work.
i have two forms, 1st Form have insertdata() which is i want to call in advancePayment Form how can i do that
public void insertdata() { try { con.Open(); OleDbCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into customers(customer_name,address,email,mob_no) values('" + tname.Text + "','" + taddress.Text + "','" + temail.Text + "','" + tmobno.Text + "')"; cmd.ExecuteNonQuery(); MessageBox.Show("Registered Successfully"); con.Close(); tname.Text = ""; taddress.Text = ""; temail.Text = ""; tmobno.Text = ""; } catch (Exception e) { MessageBox.Show("Problem in Registering Customer,Please Enter all Fields Correctly" + e); } } ''This is is function which i want to call in another Form which is advancePayment on button_click.
As you want to call the same function at multiple places, what you can do is create another class with insertdata() function in it. After that, you can add reference of that class in your respective forms.
DataBase Connection String Parameter Pollution fortify issue
I have developed a tool and when I am running the fortify then I am getting 6 critical issues related to Db connection string stating "Concatenating unvalidated input into a database connection may allow an attacker to override the value of a request parameter. An attacker may be able to override existing parameter values, inject a new parameter or exploit variables out of a direct reach." public bool sqlDbValidateUser(string databaseHostname, string databaseName, string databaseUsername, string databasePassword) { _logger.Info("starting sql DB validation"); string ConnectionString = "Data Source=" + databaseHostname + "; " + "Initial Catalog=" + databaseName + ";" + "User id=" + databaseUsername + ";" + "Password=" + databasePassword + ";"; using (SqlConnection connection = new SqlConnection(ConnectionString)) { try { connection.Open(); return true; } catch(Exception) { return false; } finally { if(connection !=null) { connection.Close(); } } } }
When working with Sql databases, string concatenations is pure evil. The correct way to do what you are trying is, replace this code: string connectionString = "Data Source=" + databaseHostname + "; " + "Initial Catalog=" + databaseName + ";" + "User id=" + databaseUsername + ";" + "Password=" + databasePassword + ";"; with this code: string connectionString; try { var builder = new SqlConnectionStringBuilder(); builder.DataSource = databaseHostname; builder.InitialCatalog = databaseName; builder.UserID = databaseUsername; builder.Password = databasePassword; connectionString = builder.ToString(); } catch { return false; }
how to test this type of method using Mockito?
public double getMinCBQta(long enteCod, long artCod) throws FailureException { logger.debug("getMinCBqta() - ENTER"); double minCBQta = 0; final TypedQuery<Double> query = em.createQuery("select NVL(Min(c.qtaCapienza),0) " + "from CapienzaBanco c " + "where c.id.enteCod = :ENTECOD AND c.id.artCod = :ARTCOD " + "AND c.id.nrPromo = 0 AND c.id.annoPromo = 0 AND c.qtaCapienza!= 0 ", Double.class); try { query.setParameter(CommonConstants.ENTECOD, enteCod); query.setParameter(CommonConstants.ARTCOD, artCod); minCBQta = query.getSingleResult(); } catch (final NoResultException ne) { logger.warn("getMinCBQta :No result received from CAPIENZA_BANCO with enetCod " + enteCod + "artCod: " + artCod); } catch (final Exception e) { logger.error("getMinCBQta : Error Retriving data from CAPIENZA_BANCO " + e.getMessage()); throw new FailureException("getMinCBQta : Error Retriving data from CAPIENZA_BANCO " + e); } logger.debug("getMinCBqta()" + " EXIT"); return minCBQta; }
c# how to stop exception from bubbling up
when exception is thrown in my controller, action's are getting executed again and again, when error is thrown this cycle is going on. try { LogManager.Info("Call:" + invocation.TargetType.Name + "::" + invocation.Method.Name); var startTime = DateTime.Now; invocation.Proceed(); var endTime = DateTime.Now; LogManager.Info("CallEnd:" + invocation.TargetType.Name + "::" + invocation.Method.Name + " Execution Time(Milliseconds): " + (endTime - startTime).Milliseconds); } catch (Exception ex) { //HttpContext.Current.Request.Abort(); var builder = new StringBuilder(); var dataSource = ConfigurationManager.ConnectionStrings["dbMain"].ToString().Split(';')[0]; builder.AppendLine(); builder.AppendLine(string.Concat(Enumerable.Repeat(">", 50))); builder.AppendLine("Server Time:-" + DateTime.Now); //builder.AppendLine("Requested Url:" + HttpContext.Current.Request.Url); builder.AppendLine(dataSource); builder.AppendLine("Error at " + invocation.TargetType.Name + "::" + invocation.Method.Name + "(" + JsonConvert.SerializeObject(invocation.Arguments, Formatting.Indented) + ")"); builder.AppendLine(string.Concat(Enumerable.Repeat("-", 50))); builder.AppendLine(JsonConvert.SerializeObject(ex, Formatting.Indented).Replace("\\n", System.Environment.NewLine)); builder.AppendLine(string.Concat(Enumerable.Repeat("<", 50))); LogManager.Error(builder.ToString()); LogManager.SendMail(ex, builder.ToString()); throw; }
If you want the exception to stop bubbling up, don't re-throw it. In your code there is the : "throw ;" line. Remove it.