aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/UserProfiles.cs1
-rw-r--r--OpenSim/Framework/Util.cs6
-rw-r--r--OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs75
-rw-r--r--OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs96
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs13
-rw-r--r--bin/config-include/FlotsamCache.ini.example13
-rw-r--r--bin/config-include/osslEnable.ini2
8 files changed, 156 insertions, 55 deletions
diff --git a/OpenSim/Framework/UserProfiles.cs b/OpenSim/Framework/UserProfiles.cs
index 6d46fe9..4ed890b 100644
--- a/OpenSim/Framework/UserProfiles.cs
+++ b/OpenSim/Framework/UserProfiles.cs
@@ -135,6 +135,7 @@ namespace OpenSim.Framework
135 public string born; 135 public string born;
136 public byte[] membershipType; 136 public byte[] membershipType;
137 public uint flags; 137 public uint flags;
138 public HashSet<IClientAPI> ClientsWaitingProps;
138 } 139 }
139} 140}
140 141
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index b622523..89cf045 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -1725,12 +1725,16 @@ namespace OpenSim.Framework
1725 return new UUID(bytes, 0); 1725 return new UUID(bytes, 0);
1726 } 1726 }
1727 1727
1728 public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y) 1728 public static bool ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y)
1729 { 1729 {
1730 byte[] bytes = parcelID.GetBytes(); 1730 byte[] bytes = parcelID.GetBytes();
1731 regionHandle = Utils.BytesToUInt64(bytes); 1731 regionHandle = Utils.BytesToUInt64(bytes);
1732 x = Utils.BytesToUInt(bytes, 8) & 0xffff; 1732 x = Utils.BytesToUInt(bytes, 8) & 0xffff;
1733 y = Utils.BytesToUInt(bytes, 12) & 0xffff; 1733 y = Utils.BytesToUInt(bytes, 12) & 0xffff;
1734 // validation may fail, just reducing the odds of using a real UUID as encoded parcel
1735 return ( bytes[0] == 0 && bytes[4] == 0 && // handler x,y multiples of 256
1736 bytes[9] < 64 && bytes[13] < 64 && // positions < 16km
1737 bytes[14] == 0 && bytes[15] == 0);
1734 } 1738 }
1735 1739
1736 public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y, out uint z) 1740 public static void ParseFakeParcelID(UUID parcelID, out ulong regionHandle, out uint x, out uint y, out uint z)
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
index 9413598..b6dd565 100644
--- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
@@ -62,7 +62,8 @@ namespace OpenSim.Region.CoreModules.Asset
62 MethodBase.GetCurrentMethod().DeclaringType); 62 MethodBase.GetCurrentMethod().DeclaringType);
63 63
64 private bool m_Enabled; 64 private bool m_Enabled;
65 private bool m_Running; 65 private bool m_timerRunning;
66 private bool m_cleanupRunning;
66 67
67 private const string m_ModuleName = "FlotsamAssetCache"; 68 private const string m_ModuleName = "FlotsamAssetCache";
68 private const string m_DefaultCacheDirectory = "./assetcache"; 69 private const string m_DefaultCacheDirectory = "./assetcache";
@@ -91,9 +92,8 @@ namespace OpenSim.Region.CoreModules.Asset
91 private bool m_MemoryCacheEnabled = false; 92 private bool m_MemoryCacheEnabled = false;
92 93
93 // Expiration is expressed in hours. 94 // Expiration is expressed in hours.
94 private const double m_DefaultMemoryExpiration = 2; 95 private double m_MemoryExpiration = 0.001;
95 private const double m_DefaultFileExpiration = 48; 96 private const double m_DefaultFileExpiration = 48;
96 private TimeSpan m_MemoryExpiration = TimeSpan.FromHours(m_DefaultMemoryExpiration);
97 private TimeSpan m_FileExpiration = TimeSpan.FromHours(m_DefaultFileExpiration); 97 private TimeSpan m_FileExpiration = TimeSpan.FromHours(m_DefaultFileExpiration);
98 private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.FromHours(1.0); 98 private TimeSpan m_FileExpirationCleanupTimer = TimeSpan.FromHours(1.0);
99 99
@@ -150,7 +150,8 @@ namespace OpenSim.Region.CoreModules.Asset
150 m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory); 150 m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory);
151 151
152 m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", m_MemoryCacheEnabled); 152 m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", m_MemoryCacheEnabled);
153 m_MemoryExpiration = TimeSpan.FromHours(assetConfig.GetDouble("MemoryCacheTimeout", m_DefaultMemoryExpiration)); 153 m_MemoryExpiration = assetConfig.GetDouble("MemoryCacheTimeout", m_MemoryExpiration);
154 m_MemoryExpiration *= 3600.0; // config in hours to seconds
154 155
155 #if WAIT_ON_INPROGRESS_REQUESTS 156 #if WAIT_ON_INPROGRESS_REQUESTS
156 m_WaitOnInprogressTimeout = assetConfig.GetInt("WaitOnInprogressTimeout", 3000); 157 m_WaitOnInprogressTimeout = assetConfig.GetInt("WaitOnInprogressTimeout", 3000);
@@ -224,9 +225,9 @@ namespace OpenSim.Region.CoreModules.Asset
224 m_Scenes.Remove(scene); 225 m_Scenes.Remove(scene);
225 lock(timerLock) 226 lock(timerLock)
226 { 227 {
227 if(m_Running && m_Scenes.Count <= 0) 228 if(m_timerRunning && m_Scenes.Count <= 0)
228 { 229 {
229 m_Running = false; 230 m_timerRunning = false;
230 m_CacheCleanTimer.Stop(); 231 m_CacheCleanTimer.Stop();
231 m_CacheCleanTimer.Close(); 232 m_CacheCleanTimer.Close();
232 } 233 }
@@ -242,7 +243,7 @@ namespace OpenSim.Region.CoreModules.Asset
242 m_AssetService = scene.RequestModuleInterface<IAssetService>(); 243 m_AssetService = scene.RequestModuleInterface<IAssetService>();
243 lock(timerLock) 244 lock(timerLock)
244 { 245 {
245 if(!m_Running) 246 if(!m_timerRunning)
246 { 247 {
247 if (m_FileCacheEnabled && (m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero)) 248 if (m_FileCacheEnabled && (m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero))
248 { 249 {
@@ -250,7 +251,7 @@ namespace OpenSim.Region.CoreModules.Asset
250 m_CacheCleanTimer.AutoReset = false; 251 m_CacheCleanTimer.AutoReset = false;
251 m_CacheCleanTimer.Elapsed += CleanupExpiredFiles; 252 m_CacheCleanTimer.Elapsed += CleanupExpiredFiles;
252 m_CacheCleanTimer.Start(); 253 m_CacheCleanTimer.Start();
253 m_Running = true; 254 m_timerRunning = true;
254 } 255 }
255 } 256 }
256 } 257 }
@@ -263,6 +264,7 @@ namespace OpenSim.Region.CoreModules.Asset
263 264
264 private void UpdateMemoryCache(string key, AssetBase asset) 265 private void UpdateMemoryCache(string key, AssetBase asset)
265 { 266 {
267 // NOTE DO NOT USE SLIDEEXPIRE option on current libomv
266 m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration); 268 m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration);
267 } 269 }
268 270
@@ -480,12 +482,10 @@ namespace OpenSim.Region.CoreModules.Asset
480 asset = GetFromMemoryCache(id); 482 asset = GetFromMemoryCache(id);
481 483
482 if (asset == null && m_FileCacheEnabled) 484 if (asset == null && m_FileCacheEnabled)
483 {
484 asset = GetFromFileCache(id); 485 asset = GetFromFileCache(id);
485 486
486 if (m_MemoryCacheEnabled && asset != null) 487 if (m_MemoryCacheEnabled && asset != null)
487 UpdateMemoryCache(id, asset); 488 UpdateMemoryCache(id, asset);
488 }
489 489
490 if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0)) 490 if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0))
491 { 491 {
@@ -561,8 +561,12 @@ namespace OpenSim.Region.CoreModules.Asset
561 if (m_LogLevel >= 2) 561 if (m_LogLevel >= 2)
562 m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration); 562 m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration);
563 563
564 if(!m_Running) 564 lock(timerLock)
565 return; 565 {
566 if(!m_timerRunning || m_cleanupRunning)
567 return;
568 m_cleanupRunning = true;
569 }
566 // Purge all files last accessed prior to this point 570 // Purge all files last accessed prior to this point
567 DateTime purgeLine = DateTime.Now - m_FileExpiration; 571 DateTime purgeLine = DateTime.Now - m_FileExpiration;
568 572
@@ -578,8 +582,9 @@ namespace OpenSim.Region.CoreModules.Asset
578 582
579 lock(timerLock) 583 lock(timerLock)
580 { 584 {
581 if(m_Running) 585 if(m_timerRunning)
582 m_CacheCleanTimer.Start(); 586 m_CacheCleanTimer.Start();
587 m_cleanupRunning = false;
583 } 588 }
584 } 589 }
585 590
@@ -816,13 +821,13 @@ namespace OpenSim.Region.CoreModules.Asset
816 821
817 s.ForEachSOG(delegate(SceneObjectGroup e) 822 s.ForEachSOG(delegate(SceneObjectGroup e)
818 { 823 {
819 if(!m_Running && !storeUncached) 824 if(!m_timerRunning && !storeUncached)
820 return; 825 return;
821 826
822 gatherer.AddForInspection(e); 827 gatherer.AddForInspection(e);
823 gatherer.GatherAll(); 828 gatherer.GatherAll();
824 829
825 if(!m_Running && !storeUncached) 830 if(!m_timerRunning && !storeUncached)
826 return; 831 return;
827 832
828 foreach (UUID assetID in gatherer.GatheredUuids.Keys) 833 foreach (UUID assetID in gatherer.GatheredUuids.Keys)
@@ -854,13 +859,13 @@ namespace OpenSim.Region.CoreModules.Asset
854 } 859 }
855 860
856 gatherer.GatheredUuids.Clear(); 861 gatherer.GatheredUuids.Clear();
857 if(!m_Running && !storeUncached) 862 if(!m_timerRunning && !storeUncached)
858 return; 863 return;
859 864
860 if(!storeUncached) 865 if(!storeUncached)
861 Thread.Sleep(50); 866 Thread.Sleep(50);
862 }); 867 });
863 if(!m_Running && !storeUncached) 868 if(!m_timerRunning && !storeUncached)
864 break; 869 break;
865 } 870 }
866 871
@@ -905,16 +910,23 @@ namespace OpenSim.Region.CoreModules.Asset
905 { 910 {
906 List<string> outputLines = new List<string>(); 911 List<string> outputLines = new List<string>();
907 912
908 double fileHitRate = (double)m_DiskHits / m_Requests * 100.0; 913 double invReq = 100.0 / m_Requests;
914
915 double fileHitRate = m_DiskHits * invReq;
909 outputLines.Add( 916 outputLines.Add(
910 string.Format("File Hit Rate: {0}% for {1} requests", fileHitRate.ToString("0.00"), m_Requests)); 917 string.Format("File Hit Rate: {0}% for {1} requests", fileHitRate.ToString("0.00"), m_Requests));
911 918
912 if (m_MemoryCacheEnabled) 919 if (m_MemoryCacheEnabled)
913 { 920 {
914 double memHitRate = (double)m_MemoryHits / m_Requests * 100.0; 921 double HitRate = m_MemoryHits * invReq;
922
923 outputLines.Add(
924 string.Format("Memory Hit Rate: {0}% for {1} requests", HitRate.ToString("0.00"), m_Requests));
925
926 HitRate += fileHitRate;
915 927
916 outputLines.Add( 928 outputLines.Add(
917 string.Format("Memory Hit Rate: {0}% for {1} requests", memHitRate.ToString("0.00"), m_Requests)); 929 string.Format("Total Hit Rate: {0}% for {1} requests", HitRate.ToString("0.00"), m_Requests));
918 } 930 }
919 931
920 outputLines.Add( 932 outputLines.Add(
@@ -1019,17 +1031,27 @@ namespace OpenSim.Region.CoreModules.Asset
1019 break; 1031 break;
1020 1032
1021 case "assets": 1033 case "assets":
1022 con.Output("Ensuring assets are cached for all scenes."); 1034 lock(timerLock)
1035 {
1036 if(m_cleanupRunning)
1037 {
1038 con.OutputFormat("FloatSam assets check already running");
1039 return;
1040 }
1041 m_cleanupRunning = true;
1042 }
1043
1044 con.Output("FloatSam Ensuring assets are cached for all scenes.");
1023 1045
1024 WorkManager.RunInThread(delegate 1046 WorkManager.RunInThread(delegate
1025 { 1047 {
1026 bool wasRunning= false; 1048 bool wasRunning= false;
1027 lock(timerLock) 1049 lock(timerLock)
1028 { 1050 {
1029 if(m_Running) 1051 if(m_timerRunning)
1030 { 1052 {
1031 m_CacheCleanTimer.Stop(); 1053 m_CacheCleanTimer.Stop();
1032 m_Running = false; 1054 m_timerRunning = false;
1033 wasRunning = true; 1055 wasRunning = true;
1034 Thread.Sleep(100); 1056 Thread.Sleep(100);
1035 } 1057 }
@@ -1041,8 +1063,9 @@ namespace OpenSim.Region.CoreModules.Asset
1041 if(wasRunning) 1063 if(wasRunning)
1042 { 1064 {
1043 m_CacheCleanTimer.Start(); 1065 m_CacheCleanTimer.Start();
1044 m_Running = true; 1066 m_timerRunning = true;
1045 } 1067 }
1068 m_cleanupRunning = false;
1046 } 1069 }
1047 con.OutputFormat("Completed check with {0} assets.", assetReferenceTotal); 1070 con.OutputFormat("Completed check with {0} assets.", assetReferenceTotal);
1048 }, null, "TouchAllSceneAssets"); 1071 }, null, "TouchAllSceneAssets");
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
index d232d82..3f7a8ee 100644
--- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
@@ -897,20 +897,36 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles
897 else 897 else
898 { 898 {
899 // we have a proxy on map 899 // we have a proxy on map
900 // this is a fail on large regions 900 ulong oriHandle;
901 uint gtmp = (uint)globalPos.X >> 8; 901 uint oriX;
902 globalPos.X -= (gtmp << 8); 902 uint oriY;
903 globalPos.X += target.RegionLocX; 903 if(Util.ParseFakeParcelID(pick.ParcelId, out oriHandle, out oriX, out oriY))
904 904 {
905 gtmp = (uint)globalPos.Y >> 8; 905 pick.ParcelId = Util.BuildFakeParcelID(target.RegionHandle, oriX, oriY);
906 globalPos.Y -= (gtmp << 8); 906 globalPos.X = target.RegionLocX + oriX;
907 globalPos.Y += target.RegionLocY; 907 globalPos.Y = target.RegionLocY + oriY;
908 pick.GlobalPos = globalPos.ToString();
909 }
910 else
911 {
912 // this is a fail on large regions
913 uint gtmp = (uint)globalPos.X >> 8;
914 globalPos.X -= (gtmp << 8);
915
916 gtmp = (uint)globalPos.Y >> 8;
917 globalPos.Y -= (gtmp << 8);
918
919 pick.ParcelId = Util.BuildFakeParcelID(target.RegionHandle, (uint)globalPos.X, (uint)globalPos.Y);
920
921 globalPos.X += target.RegionLocX;
922 globalPos.Y += target.RegionLocY;
923 pick.GlobalPos = globalPos.ToString();
924 }
908 } 925 }
909 } 926 }
910 927
911 m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString()); 928 m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString());
912 929
913 pick.GlobalPos = globalPos.ToString();
914 lock(m_profilesCache) 930 lock(m_profilesCache)
915 { 931 {
916 if(!m_profilesCache.TryGetValue(targetID, out uce) || uce == null) 932 if(!m_profilesCache.TryGetValue(targetID, out uce) || uce == null)
@@ -1331,17 +1347,36 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles
1331 if(uce.props != null) 1347 if(uce.props != null)
1332 { 1348 {
1333 props = uce.props; 1349 props = uce.props;
1350 uint cflags = uce.flags;
1351 // if on same region force online
1352 if(p != null && !p.IsDeleted)
1353 cflags |= 0x10;
1354
1334 remoteClient.SendAvatarProperties(props.UserId, props.AboutText, 1355 remoteClient.SendAvatarProperties(props.UserId, props.AboutText,
1335 uce.born, uce.membershipType , props.FirstLifeText, uce.flags, 1356 uce.born, uce.membershipType , props.FirstLifeText, cflags,
1336 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); 1357 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId);
1337 1358
1338
1339 remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, 1359 remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask,
1340 props.WantToText, (uint)props.SkillsMask, 1360 props.WantToText, (uint)props.SkillsMask,
1341 props.SkillsText, props.Language); 1361 props.SkillsText, props.Language);
1342 return; 1362 return;
1363 }
1364 else
1365 {
1366 if(uce.ClientsWaitingProps == null)
1367 uce.ClientsWaitingProps = new HashSet<IClientAPI>();
1368 else if(uce.ClientsWaitingProps.Contains(remoteClient))
1369 return;
1370 uce.ClientsWaitingProps.Add(remoteClient);
1343 } 1371 }
1344 } 1372 }
1373 else
1374 {
1375 uce = new UserProfileCacheEntry();
1376 uce.ClientsWaitingProps = new HashSet<IClientAPI>();
1377 uce.ClientsWaitingProps.Add(remoteClient);
1378 m_profilesCache.AddOrUpdate(avatarID, uce, PROFILECACHEEXPIRE);
1379 }
1345 } 1380 }
1346 1381
1347 string serverURI = string.Empty; 1382 string serverURI = string.Empty;
@@ -1402,14 +1437,11 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles
1402 { 1437 {
1403 props.AboutText ="Profile not available at this time. User may still be unknown to this grid"; 1438 props.AboutText ="Profile not available at this time. User may still be unknown to this grid";
1404 } 1439 }
1405
1406 // if on same region force online
1407 if(p != null && !p.IsDeleted)
1408 flags |= 0x10;
1409 1440
1410 if(!m_allowUserProfileWebURLs) 1441 if(!m_allowUserProfileWebURLs)
1411 props.WebUrl =""; 1442 props.WebUrl ="";
1412 1443
1444 HashSet<IClientAPI> clients;
1413 lock(m_profilesCache) 1445 lock(m_profilesCache)
1414 { 1446 {
1415 if(!m_profilesCache.TryGetValue(props.UserId, out uce) || uce == null) 1447 if(!m_profilesCache.TryGetValue(props.UserId, out uce) || uce == null)
@@ -1418,15 +1450,39 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles
1418 uce.born = born; 1450 uce.born = born;
1419 uce.membershipType = membershipType; 1451 uce.membershipType = membershipType;
1420 uce.flags = flags; 1452 uce.flags = flags;
1421 1453 clients = uce.ClientsWaitingProps;
1454 uce.ClientsWaitingProps = null;
1422 m_profilesCache.AddOrUpdate(props.UserId, uce, PROFILECACHEEXPIRE); 1455 m_profilesCache.AddOrUpdate(props.UserId, uce, PROFILECACHEEXPIRE);
1423 } 1456 }
1424 1457
1425 remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, 1458 // if on same region force online
1459 if(p != null && !p.IsDeleted)
1460 flags |= 0x10;
1461
1462 if(clients == null)
1463 {
1464 remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags,
1426 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); 1465 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId);
1427 1466
1428 remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, (uint)props.SkillsMask, 1467 remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText,
1429 props.SkillsText, props.Language); 1468 (uint)props.SkillsMask, props.SkillsText, props.Language);
1469 }
1470 else
1471 {
1472 if(!clients.Contains(remoteClient))
1473 clients.Add(remoteClient);
1474 foreach(IClientAPI cli in clients)
1475 {
1476 if(!cli.IsActive)
1477 continue;
1478 cli.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags,
1479 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId);
1480
1481 cli.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText,
1482 (uint)props.SkillsMask, props.SkillsText, props.Language);
1483
1484 }
1485 }
1430 } 1486 }
1431 1487
1432 /// <summary> 1488 /// <summary>
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index bec5322..22bc49e 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -1880,8 +1880,9 @@ namespace OpenSim.Region.CoreModules.World.Land
1880 UUID.TryParse(id, out parcel); 1880 UUID.TryParse(id, out parcel);
1881 // assume we've got the parcelID we just computed in RemoteParcelRequest 1881 // assume we've got the parcelID we just computed in RemoteParcelRequest
1882 ExtendedLandData extLandData = new ExtendedLandData(); 1882 ExtendedLandData extLandData = new ExtendedLandData();
1883 Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, 1883 if(!Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle,
1884 out extLandData.X, out extLandData.Y); 1884 out extLandData.X, out extLandData.Y))
1885 return null;
1885 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: Got parcelinfo request for regionHandle {0}, x/y {1}/{2}", 1886 m_log.DebugFormat("[LAND MANAGEMENT MODULE]: Got parcelinfo request for regionHandle {0}, x/y {1}/{2}",
1886 extLandData.RegionHandle, extLandData.X, extLandData.Y); 1887 extLandData.RegionHandle, extLandData.X, extLandData.Y);
1887 1888
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 5638f01..ba5a46d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -310,7 +310,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
310 foreach (string id in ids) 310 foreach (string id in ids)
311 { 311 {
312 string current = id.Trim(); 312 string current = id.Trim();
313 if (current.ToUpper() == "PARCEL_GROUP_MEMBER" || current.ToUpper() == "PARCEL_OWNER" || current.ToUpper() == "ESTATE_MANAGER" || current.ToUpper() == "ESTATE_OWNER" || current.ToUpper() == "GRID_GOD") 313 if (current.ToUpper() == "PARCEL_GROUP_MEMBER" || current.ToUpper() == "PARCEL_OWNER" || current.ToUpper() == "ESTATE_MANAGER" || current.ToUpper() == "ESTATE_OWNER" || current.ToUpper() == "GOD" || current.ToUpper() == "GRID_GOD")
314 { 314 {
315 if (!perms.AllowedOwnerClasses.Contains(current)) 315 if (!perms.AllowedOwnerClasses.Contains(current))
316 perms.AllowedOwnerClasses.Add(current.ToUpper()); 316 perms.AllowedOwnerClasses.Add(current.ToUpper());
@@ -416,9 +416,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
416 } 416 }
417 417
418 //Only gods may use the function 418 //Only gods may use the function
419 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("GOD"))
420 {
421 if (World.Permissions.IsGod(ownerID))
422 {
423 return String.Empty;
424 }
425 }
426
427 //Only grid gods may use the function
419 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("GRID_GOD")) 428 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("GRID_GOD"))
420 { 429 {
421 if (World.Permissions.IsGridGod(ownerID)) 430 if (World.Permissions.IsGridGod(ownerID))
422 { 431 {
423 return String.Empty; 432 return String.Empty;
424 } 433 }
diff --git a/bin/config-include/FlotsamCache.ini.example b/bin/config-include/FlotsamCache.ini.example
index db8d4db..6666812 100644
--- a/bin/config-include/FlotsamCache.ini.example
+++ b/bin/config-include/FlotsamCache.ini.example
@@ -20,15 +20,20 @@
20 HitRateDisplay = 100 20 HitRateDisplay = 100
21 21
22 ; Set to false for no memory cache 22 ; Set to false for no memory cache
23 MemoryCacheEnabled = false 23 ; assets can be requested several times in short periods
24 ; so even a small memory cache is usefull
25 MemoryCacheEnabled = true
24 26
25 ; Set to false for no file cache 27 ; Set to false for no file cache
26 FileCacheEnabled = true 28 FileCacheEnabled = true
27 29
28 ; How long {in hours} to keep assets cached in memory, .5 == 30 minutes 30 ; How long {in hours} to keep assets cached in memory, .5 == 30 minutes
29 ; Optimization: for VPS or limited memory system installs set Timeout to .016 (1 minute) 31 ; even a few minutes may mean many assets loaded to memory, if not all.
30 ; increases performance without large memory impact 32 ; this is good if memory is not a problem.
31 MemoryCacheTimeout = 2 33 ; if memory is a problem then a few seconds may actually save same.
34 ; reducing duplications.
35 ; see hit rates with console comand: fcache status
36 MemoryCacheTimeout = .001 // 3.6s ie around 4s (1s resolution)
32 37
33 ; How long {in hours} to keep assets cached on disk, .5 == 30 minutes 38 ; How long {in hours} to keep assets cached on disk, .5 == 30 minutes
34 ; Specify 0 if you do not want your disk cache to expire 39 ; Specify 0 if you do not want your disk cache to expire
diff --git a/bin/config-include/osslEnable.ini b/bin/config-include/osslEnable.ini
index a064f09..b96688b 100644
--- a/bin/config-include/osslEnable.ini
+++ b/bin/config-include/osslEnable.ini
@@ -37,6 +37,8 @@
37 ; To enable for individuals or groups, set it to a comma separated list. This checks 37 ; To enable for individuals or groups, set it to a comma separated list. This checks
38 ; against the owner of the object containing the script. 38 ; against the owner of the object containing the script.
39 ; The comma separated entries in the list may be one of: 39 ; The comma separated entries in the list may be one of:
40 ; "GRID_GOD" -- enable for users with UserLevel >= 200
41 ; "GOD" -- enable for users with any type of god rights
40 ; "ESTATE_MANAGER" -- enable for estate manager 42 ; "ESTATE_MANAGER" -- enable for estate manager
41 ; "ESTATE_OWNER" -- enable for estate owner 43 ; "ESTATE_OWNER" -- enable for estate owner
42 ; "PARCEL_OWNER" -- enable for parcel owner 44 ; "PARCEL_OWNER" -- enable for parcel owner