aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/MySQL
diff options
context:
space:
mode:
authorMelanie2011-12-13 12:58:28 +0100
committerMelanie2011-12-13 12:58:28 +0100
commitdf65245671cbef2f2da5b8bb78aa02be409b1469 (patch)
treefa9c3083bb41bbda98034b24d5b81b53a03d9db7 /OpenSim/Data/MySQL
parentComment debug spam (diff)
downloadopensim-SC-df65245671cbef2f2da5b8bb78aa02be409b1469.zip
opensim-SC-df65245671cbef2f2da5b8bb78aa02be409b1469.tar.gz
opensim-SC-df65245671cbef2f2da5b8bb78aa02be409b1469.tar.bz2
opensim-SC-df65245671cbef2f2da5b8bb78aa02be409b1469.tar.xz
Spin off terrain save into a new thread and make it so that it uses the old
values for places where NaN are found.
Diffstat (limited to 'OpenSim/Data/MySQL')
-rw-r--r--OpenSim/Data/MySQL/MySQLSimulationData.cs63
1 files changed, 34 insertions, 29 deletions
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs
index b201c51..40619de 100644
--- a/OpenSim/Data/MySQL/MySQLSimulationData.cs
+++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs
@@ -561,45 +561,46 @@ namespace OpenSim.Data.MySQL
561 561
562 public virtual void StoreTerrain(double[,] ter, UUID regionID) 562 public virtual void StoreTerrain(double[,] ter, UUID regionID)
563 { 563 {
564 m_log.Info("[REGION DB]: Storing terrain"); 564 Util.FireAndForget(delegate(object x)
565
566 lock (m_dbLock)
567 { 565 {
568 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 566 double[,] oldTerrain = LoadTerrain(regionID);
569 {
570 dbcon.Open();
571 567
572 using (MySqlCommand cmd = dbcon.CreateCommand()) 568 m_log.Info("[REGION DB]: Storing terrain");
569
570 lock (m_dbLock)
571 {
572 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
573 { 573 {
574 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID"; 574 dbcon.Open();
575 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
576 575
577 using (MySqlCommand cmd2 = dbcon.CreateCommand()) 576 using (MySqlCommand cmd = dbcon.CreateCommand())
578 { 577 {
579 try 578 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
579 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
580
581 using (MySqlCommand cmd2 = dbcon.CreateCommand())
580 { 582 {
581 cmd2.CommandText = "insert into terrain (RegionUUID, " + 583 try
582 "Revision, Heightfield) values (?RegionUUID, " + 584 {
583 "1, ?Heightfield)"; 585 cmd2.CommandText = "insert into terrain (RegionUUID, " +
586 "Revision, Heightfield) values (?RegionUUID, " +
587 "1, ?Heightfield)";
584 588
585 cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString()); 589 cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
586 cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter)); 590 cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter, oldTerrain));
587 591
588 ExecuteNonQuery(cmd); 592 ExecuteNonQuery(cmd);
589 ExecuteNonQuery(cmd2); 593 ExecuteNonQuery(cmd2);
590 } 594 }
591 catch 595 catch (Exception e)
592 { 596 {
593 // If we get here there is a NaN in the terrain 597 m_log.ErrorFormat(e.ToString());
594 // and the terrain can't be saved. A crash here 598 }
595 // is much better than losing all the work
596 m_log.ErrorFormat("[DATA]: Unable to save terrain. Stopping simulator to prevent data loss");
597 Environment.Exit(1);
598 } 599 }
599 } 600 }
600 } 601 }
601 } 602 }
602 } 603 });
603 } 604 }
604 605
605 public virtual double[,] LoadTerrain(UUID regionID) 606 public virtual double[,] LoadTerrain(UUID regionID)
@@ -1411,7 +1412,7 @@ namespace OpenSim.Data.MySQL
1411 /// </summary> 1412 /// </summary>
1412 /// <param name="val"></param> 1413 /// <param name="val"></param>
1413 /// <returns></returns> 1414 /// <returns></returns>
1414 private static Array SerializeTerrain(double[,] val) 1415 private static Array SerializeTerrain(double[,] val, double[,] oldTerrain)
1415 { 1416 {
1416 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double)); 1417 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
1417 BinaryWriter bw = new BinaryWriter(str); 1418 BinaryWriter bw = new BinaryWriter(str);
@@ -1420,7 +1421,11 @@ namespace OpenSim.Data.MySQL
1420 for (int x = 0; x < (int)Constants.RegionSize; x++) 1421 for (int x = 0; x < (int)Constants.RegionSize; x++)
1421 for (int y = 0; y < (int)Constants.RegionSize; y++) 1422 for (int y = 0; y < (int)Constants.RegionSize; y++)
1422 { 1423 {
1423 double height = val[x, y]; 1424 double height = 20.0;
1425 if (oldTerrain != null)
1426 height = oldTerrain[x, y];
1427 if (!double.IsNaN(val[x, y]))
1428 height = val[x, y];
1424 if (height == 0.0) 1429 if (height == 0.0)
1425 height = double.Epsilon; 1430 height = double.Epsilon;
1426 1431