diff options
Diffstat (limited to 'OpenSim/Services/Connectors/Inventory')
-rw-r--r-- | OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs index 7cecd93..dcf25ad 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs | |||
@@ -54,6 +54,8 @@ namespace OpenSim.Services.Connectors | |||
54 | 54 | ||
55 | private string m_ServerURI = String.Empty; | 55 | private string m_ServerURI = String.Empty; |
56 | 56 | ||
57 | private int m_maxRetries = 0; | ||
58 | |||
57 | /// <summary> | 59 | /// <summary> |
58 | /// Timeout for remote requests. | 60 | /// Timeout for remote requests. |
59 | /// </summary> | 61 | /// </summary> |
@@ -61,6 +63,7 @@ namespace OpenSim.Services.Connectors | |||
61 | /// In this case, -1 is default timeout (100 seconds), not infinite. | 63 | /// In this case, -1 is default timeout (100 seconds), not infinite. |
62 | /// </remarks> | 64 | /// </remarks> |
63 | private int m_requestTimeoutSecs = -1; | 65 | private int m_requestTimeoutSecs = -1; |
66 | private string m_configName = "InventoryService"; | ||
64 | 67 | ||
65 | private const double CACHE_EXPIRATION_SECONDS = 20.0; | 68 | private const double CACHE_EXPIRATION_SECONDS = 20.0; |
66 | private static ExpiringCache<UUID, InventoryItemBase> m_ItemCache = new ExpiringCache<UUID,InventoryItemBase>(); | 69 | private static ExpiringCache<UUID, InventoryItemBase> m_ItemCache = new ExpiringCache<UUID,InventoryItemBase>(); |
@@ -74,6 +77,13 @@ namespace OpenSim.Services.Connectors | |||
74 | m_ServerURI = serverURI.TrimEnd('/'); | 77 | m_ServerURI = serverURI.TrimEnd('/'); |
75 | } | 78 | } |
76 | 79 | ||
80 | public XInventoryServicesConnector(IConfigSource source, string configName) | ||
81 | : base(source, configName) | ||
82 | { | ||
83 | m_configName = configName; | ||
84 | Initialise(source); | ||
85 | } | ||
86 | |||
77 | public XInventoryServicesConnector(IConfigSource source) | 87 | public XInventoryServicesConnector(IConfigSource source) |
78 | : base(source, "InventoryService") | 88 | : base(source, "InventoryService") |
79 | { | 89 | { |
@@ -82,10 +92,10 @@ namespace OpenSim.Services.Connectors | |||
82 | 92 | ||
83 | public virtual void Initialise(IConfigSource source) | 93 | public virtual void Initialise(IConfigSource source) |
84 | { | 94 | { |
85 | IConfig config = source.Configs["InventoryService"]; | 95 | IConfig config = source.Configs[m_configName]; |
86 | if (config == null) | 96 | if (config == null) |
87 | { | 97 | { |
88 | m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); | 98 | m_log.ErrorFormat("[INVENTORY CONNECTOR]: {0} missing from OpenSim.ini", m_configName); |
89 | throw new Exception("Inventory connector init error"); | 99 | throw new Exception("Inventory connector init error"); |
90 | } | 100 | } |
91 | 101 | ||
@@ -100,16 +110,17 @@ namespace OpenSim.Services.Connectors | |||
100 | m_ServerURI = serviceURI; | 110 | m_ServerURI = serviceURI; |
101 | 111 | ||
102 | m_requestTimeoutSecs = config.GetInt("RemoteRequestTimeout", m_requestTimeoutSecs); | 112 | m_requestTimeoutSecs = config.GetInt("RemoteRequestTimeout", m_requestTimeoutSecs); |
113 | m_maxRetries = config.GetInt("MaxRetries", m_maxRetries); | ||
103 | 114 | ||
104 | StatsManager.RegisterStat( | 115 | StatsManager.RegisterStat( |
105 | new Stat( | 116 | new Stat( |
106 | "RequestsMade", | 117 | "RequestsMade", |
107 | "Requests made", | 118 | "Requests made", |
108 | "Number of requests made to the remove inventory service", | 119 | "Number of requests made to the remove inventory service", |
109 | "requests", | 120 | "requests", |
110 | "inventory", | 121 | "inventory", |
111 | serviceURI, | 122 | serviceURI, |
112 | StatType.Pull, | 123 | StatType.Pull, |
113 | MeasuresOfInterest.AverageChangeOverTime, | 124 | MeasuresOfInterest.AverageChangeOverTime, |
114 | s => s.Value = RequestsMade, | 125 | s => s.Value = RequestsMade, |
115 | StatVerbosity.Debug)); | 126 | StatVerbosity.Debug)); |
@@ -240,7 +251,7 @@ namespace OpenSim.Services.Connectors | |||
240 | 251 | ||
241 | return inventory; | 252 | return inventory; |
242 | } | 253 | } |
243 | 254 | ||
244 | public virtual InventoryCollection[] GetMultipleFoldersContent(UUID principalID, UUID[] folderIDs) | 255 | public virtual InventoryCollection[] GetMultipleFoldersContent(UUID principalID, UUID[] folderIDs) |
245 | { | 256 | { |
246 | InventoryCollection[] inventoryArr = new InventoryCollection[folderIDs.Length]; | 257 | InventoryCollection[] inventoryArr = new InventoryCollection[folderIDs.Length]; |
@@ -520,10 +531,10 @@ namespace OpenSim.Services.Connectors | |||
520 | return CheckReturn(ret); | 531 | return CheckReturn(ret); |
521 | } | 532 | } |
522 | 533 | ||
523 | public InventoryItemBase GetItem(InventoryItemBase item) | 534 | public InventoryItemBase GetItem(UUID principalID, UUID itemID) |
524 | { | 535 | { |
525 | InventoryItemBase retrieved = null; | 536 | InventoryItemBase retrieved = null; |
526 | if (m_ItemCache.TryGetValue(item.ID, out retrieved)) | 537 | if (m_ItemCache.TryGetValue(itemID, out retrieved)) |
527 | { | 538 | { |
528 | return retrieved; | 539 | return retrieved; |
529 | } | 540 | } |
@@ -532,7 +543,8 @@ namespace OpenSim.Services.Connectors | |||
532 | { | 543 | { |
533 | Dictionary<string, object> ret = MakeRequest("GETITEM", | 544 | Dictionary<string, object> ret = MakeRequest("GETITEM", |
534 | new Dictionary<string, object> { | 545 | new Dictionary<string, object> { |
535 | { "ID", item.ID.ToString() } | 546 | { "ID", itemID.ToString() }, |
547 | { "PRINCIPAL", principalID.ToString() } | ||
536 | }); | 548 | }); |
537 | 549 | ||
538 | if (!CheckReturn(ret)) | 550 | if (!CheckReturn(ret)) |
@@ -545,7 +557,7 @@ namespace OpenSim.Services.Connectors | |||
545 | m_log.Error("[XINVENTORY SERVICES CONNECTOR]: Exception in GetItem: ", e); | 557 | m_log.Error("[XINVENTORY SERVICES CONNECTOR]: Exception in GetItem: ", e); |
546 | } | 558 | } |
547 | 559 | ||
548 | m_ItemCache.AddOrUpdate(item.ID, retrieved, CACHE_EXPIRATION_SECONDS); | 560 | m_ItemCache.AddOrUpdate(itemID, retrieved, CACHE_EXPIRATION_SECONDS); |
549 | 561 | ||
550 | return retrieved; | 562 | return retrieved; |
551 | } | 563 | } |
@@ -559,6 +571,7 @@ namespace OpenSim.Services.Connectors | |||
559 | List<UUID> pending = new List<UUID>(); | 571 | List<UUID> pending = new List<UUID>(); |
560 | InventoryItemBase item = null; | 572 | InventoryItemBase item = null; |
561 | int i = 0; | 573 | int i = 0; |
574 | |||
562 | foreach (UUID id in itemIDs) | 575 | foreach (UUID id in itemIDs) |
563 | { | 576 | { |
564 | if (m_ItemCache.TryGetValue(id, out item)) | 577 | if (m_ItemCache.TryGetValue(id, out item)) |
@@ -612,13 +625,14 @@ namespace OpenSim.Services.Connectors | |||
612 | return itemArr; | 625 | return itemArr; |
613 | } | 626 | } |
614 | 627 | ||
615 | public InventoryFolderBase GetFolder(InventoryFolderBase folder) | 628 | public InventoryFolderBase GetFolder(UUID principalID, UUID folderID) |
616 | { | 629 | { |
617 | try | 630 | try |
618 | { | 631 | { |
619 | Dictionary<string, object> ret = MakeRequest("GETFOLDER", | 632 | Dictionary<string, object> ret = MakeRequest("GETFOLDER", |
620 | new Dictionary<string, object> { | 633 | new Dictionary<string, object> { |
621 | { "ID", folder.ID.ToString() } | 634 | { "ID", folderID.ToString() }, |
635 | { "PRINCIPAL", principalID.ToString() } | ||
622 | }); | 636 | }); |
623 | 637 | ||
624 | if (!CheckReturn(ret)) | 638 | if (!CheckReturn(ret)) |
@@ -660,7 +674,7 @@ namespace OpenSim.Services.Connectors | |||
660 | { "ASSET", assetID.ToString() } | 674 | { "ASSET", assetID.ToString() } |
661 | }); | 675 | }); |
662 | 676 | ||
663 | // We cannot use CheckReturn() here because valid values for RESULT are "false" (in the case of request failure) or an int | 677 | // We cannot use CheckReturn() here because valid values for RESULT are "false" (in the case of request failure) or an int |
664 | if (ret == null) | 678 | if (ret == null) |
665 | return 0; | 679 | return 0; |
666 | 680 | ||
@@ -697,11 +711,21 @@ namespace OpenSim.Services.Connectors | |||
697 | 711 | ||
698 | RequestsMade++; | 712 | RequestsMade++; |
699 | 713 | ||
700 | string reply | 714 | string reply = String.Empty; |
701 | = SynchronousRestFormsRequester.MakeRequest( | 715 | int retries = 0; |
716 | |||
717 | do | ||
718 | { | ||
719 | reply = SynchronousRestFormsRequester.MakeRequest( | ||
702 | "POST", m_ServerURI + "/xinventory", | 720 | "POST", m_ServerURI + "/xinventory", |
703 | ServerUtils.BuildQueryString(sendData), m_requestTimeoutSecs, m_Auth); | 721 | ServerUtils.BuildQueryString(sendData), m_requestTimeoutSecs, m_Auth); |
704 | 722 | ||
723 | if (reply != String.Empty) | ||
724 | break; | ||
725 | |||
726 | retries++; | ||
727 | } while (retries <= m_maxRetries); | ||
728 | |||
705 | Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse( | 729 | Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse( |
706 | reply); | 730 | reply); |
707 | 731 | ||