Invalid format for Guid.Guid†[edit]
- ログイン時に Robost.exe がエラーを出して,ログインが取り消される.
- mcs/class/corlib/System/Guid.csの GuidParser (Mono) に src="" が渡されるのが原因
03:12:20 - [PRESENCE HANDLER]: Exception in method getagent: System.FormatException: Invalid format for Guid.Guid(string).
at System.Guid+GuidParser.ParseChar (Char c) [0x00000] in <filename unknown>:0
at System.Guid+GuidParser.ParseGuid2 () [0x00000] in <filename unknown>:0
at System.Guid+GuidParser.Parse () [0x00000] in <filename unknown>:0
at System.Guid..ctor (System.String g) [0x00000] in <filename unknown>:0
at MySql.Data.Types.MySqlGuid.MySql.Data.Types.IMySqlValue.ReadValue (MySql.Data.MySqlClient.MySqlPacket packet, Int64 length, Boolean nullVal) [0x00000] in <filename unknown>:0
at MySql.Data.MySqlClient.NativeDriver.ReadColumnValue (Int32 index, MySql.Data.MySqlClient.MySqlField field, IMySqlValue valObject) [0x00000] in <filename unknown>:0
at MySql.Data.MySqlClient.Driver.ReadColumnValue (Int32 index, MySql.Data.MySqlClient.MySqlField field, IMySqlValue value) [0x00000] in <filename unknown>:0
at MySql.Data.MySqlClient.ResultSet.ReadColumnData (Boolean outputParms) [0x00000] in <filename unknown>:0
at MySql.Data.MySqlClient.ResultSet.NextRow (CommandBehavior behavior) [0x00000] in <filename unknown>:0
at MySql.Data.MySqlClient.MySqlDataReader.Read () [0x00000] in <filename unknown>:0
at OpenSim.Data.MySQL.MySQLGenericTableHandler`1[T].DoQuery (MySql.Data.MySqlClient.MySqlCommand cmd) [0x00000] in <filename unknown>:0
at OpenSim.Data.MySQL.MySQLGenericTableHandler`1[T].Get (System.String[] fields, System.String[] keys) [0x00000] in <filename unknown>:0
at OpenSim.Data.MySQL.MySQLGenericTableHandler`1[T].Get (System.String field, System.String key) [0x00000] in <filename unknown>:0
at OpenSim.Data.MySQL.MySQLPresenceData.Get (UUID sessionID) [0x00000] in <filename unknown>:0
at OpenSim.Services.PresenceService.PresenceService.GetAgent (UUID sessionID) [0x00000] in <filename unknown>:0
at OpenSim.Server.Handlers.Presence.PresenceServerPostHandler.GetAgent (System.Collections.Generic.Dictionary`2 request) [0x00000] in <filename unknown>:0
at OpenSim.Server.Handlers.Presence.PresenceServerPostHandler.Handle (System.String path, System.IO.Stream requestData, OpenSim.Framework.Servers.HttpServer.OSHttpRequest httpRequest, OpenSim.Framework.Servers.HttpServer.OSHttpResponse httpResponse) [0x00000] in <filename unknown>:0
PresenceService.cs†[edit]
- OpenSim/Services/PresenceService/PresenceService.cs の LoginAgent()で Presenceテーブルに HomeRegionIDが設定されないのが原因.
- 対策としては,とりあえず ログイン時に Presenceテーブルの HomeRegionIDを "00000000-0000-0000-0000-000000000000" にする
public bool LoginAgent(string userID, UUID sessionID,
UUID secureSessionID)
{
PresenceData[] d = m_Database.Get("UserID", userID);
PresenceData data = new PresenceData();
data.UserID = userID;
data.RegionID = UUID.Zero;
data.SessionID = sessionID;
data.Data = new Dictionary<string, string>();
data.Data["SecureSessionID"] = secureSessionID.ToString();
+ // added by Fumi.Iseki
+ data.Data["HomeRegionID"] = UUID.Zero.ToString();
m_Database.Store(data);
m_log.DebugFormat("[PRESENCE SERVICE]: LoginAgent {0} with session {1} and ssession {2}",
userID, sessionID, secureSessionID);
return true;
}
- 本来は ホームの情報を GridUserレコードから引っ張って来るべきだが,PresenceのHomeRegionIDは現在はまだ未使用のよう (r12862)
参考:Presenceの HomeRegionIDを設定する関数例 (ポジション無し.インターフェイス,およびそれを継承している他のクラスにも実装の必要性あり)†[edit]
public bool SetHomeRegion(UUID sessionID, UUID homeRegionID)
{
PresenceData data = m_Database.Get(sessionID);
data.Data["HomeRegionID"] = homeRegionID.ToString();
m_Database.Store(data);
return true;
}
ログイン時の Presenceテーブルのレコード作成シーケンス†[edit]
- OpenSim/Services/LLLoginService/LLLoginService.cs
- success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession);
- OpenSim/Services/PresenceService/PresenceService.cs
- LoginAgent() で,Presence データベースのレコードを作成.ただし HomeRegionIDはnull (ParseGuidのエラーの原因)
- 追加項目: GridUserテーブルから HomeRegionIDを引っ張ってくる.または UUID.Zero を入れる.
OpenSim/Services/Interfaces/IPresenceService.cs を継承するクラス†[edit]
- OpenSim/Services/PresenceService/PresenceService.cs
- OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs
- OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs
- OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/RemotePresenceServiceConnector.cs
HomeRegionIDの設定†[edit]
- GridUserテーブルの HomeRegionIDは(ホーム変更時に)OpenSim/Services/UserAccountService/GridUserService.cs の SetHome()で設定される
- ↑これは OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs の SetHomeから呼び出される.