Fixed code in SyncDeLinkObject and HandleSyncDelinkObject. Delinking a few linked objects seems working.
parent
3676b5fbef
commit
a5ebd04d9d
|
@ -609,9 +609,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
return;
|
||||
}
|
||||
|
||||
//First, make sure the linked group has updated timestamp info for synchronization
|
||||
linkedGroup.BucketSyncInfoUpdate();
|
||||
|
||||
OSDMap data = new OSDMap();
|
||||
OSDMap encodedSOG = SceneObjectEncoder(linkedGroup);
|
||||
data["linkedGroup"] = encodedSOG;
|
||||
|
@ -669,17 +666,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
foreach (SceneObjectGroup afterGroup in afterDelinkGroups)
|
||||
{
|
||||
string groupTempID = "afterGroup" + groupNum;
|
||||
string sogxml = SceneObjectSerializer.ToXml2Format(afterGroup);
|
||||
data[groupTempID] = OSD.FromString(sogxml);
|
||||
//string sogxml = SceneObjectSerializer.ToXml2Format(afterGroup);
|
||||
//data[groupTempID] = OSD.FromString(sogxml);
|
||||
OSDMap encodedSOG = SceneObjectEncoder(afterGroup);
|
||||
data[groupTempID] = encodedSOG;
|
||||
groupNum++;
|
||||
}
|
||||
|
||||
//make sure the newly delinked objects have the updated timestamp information
|
||||
foreach (SceneObjectGroup sog in afterDelinkGroups)
|
||||
{
|
||||
sog.BucketSyncInfoUpdate();
|
||||
}
|
||||
|
||||
SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.DelinkObject, OSDParser.SerializeJsonString(data));
|
||||
SendDelinkObjectToRelevantSyncConnectors(m_actorID, beforeDelinkGroups, rsm);
|
||||
}
|
||||
|
@ -2420,7 +2413,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
OSDMap encodedSOG = (OSDMap)data["linkedGroup"];
|
||||
SceneObjectGroup linkedGroup;
|
||||
Dictionary<UUID, PrimSyncInfo> primsSyncInfo;
|
||||
|
||||
SceneObjectDecoder(encodedSOG, out linkedGroup, out primsSyncInfo);
|
||||
|
||||
if (linkedGroup == null)
|
||||
|
@ -2433,6 +2425,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
int partCount = data["partCount"].AsInteger();
|
||||
List<UUID> childrenIDs = new List<UUID>();
|
||||
|
||||
for (int i = 0; i < partCount; i++)
|
||||
{
|
||||
string partTempID = "part" + i;
|
||||
childrenIDs.Add(data[partTempID].AsUUID());
|
||||
}
|
||||
|
||||
//if this is a relay node, forwards the event
|
||||
if (m_isSyncRelay)
|
||||
|
@ -2441,12 +2438,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
SendSpecialObjectUpdateToRelevantSyncConnectors(senderActorID, linkedGroup, msg);
|
||||
}
|
||||
|
||||
for (int i = 0; i < partCount; i++)
|
||||
{
|
||||
string partTempID = "part" + i;
|
||||
childrenIDs.Add(data[partTempID].AsUUID());
|
||||
}
|
||||
|
||||
//TEMP SYNC DEBUG
|
||||
//m_log.DebugFormat("{0}: received LinkObject from {1}", LogHeader, senderActorID);
|
||||
|
||||
|
@ -2472,8 +2463,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
|
||||
private void HandleSyncDelinkObject(SymmetricSyncMessage msg, string senderActorID)
|
||||
{
|
||||
|
||||
|
||||
OSDMap data = DeserializeMessage(msg);
|
||||
if (data == null)
|
||||
{
|
||||
|
@ -2485,6 +2474,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
List<UUID> delinkPrimIDs = new List<UUID>();
|
||||
List<UUID> beforeDelinkGroupIDs = new List<UUID>();
|
||||
List<SceneObjectGroup> incomingAfterDelinkGroups = new List<SceneObjectGroup>();
|
||||
List<Dictionary<UUID, PrimSyncInfo>> incomingPrimSyncInfo = new List<Dictionary<UUID, PrimSyncInfo>>();
|
||||
|
||||
int partCount = data["partCount"].AsInteger();
|
||||
for (int i = 0; i < partCount; i++)
|
||||
|
@ -2508,10 +2498,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
for (int i = 0; i < afterGroupsCount; i++)
|
||||
{
|
||||
string groupTempID = "afterGroup" + i;
|
||||
string sogxml = data[groupTempID].AsString();
|
||||
//SceneObjectGroup afterGroup = SceneObjectSerializer.FromXml2Format(sogxml);
|
||||
SceneObjectGroup afterGroup = DecodeSceneObjectGroup(sogxml);
|
||||
//string sogxml = data[groupTempID].AsString();
|
||||
SceneObjectGroup afterGroup;
|
||||
OSDMap encodedSOG = (OSDMap)data[groupTempID];
|
||||
Dictionary<UUID, PrimSyncInfo> primsSyncInfo;
|
||||
SceneObjectDecoder(encodedSOG, out afterGroup, out primsSyncInfo);
|
||||
incomingAfterDelinkGroups.Add(afterGroup);
|
||||
incomingPrimSyncInfo.Add(primsSyncInfo);
|
||||
}
|
||||
|
||||
//if this is a relay node, forwards the event
|
||||
|
@ -2528,6 +2521,26 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
|
||||
m_scene.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups);
|
||||
|
||||
//Sync properties
|
||||
//Update properties, for each prim in each deLinked-Object
|
||||
foreach (Dictionary<UUID, PrimSyncInfo> primsSyncInfo in incomingPrimSyncInfo)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, PrimSyncInfo> inPrimSyncInfo in primsSyncInfo)
|
||||
{
|
||||
UUID primUUID = inPrimSyncInfo.Key;
|
||||
PrimSyncInfo updatedPrimSyncInfo = inPrimSyncInfo.Value;
|
||||
|
||||
SceneObjectPart part = m_scene.GetSceneObjectPart(primUUID);
|
||||
if (part == null)
|
||||
{
|
||||
m_log.WarnFormat("{0}: HandleSyncDelinkObject, prim {1} not in local Scene Graph after DelinkObjectsBySync is called", LogHeader, primUUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_primSyncInfoManager.UpdatePrimSyncInfoBySync(part, updatedPrimSyncInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -846,6 +846,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
* */
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delink objects after receiving DelinkObject sync message.
|
||||
/// Assumption: the actor whichever initiates the DelinkObject
|
||||
/// operation has already done premission checking.
|
||||
/// </summary>
|
||||
/// <param name="delinkPrimIDs"></param>
|
||||
/// <param name="beforeDelinkGroupIDs"></param>
|
||||
/// <param name="incomingAfterDelinkGroups"></param>
|
||||
public void DelinkObjectsBySync(List<UUID> delinkPrimIDs, List<UUID> beforeDelinkGroupIDs, List<SceneObjectGroup> incomingAfterDelinkGroups)
|
||||
{
|
||||
m_sceneGraph.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups);
|
||||
|
|
|
@ -1643,7 +1643,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers).
|
||||
//But timestamp won't be changed, so that when other actors get the update, they's simple ignore the updates since they already get them
|
||||
//via the LinkObject message sent above.
|
||||
parentGroup.ScheduleGroupForFullUpdate_SyncInfoUnchanged();
|
||||
parentGroup.ScheduleGroupForFullUpdate(null);
|
||||
|
||||
//end of DSG SYNC
|
||||
|
||||
|
@ -1782,19 +1782,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
afterDelinkGroups.Add(g);
|
||||
}
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
//DSG SYNC
|
||||
//Send out DelinkObject message to other actors to sychronize their object list
|
||||
if (m_parentScene.RegionSyncModule != null)
|
||||
{
|
||||
m_parentScene.RegionSyncModule.SendDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups);
|
||||
m_parentScene.RegionSyncModule.SyncDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups);
|
||||
}
|
||||
//Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers).
|
||||
//But timestamp won't be changed, so that when other actors get the update, they's simple ignore the updates since they already get them
|
||||
//Schedule updates as in legacy OpenSim code, to send updates
|
||||
//to viewers connected to this actor (at least needed for client managers).
|
||||
foreach (SceneObjectGroup sog in afterDelinkGroups)
|
||||
{
|
||||
sog.ScheduleGroupForFullUpdate_SyncInfoUnchanged();
|
||||
sog.ScheduleGroupForFullUpdate(null);
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
//end of DSG SYNC
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
@ -2174,7 +2174,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//NewObject is sent via a specific sync message, not through updates;
|
||||
//hence not passing any property list here in calling
|
||||
//ScheduleGroupForFullUpdate().
|
||||
sceneObject.ScheduleGroupForFullUpdate_SyncInfoUnchanged();
|
||||
sceneObject.ScheduleGroupForFullUpdate(null);
|
||||
//end of DSG SYNC,
|
||||
|
||||
Entities.Add(sceneObject);
|
||||
|
@ -2283,7 +2283,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
parentGroup.TriggerScriptChangedEvent(Changed.LINK);
|
||||
parentGroup.HasGroupChanged = true;
|
||||
//Do not change the timestamp and actorID values
|
||||
parentGroup.ScheduleGroupForFullUpdate_SyncInfoUnchanged();
|
||||
parentGroup.ScheduleGroupForFullUpdate(null);
|
||||
|
||||
}
|
||||
finally
|
||||
|
@ -2302,6 +2302,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void DelinkObjectsBySync(List<UUID> delinkPrimIDs, List<UUID> beforeDelinkGroupIDs, List<SceneObjectGroup> incomingAfterDelinkGroups)
|
||||
{
|
||||
Dictionary<UUID, SceneObjectGroup> localBeforeDelinkGroups = new Dictionary<UUID, SceneObjectGroup>();
|
||||
List<SceneObjectGroup> localAfterDelinkGroups = new List<SceneObjectGroup>();
|
||||
Dictionary<UUID, SceneObjectPart> delinkPrims = new Dictionary<UUID, SceneObjectPart>();
|
||||
bool beforeStateConsistent = true;
|
||||
bool afterStateConsistent = true;
|
||||
|
@ -2383,9 +2384,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.Warn("DelinkObjectsBySync: before-delink state not consistent in local copy and the incoming copy. Return without further operations.");
|
||||
}else{
|
||||
//Next, apply the delink operation locally.
|
||||
List<SceneObjectGroup> localAfterDelinkGroups = DelinkObjectsBySync(new List<SceneObjectPart>(delinkPrims.Values));
|
||||
localAfterDelinkGroups = DelinkObjectsBySync(new List<SceneObjectPart>(delinkPrims.Values));
|
||||
|
||||
|
||||
//Check if local after-state agrees with that in the remote copy, and update the groups' properties
|
||||
if (localAfterDelinkGroups.Count != incomingAfterDelinkGroups.Count)
|
||||
{
|
||||
|
@ -2407,11 +2407,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
else
|
||||
{
|
||||
localAfterGroup.UpdateObjectGroupBySync(incomingAfterDelinkGroupsDictionary[localAfterGroup.UUID]);
|
||||
//localAfterGroup.UpdateObjectGroupBySync(incomingAfterDelinkGroupsDictionary[localAfterGroup.UUID]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (SceneObjectGroup sog in localAfterDelinkGroups)
|
||||
{
|
||||
sog.ScheduleGroupForFullUpdate(null);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
@ -2423,7 +2428,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
//Similar to DelinkObjects(), w/o triggering any ScheduleFullUpdate(),
|
||||
//Similar to DelinkObjects(), but calling DelinkFromGroupBySync instead
|
||||
private List<SceneObjectGroup> DelinkObjectsBySync(List<SceneObjectPart> prims)
|
||||
{
|
||||
//!!!Caller of this function should already lock on m_updateLock, so no locking here !!!
|
||||
|
|
Loading…
Reference in New Issue