#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から呼び出される.



トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS