From 6309fcc5b4b42102b5bb901dbbdf44846f5643f2 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Mon, 2 Nov 2009 11:19:55 -0800 Subject: Reverting the memory leak patch for MySQL. Problems have been reported with the grid server after running for several hours --- OpenSim/Data/MySQL/MySQLInventoryData.cs | 335 ++++++++++++++++--------------- 1 file changed, 169 insertions(+), 166 deletions(-) (limited to 'OpenSim/Data/MySQL/MySQLInventoryData.cs') diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 598971d..0eecf06 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -135,30 +135,30 @@ namespace OpenSim.Data.MySQL database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", - database.Connection)) + MySqlCommand result = + new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", folderID.ToString()); + MySqlDataReader reader = result.ExecuteReader(); + + while (reader.Read()) { - result.Parameters.AddWithValue("?uuid", folderID.ToString()); + // A null item (because something went wrong) breaks everything in the folder + InventoryItemBase item = readInventoryItem(reader); + if (item != null) + items.Add(item); + } - using (MySqlDataReader reader = result.ExecuteReader()) - { - while (reader.Read()) - { - // A null item (because something went wrong) breaks everything in the folder - InventoryItemBase item = readInventoryItem(reader); - if (item != null) - items.Add(item); - } + reader.Close(); + result.Dispose(); - return items; - } - } + return items; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -176,28 +176,29 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand( - "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", - database.Connection)) - { - result.Parameters.AddWithValue("?uuid", user.ToString()); - result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); + MySqlCommand result = + new MySqlCommand( + "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", user.ToString()); + result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); + MySqlDataReader reader = result.ExecuteReader(); - using (MySqlDataReader reader = result.ExecuteReader()) - { - List items = new List(); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); + List items = new List(); + while (reader.Read()) + items.Add(readInventoryFolder(reader)); - return items; - } - } + + reader.Close(); + result.Dispose(); + + return items; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -216,38 +217,41 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand( - "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", - database.Connection)) - { - result.Parameters.AddWithValue("?uuid", user.ToString()); - result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); + MySqlCommand result = + new MySqlCommand( + "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", user.ToString()); + result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); - using (MySqlDataReader reader = result.ExecuteReader()) - { - List items = new List(); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); + MySqlDataReader reader = result.ExecuteReader(); - InventoryFolderBase rootFolder = null; + List items = new List(); + while (reader.Read()) + items.Add(readInventoryFolder(reader)); - // There should only ever be one root folder for a user. However, if there's more - // than one we'll simply use the first one rather than failing. It would be even - // nicer to print some message to this effect, but this feels like it's too low a - // to put such a message out, and it's too minor right now to spare the time to - // suitably refactor. - if (items.Count > 0) - rootFolder = items[0]; + InventoryFolderBase rootFolder = null; - return rootFolder; - } + // There should only ever be one root folder for a user. However, if there's more + // than one we'll simply use the first one rather than failing. It would be even + // nicer to print some message to this effect, but this feels like it's too low a + // to put such a message out, and it's too minor right now to spare the time to + // suitably refactor. + if (items.Count > 0) + { + rootFolder = items[0]; } + + reader.Close(); + result.Dispose(); + + return rootFolder; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -267,26 +271,27 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", - database.Connection)) - { - result.Parameters.AddWithValue("?uuid", parentID.ToString()); - using (MySqlDataReader reader = result.ExecuteReader()) - { - List items = new List(); + MySqlCommand result = + new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", parentID.ToString()); + MySqlDataReader reader = result.ExecuteReader(); - while (reader.Read()) - items.Add(readInventoryFolder(reader)); + List items = new List(); - return items; - } - } + while (reader.Read()) + items.Add(readInventoryFolder(reader)); + + reader.Close(); + result.Dispose(); + + return items; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -365,25 +370,25 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection)) - { - result.Parameters.AddWithValue("?uuid", itemID.ToString()); + MySqlCommand result = + new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection); + result.Parameters.AddWithValue("?uuid", itemID.ToString()); + MySqlDataReader reader = result.ExecuteReader(); - using (MySqlDataReader reader = result.ExecuteReader()) - { - InventoryItemBase item = null; - if (reader.Read()) - item = readInventoryItem(reader); + InventoryItemBase item = null; + if (reader.Read()) + item = readInventoryItem(reader); - return item; - } - } + reader.Close(); + result.Dispose(); + + return item; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); } return null; } @@ -408,7 +413,7 @@ namespace OpenSim.Data.MySQL } catch (Exception e) { - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); } return null; @@ -428,25 +433,24 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) - { - result.Parameters.AddWithValue("?uuid", folderID.ToString()); + MySqlCommand result = + new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection); + result.Parameters.AddWithValue("?uuid", folderID.ToString()); + MySqlDataReader reader = result.ExecuteReader(); - using (MySqlDataReader reader = result.ExecuteReader()) - { - InventoryFolderBase folder = null; - if (reader.Read()) - folder = readInventoryFolder(reader); + InventoryFolderBase folder = null; + if (reader.Read()) + folder = readInventoryFolder(reader); + reader.Close(); + result.Dispose(); - return folder; - } - } + return folder; } } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -694,73 +698,69 @@ namespace OpenSim.Data.MySQL try { List folders = new List(); - Dictionary> hashtable = new Dictionary>(); ; + Dictionary> hashtable + = new Dictionary>(); ; List parentFolder = new List(); - bool buildResultsFromHashTable = false; - lock (database) { + MySqlCommand result; + MySqlDataReader reader; + bool buildResultsFromHashTable = false; + database.CheckConnection(); /* Fetch the parent folder from the database to determine the agent ID, and if * we're querying the root of the inventory folder tree */ - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) - { - result.Parameters.AddWithValue("?uuid", parentID.ToString()); - - using (MySqlDataReader reader = result.ExecuteReader()) - { - // Should be at most 1 result - while (reader.Read()) - parentFolder.Add(readInventoryFolder(reader)); - } - } + result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", parentID.ToString()); + reader = result.ExecuteReader(); + while (reader.Read()) // Should be at most 1 result + parentFolder.Add(readInventoryFolder(reader)); + reader.Close(); + result.Dispose(); if (parentFolder.Count >= 1) // No result means parent folder does not exist { if (parentFolder[0].ParentID == UUID.Zero) // We are querying the root folder { /* Get all of the agent's folders from the database, put them in a list and return it */ - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) + result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); + reader = result.ExecuteReader(); + while (reader.Read()) { - result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); - - using (MySqlDataReader reader = result.ExecuteReader()) - { - while (reader.Read()) - { - InventoryFolderBase curFolder = readInventoryFolder(reader); - if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list - folders.Add(curFolder); - } - } + InventoryFolderBase curFolder = readInventoryFolder(reader); + if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list + folders.Add(curFolder); } + reader.Close(); + result.Dispose(); } // if we are querying the root folder else // else we are querying a subtree of the inventory folder tree { /* Get all of the agent's folders from the database, put them all in a hash table * indexed by their parent ID */ - using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) + result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", + database.Connection); + result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); + reader = result.ExecuteReader(); + while (reader.Read()) { - result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); - - using (MySqlDataReader reader = result.ExecuteReader()) + InventoryFolderBase curFolder = readInventoryFolder(reader); + if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling + hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list + else // else current folder has no known (yet) siblings { - while (reader.Read()) - { - InventoryFolderBase curFolder = readInventoryFolder(reader); - if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling - hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list - else // else current folder has no known (yet) siblings - { - List siblingList = new List(); - siblingList.Add(curFolder); - // Current folder has no known (yet) siblings - hashtable.Add(curFolder.ParentID, siblingList); - } - } // while more items to read from the database + List siblingList = new List(); + siblingList.Add(curFolder); + // Current folder has no known (yet) siblings + hashtable.Add(curFolder.ParentID, siblingList); } - } + } // while more items to read from the database + reader.Close(); + result.Dispose(); // Set flag so we know we need to build the results from the hash table after // we unlock the database @@ -781,13 +781,12 @@ namespace OpenSim.Data.MySQL folders.AddRange(hashtable[folders[i].ID]); } } // lock (database) - return folders; } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } } @@ -802,18 +801,19 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection)) - { - cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); + MySqlCommand cmd = + new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection); + cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); - lock (database) - cmd.ExecuteNonQuery(); + lock (database) + { + cmd.ExecuteNonQuery(); } } catch (MySqlException e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); } } @@ -827,12 +827,13 @@ namespace OpenSim.Data.MySQL { database.CheckConnection(); - using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection)) - { - cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); + MySqlCommand cmd = + new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection); + cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); - lock (database) - cmd.ExecuteNonQuery(); + lock (database) + { + cmd.ExecuteNonQuery(); } } catch (MySqlException e) @@ -864,38 +865,40 @@ namespace OpenSim.Data.MySQL public List fetchActiveGestures(UUID avatarID) { + MySqlDataReader result = null; + MySqlCommand sqlCmd = null; lock (database) { try { database.CheckConnection(); - - using (MySqlCommand sqlCmd = new MySqlCommand( + sqlCmd = new MySqlCommand( "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1", - database.Connection)) - { - sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); - sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); + database.Connection); + sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); + sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); + result = sqlCmd.ExecuteReader(); - using (MySqlDataReader result = sqlCmd.ExecuteReader()) - { - List list = new List(); - while (result.Read()) - { - InventoryItemBase item = readInventoryItem(result); - if (item != null) - list.Add(item); - } - return list; - } + List list = new List(); + while (result.Read()) + { + InventoryItemBase item = readInventoryItem(result); + if (item != null) + list.Add(item); } + return list; } catch (Exception e) { database.Reconnect(); - m_log.Error(e.Message, e); + m_log.Error(e.ToString()); return null; } + finally + { + if (result != null) result.Close(); + if (sqlCmd != null) sqlCmd.Dispose(); + } } } } -- cgit v1.1