#author("2024-09-02T04:15:52+00:00","default:iseki","iseki") *** Invalid format for Guid.Guid [#re2c7dd6] - ログイン時に Robost.exe がエラーを出して,ログインが取り消される. - mcs/class/corlib/System/Guid.csの GuidParser (Mono) に src="" が渡されるのが原因 *** エラーメッセージ [#ma6a3d99] 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 [#i5077b7b] - エラー自体は 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 [#mc801b2e] - 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) *** 蛇足 [#z9ca90bb] **** 参考:Presenceの HomeRegionIDを設定する関数例 (ポジション無し.インターフェイス,およびそれを継承している他のクラスにも実装の必要性あり) [#tc1b64e3] 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テーブルのレコード作成シーケンス [#m5efb2ae] - 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 を継承するクラス [#p832cab3] -- 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の設定 [#x7adb4f5] - GridUserテーブルの HomeRegionIDは(ホーム変更時に)OpenSim/Services/UserAccountService/GridUserService.cs の SetHome()で設定される - ↑これは OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs の SetHomeから呼び出される.