diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/Data.MySQL/MySQLDataStore.cs | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs b/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs index b25924c..54f39bb 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs | |||
@@ -50,7 +50,6 @@ namespace OpenSim.Framework.Data.MySQL | |||
50 | private const string m_landAccessListSelect = "select * from landaccesslist"; | 50 | private const string m_landAccessListSelect = "select * from landaccesslist"; |
51 | 51 | ||
52 | private DataSet m_dataSet; | 52 | private DataSet m_dataSet; |
53 | private static object DBAccessLock = new object(); // Trying to use a static object because there might be other regions that keep modifying table | ||
54 | private MySqlDataAdapter m_primDataAdapter; | 53 | private MySqlDataAdapter m_primDataAdapter; |
55 | private MySqlDataAdapter m_shapeDataAdapter; | 54 | private MySqlDataAdapter m_shapeDataAdapter; |
56 | private MySqlDataAdapter m_itemsDataAdapter; | 55 | private MySqlDataAdapter m_itemsDataAdapter; |
@@ -104,7 +103,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
104 | 103 | ||
105 | TestTables(m_connection); | 104 | TestTables(m_connection); |
106 | 105 | ||
107 | lock (DBAccessLock) | 106 | lock (m_dataSet) |
108 | { | 107 | { |
109 | m_primTable = createPrimTable(); | 108 | m_primTable = createPrimTable(); |
110 | m_dataSet.Tables.Add(m_primTable); | 109 | m_dataSet.Tables.Add(m_primTable); |
@@ -143,7 +142,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
143 | 142 | ||
144 | public void StoreObject(SceneObjectGroup obj, LLUUID regionUUID) | 143 | public void StoreObject(SceneObjectGroup obj, LLUUID regionUUID) |
145 | { | 144 | { |
146 | lock (DBAccessLock) | 145 | lock (m_dataSet) |
147 | { | 146 | { |
148 | foreach (SceneObjectPart prim in obj.Children.Values) | 147 | foreach (SceneObjectPart prim in obj.Children.Values) |
149 | { | 148 | { |
@@ -170,7 +169,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
170 | DataTable shapes = m_shapeTable; | 169 | DataTable shapes = m_shapeTable; |
171 | 170 | ||
172 | string selectExp = "SceneGroupID = '" + Util.ToRawUuidString(obj) + "'"; | 171 | string selectExp = "SceneGroupID = '" + Util.ToRawUuidString(obj) + "'"; |
173 | lock (DBAccessLock) | 172 | lock (m_dataSet) |
174 | { | 173 | { |
175 | DataRow[] primRows = prims.Select(selectExp); | 174 | DataRow[] primRows = prims.Select(selectExp); |
176 | foreach (DataRow row in primRows) | 175 | foreach (DataRow row in primRows) |
@@ -226,7 +225,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
226 | string byRegion = "RegionUUID = '" + Util.ToRawUuidString(regionUUID) + "'"; | 225 | string byRegion = "RegionUUID = '" + Util.ToRawUuidString(regionUUID) + "'"; |
227 | string orderByParent = "ParentID ASC"; | 226 | string orderByParent = "ParentID ASC"; |
228 | 227 | ||
229 | lock (DBAccessLock) | 228 | lock (m_dataSet) |
230 | { | 229 | { |
231 | DataRow[] primsForRegion = prims.Select(byRegion, orderByParent); | 230 | DataRow[] primsForRegion = prims.Select(byRegion, orderByParent); |
232 | MainLog.Instance.Verbose("DATASTORE", | 231 | MainLog.Instance.Verbose("DATASTORE", |
@@ -336,7 +335,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
336 | MainLog.Instance.Verbose("DATASTORE", "Storing terrain revision r" + revision.ToString()); | 335 | MainLog.Instance.Verbose("DATASTORE", "Storing terrain revision r" + revision.ToString()); |
337 | 336 | ||
338 | DataTable terrain = m_dataSet.Tables["terrain"]; | 337 | DataTable terrain = m_dataSet.Tables["terrain"]; |
339 | lock (DBAccessLock) | 338 | lock (m_dataSet) |
340 | { | 339 | { |
341 | MySqlCommand cmd = new MySqlCommand("insert into terrain(RegionUUID, Revision, Heightfield)" + | 340 | MySqlCommand cmd = new MySqlCommand("insert into terrain(RegionUUID, Revision, Heightfield)" + |
342 | " values(?RegionUUID, ?Revision, ?Heightfield)", m_connection); | 341 | " values(?RegionUUID, ?Revision, ?Heightfield)", m_connection); |
@@ -397,7 +396,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
397 | 396 | ||
398 | public void RemoveLandObject(LLUUID globalID) | 397 | public void RemoveLandObject(LLUUID globalID) |
399 | { | 398 | { |
400 | lock (DBAccessLock) | 399 | lock (m_dataSet) |
401 | { | 400 | { |
402 | using (MySqlCommand cmd = new MySqlCommand("delete from land where UUID=?UUID", m_connection)) | 401 | using (MySqlCommand cmd = new MySqlCommand("delete from land where UUID=?UUID", m_connection)) |
403 | { | 402 | { |
@@ -422,7 +421,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
422 | MainLog.Instance.Verbose("DATASTORE", "Tedds temp fix: Waiting 3 seconds for stuff to catch up. (Someone please fix! :))"); | 421 | MainLog.Instance.Verbose("DATASTORE", "Tedds temp fix: Waiting 3 seconds for stuff to catch up. (Someone please fix! :))"); |
423 | System.Threading.Thread.Sleep(2500 + rnd.Next(300, 900)); | 422 | System.Threading.Thread.Sleep(2500 + rnd.Next(300, 900)); |
424 | 423 | ||
425 | lock (DBAccessLock) | 424 | lock (m_dataSet) |
426 | { | 425 | { |
427 | DataTable land = m_landTable; | 426 | DataTable land = m_landTable; |
428 | DataTable landaccesslist = m_landAccessListTable; | 427 | DataTable landaccesslist = m_landAccessListTable; |
@@ -454,14 +453,14 @@ namespace OpenSim.Framework.Data.MySQL | |||
454 | landaccesslist.Rows.Add(newAccessRow); | 453 | landaccesslist.Rows.Add(newAccessRow); |
455 | } | 454 | } |
456 | 455 | ||
457 | Commit_NoLock(); | ||
458 | } | 456 | } |
457 | Commit(); | ||
459 | } | 458 | } |
460 | 459 | ||
461 | public List<LandData> LoadLandObjects(LLUUID regionUUID) | 460 | public List<LandData> LoadLandObjects(LLUUID regionUUID) |
462 | { | 461 | { |
463 | List<LandData> landDataForRegion = new List<LandData>(); | 462 | List<LandData> landDataForRegion = new List<LandData>(); |
464 | lock (DBAccessLock) | 463 | lock (m_dataSet) |
465 | { | 464 | { |
466 | DataTable land = m_landTable; | 465 | DataTable land = m_landTable; |
467 | DataTable landaccesslist = m_landAccessListTable; | 466 | DataTable landaccesslist = m_landAccessListTable; |
@@ -523,39 +522,27 @@ namespace OpenSim.Framework.Data.MySQL | |||
523 | m_connection.Open(); | 522 | m_connection.Open(); |
524 | } | 523 | } |
525 | 524 | ||
526 | lock (DBAccessLock) | 525 | lock (m_dataSet) |
527 | { | 526 | { |
528 | // Moved code to own sub that can be called directly by "StoreLandObject". | 527 | // DisplayDataSet(m_dataSet, "Region DataSet"); |
529 | // Problem is that: | ||
530 | // - StoreLandObject locks | ||
531 | // - Some other function waits for lock | ||
532 | // - StoreLandObject releases lock | ||
533 | // - Other function obtains lock | ||
534 | // - StoreLandObject calls Commit that tries to take lock back | ||
535 | // - When StoreLandObject's Commit finally gets lock the table has been changed and we crash | ||
536 | Commit_NoLock(); | ||
537 | } | ||
538 | } | ||
539 | 528 | ||
540 | private void Commit_NoLock() | 529 | m_primDataAdapter.Update(m_primTable); |
541 | { | 530 | m_shapeDataAdapter.Update(m_shapeTable); |
542 | // DisplayDataSet(m_dataSet, "Region DataSet"); | ||
543 | 531 | ||
544 | m_primDataAdapter.Update(m_primTable); | 532 | if (persistPrimInventories) |
545 | m_shapeDataAdapter.Update(m_shapeTable); | 533 | { |
546 | 534 | m_itemsDataAdapter.Update(m_itemsTable); | |
547 | if (persistPrimInventories) | 535 | } |
548 | { | ||
549 | m_itemsDataAdapter.Update(m_itemsTable); | ||
550 | } | ||
551 | 536 | ||
552 | m_terrainDataAdapter.Update(m_terrainTable); | 537 | m_terrainDataAdapter.Update(m_terrainTable); |
553 | m_landDataAdapter.Update(m_landTable); | 538 | m_landDataAdapter.Update(m_landTable); |
554 | m_landAccessListDataAdapter.Update(m_landAccessListTable); | 539 | m_landAccessListDataAdapter.Update(m_landAccessListTable); |
555 | 540 | ||
556 | m_dataSet.AcceptChanges(); | 541 | m_dataSet.AcceptChanges(); |
542 | } | ||
557 | } | 543 | } |
558 | 544 | ||
545 | |||
559 | public void Shutdown() | 546 | public void Shutdown() |
560 | { | 547 | { |
561 | Commit(); | 548 | Commit(); |
@@ -1231,7 +1218,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
1231 | 1218 | ||
1232 | // For now, we're just going to crudely remove all the previous inventory items | 1219 | // For now, we're just going to crudely remove all the previous inventory items |
1233 | // no matter whether they have changed or not, and replace them with the current set. | 1220 | // no matter whether they have changed or not, and replace them with the current set. |
1234 | lock (DBAccessLock) | 1221 | lock (m_dataSet) |
1235 | { | 1222 | { |
1236 | RemoveItems(primID); | 1223 | RemoveItems(primID); |
1237 | 1224 | ||