ページ内コンテンツ
Invalid format for Guid.Guid 
- ログイン時に 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
Mono 
- エラー自体は Monoのエラー
- mcs/class/corlib/System/Guid.csの GuidParserで src="" が渡されるのが原因
- つまり,GUIDの検査で NULL文字 "" が渡されて,例外を起こす.
- ParseGuid1() で System.IndexOutOfRangeException を起こし,キャッチされて ParseGuid2() に渡され System.FormatException: Invalid format for Guid.Guid(string) を起こす,
- 本来は OpenSimのバグだが,GuidParserのコンストラクタで,以下のようにしてしまうのも一つの手
public GuidParser (string src) { if (src=="") { //System.Console.WriteLine("====> System.GuidParser: Inputed src is null"); src = "00000000-0000-0000-0000-000000000000"; } _src = src; Reset (); }
PresenceService.cs 
- 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を設定する関数例 (ポジション無し.インターフェイス,およびそれを継承している他のクラスにも実装の必要性あり) 
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テーブルのレコード作成シーケンス 
- 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 を継承するクラス 
- 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
Counter: 2291,
today: 2,
yesterday: 0
最終更新: 2010-05-23 (日) 01:05:19 (JST) (5380d) by admin