public override bool SetupRequestToProperDatabase(RequestManager rm) { var tenantId = DatabaseName; if (string.IsNullOrWhiteSpace(tenantId) || tenantId == "<system>") { landlord.LastRecentlyUsed.AddOrUpdate("System", SystemTime.UtcNow, (s, time) => SystemTime.UtcNow); var args = new BeforeRequestWebApiEventArgs { Controller = this, IgnoreRequest = false, TenantId = "System", Database = landlord.SystemDatabase }; rm.OnBeforeRequest(args); if (args.IgnoreRequest) return false; return true; } Task<DocumentDatabase> resourceStoreTask; bool hasDb; try { hasDb = landlord.TryGetOrCreateResourceStore(tenantId, out resourceStoreTask); } catch (Exception e) { var msg = "Could not open database named: " + tenantId; Logger.WarnException(msg, e); throw new HttpException(503, msg, e); } if (hasDb) { try { if (resourceStoreTask.Wait(TimeSpan.FromSeconds(30)) == false) { var msg = "The database " + tenantId + " is currently being loaded, but after 30 seconds, this request has been aborted. Please try again later, database loading continues."; Logger.Warn(msg); throw new TimeoutException(msg); } var args = new BeforeRequestWebApiEventArgs() { Controller = this, IgnoreRequest = false, TenantId = tenantId, Database = resourceStoreTask.Result }; rm.OnBeforeRequest(args); if (args.IgnoreRequest) return false; } catch (Exception e) { string exceptionMessage = e.Message; var aggregateException = e as AggregateException; if (aggregateException != null) { exceptionMessage = aggregateException.ExtractSingleInnerException().Message; } var msg = "Could not open database named: " + tenantId + Environment.NewLine + exceptionMessage; Logger.WarnException(msg, e); throw new HttpException(503, msg, e); } landlord.LastRecentlyUsed.AddOrUpdate(tenantId, SystemTime.UtcNow, (s, time) => SystemTime.UtcNow); } else { var msg = "Could not find a database named: " + tenantId; Logger.Warn(msg); throw new HttpException(503, msg); } return true; }
public override bool SetupRequestToProperDatabase(RequestManager rm) { var tenantId = CountersName; if (string.IsNullOrWhiteSpace(tenantId)) { throw new HttpException(503, "Could not find a counter with no name"); } Task<CounterStorage> resourceStoreTask; bool hasDb; try { hasDb = landlord.TryGetOrCreateResourceStore(tenantId, out resourceStoreTask); } catch (Exception e) { var msg = "Could open counter named: " + tenantId; Logger.WarnException(msg, e); throw new HttpException(503, msg, e); } if (hasDb) { try { if (resourceStoreTask.Wait(TimeSpan.FromSeconds(30)) == false) { var msg = "The counter " + tenantId + " is currently being loaded, but after 30 seconds, this request has been aborted. Please try again later, file system loading continues."; Logger.Warn(msg); throw new HttpException(503, msg); } var args = new BeforeRequestWebApiEventArgs { Controller = this, IgnoreRequest = false, TenantId = tenantId, Counters = resourceStoreTask.Result }; rm.OnBeforeRequest(args); if (args.IgnoreRequest) return false; } catch (Exception e) { var msg = "Could open counters named: " + tenantId; Logger.WarnException(msg, e); throw new HttpException(503, msg, e); } landlord.LastRecentlyUsed.AddOrUpdate(tenantId, SystemTime.UtcNow, (s, time) => SystemTime.UtcNow); } else { var msg = "Could not find a counter named: " + tenantId; Logger.Warn(msg); throw new HttpException(503, msg); } return true; }
public override bool SetupRequestToProperDatabase(RequestManager rm) { var tenantId = this.DatabaseName; var landlord = this.DatabasesLandlord; if (string.IsNullOrWhiteSpace(tenantId) || tenantId == "<system>") { landlord.LastRecentlyUsed.AddOrUpdate("System", SystemTime.UtcNow, (s, time) => SystemTime.UtcNow); var args = new BeforeRequestWebApiEventArgs { Controller = this, IgnoreRequest = false, TenantId = "System", Database = landlord.SystemDatabase }; rm.OnBeforeRequest(args); if (args.IgnoreRequest) return false; return true; } Task<DocumentDatabase> resourceStoreTask; bool hasDb; try { hasDb = landlord.TryGetOrCreateResourceStore(tenantId, out resourceStoreTask); } catch (Exception e) { var msg = "Could not open database named: " + tenantId + " " + e.Message; Logger.WarnException(msg, e); throw new HttpException(503, msg, e); } if (hasDb) { try { int TimeToWaitForDatabaseToLoad = MaxSecondsForTaskToWaitForDatabaseToLoad; if (resourceStoreTask.IsCompleted == false && resourceStoreTask.IsFaulted == false) { if (MaxNumberOfThreadsForDatabaseToLoad.Wait(0) == false) { var msg = string.Format("The database {0} is currently being loaded, but there are too many requests waiting for database load. Please try again later, database loading continues.", tenantId); Logger.Warn(msg); throw new TimeoutException(msg); } try { if (resourceStoreTask.Wait(TimeSpan.FromSeconds(TimeToWaitForDatabaseToLoad)) == false) { var msg = string.Format("The database {0} is currently being loaded, but after {1} seconds, this request has been aborted. Please try again later, database loading continues.", tenantId, TimeToWaitForDatabaseToLoad); Logger.Warn(msg); throw new TimeoutException(msg); } } finally { MaxNumberOfThreadsForDatabaseToLoad.Release(); } } var args = new BeforeRequestWebApiEventArgs() { Controller = this, IgnoreRequest = false, TenantId = tenantId, Database = resourceStoreTask.Result }; rm.OnBeforeRequest(args); if (args.IgnoreRequest) return false; } catch (Exception e) { var msg = "Could not open database named: " + tenantId + Environment.NewLine + e; Logger.WarnException(msg, e); throw new HttpException(503, msg,e); } landlord.LastRecentlyUsed.AddOrUpdate(tenantId, SystemTime.UtcNow, (s, time) => SystemTime.UtcNow); } else { var msg = "Could not find a database named: " + tenantId; Logger.Warn(msg); throw new HttpException(503, msg); } return true; }