2012-04-29 12 views
0

ここでは奇妙な状況が続きます。私たちはNuGetギャラリーのローカルインストールをセットアップしました(同じコードはhttp://Nuget.orgです)。 IISとDBは同じボックスにあります。 IIS Appプールは、ボックスのローカル管理者であるドメインユーザーの下で実行するように構成されており、「サービスとしてログオンする権利」の権利を持ちます。私はIISアプリケーションプールを切り替える興味深いことに場合(正常にログインした後に)誰かがしようとすると、パッケージをアップロードする際に今、アップロードパッケージ事業は年齢を取り、最終的には「基になるプロバイダーがオープンに失敗しました」というエラーNuGetギャラリーとEntityFrameworkのスロープロバイダエラーのオープンに失敗しました

[TimeoutException: Transaction Timeout] 

[TransactionException: The operation is not valid for the state of the transaction.] 
    System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) +53 
    System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) +241 
    System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) +273 
    System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) +150 
    System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +2647 
    System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +89 
    System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +6372062 
    System.Data.SqlClient.SqlConnection.Open() +300 
    System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) +67 

[EntityException: The underlying provider failed on Open.] 
    System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) +11109230 
    System.Data.EntityClient.EntityConnection.Open() +142 
    System.Data.Objects.ObjectContext.EnsureConnection() +97 
    System.Data.Objects.ObjectContext.ExecuteStoreQueryInternal(String commandText, String entitySetName, MergeOption mergeOption, Object[] parameters) +109 
    System.Data.Objects.ObjectContext.ExecuteStoreQuery(String commandText, Object[] parameters) +87 
    System.Data.Entity.Internal.InternalContext.ExecuteSqlQuery(String sql, Object[] parameters) +118 
    System.Data.Entity.Internal.InternalContext.ExecuteSqlQueryAsIEnumerable(String sql, Object[] parameters) +85 
    System.Data.Entity.Internal.InternalContext.ExecuteSqlQuery(Type elementType, String sql, Object[] parameters) +241 
    System.Data.Entity.Internal.InternalSqlNonSetQuery.GetEnumerator() +34 
    System.Data.Entity.Internal.InternalSqlQuery`1.GetEnumerator() +28 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +382 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +80 
    NuGetGallery.LuceneIndexingService.GetPackages(DbContext context, Nullable`1 dateTime) in C:\Source\DotNetDevEng.CitiNuGet\Gallery\DEV\Website\Infrastructure\Lucene\LuceneIndexingService.cs:55 
    NuGetGallery.LuceneIndexingService.UpdateIndex() in C:\Source\DotNetDevEng.CitiNuGet\Gallery\DEV\Website\Infrastructure\Lucene\LuceneIndexingService.cs:32 
    NuGetGallery.PackageService.CreatePackage(IPackage nugetPackage, User currentUser) in C:\Source\DotNetDevEng.CitiNuGet\Gallery\DEV\Website\Services\PackageService.cs:61 
    NuGetGallery.PackagesController.VerifyPackage(Nullable`1 listed) in C:\Source\DotNetDevEng.CitiNuGet\Gallery\DEV\Website\Controllers\PackagesController.cs:503 
    lambda_method(Closure , ControllerBase , Object[]) +121 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +248 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 
    System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +125 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +691 
    System.Web.Mvc.Controller.ExecuteCore() +162 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +305 
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375 

を投げます組み込みのLocalSystemアカウントの下で実行すると、これらの問題はすべて消えてしまいます。使用したいドメインユーザーはNuGetGalleryデータベースのデータベース所有者として一時的にセットアップされていますが、それは役に立ちません。

ここでは、どの設定や設定が欠落している可能性がありますか?

+0

これは、トランザクションが分散トランザクションに昇格されている場合の例外のようです。解決する方法がわからない、またはこれがペイメントが足りないためかどうかは、最初に次の質問に答えようとしています - トランザクションが分散トランザクションに昇格されていることを認識していますか(分散トランザクションは通常、 ?もしそうなら、意図的なのでしょうか?最後に(または多分最初に)SQL Server 2005を使用していますか? Sql Server 2005では、トランザクション内で同じSqlサーバーに複数の接続がある場合、そのSQL Serverは昇格されます。 – Pawel

+0

ありがとうございました。分散トランザクションが行われているかどうかを調べるコードを調べます。これは、ここで使用しているオープンソース製品であり、したがってコードベースの不慣れです。使用されているDBはSQL Server 2008です。分散トランザクションを確認する方法を教えてください。 – Nikhil

答えて

0

これは、コード内で周囲のトランザクションが行われたためです。このコードは、TransactionScopeクラスに依存して、入れ子になったときにジャムになっていたさまざまなトランザクションを管理しています。サイズが約10MBを超えるパッケージをアップロードしようとすると、特に悪くなりました。ボックス上でMSDTCを微調整すると、アプリケーションはわずかに正しく動作し始めました。しかし、依然としてそれ自体のトランザクション内で断続的にデッドロックが発生していたので、今度はパッケージのアップロードビットからトランザクションを削除することに決めました。私はこれらの2

  1. のいずれかコメントアウト

サービス\ PackageService.cs(メソッドCreatePackage、ライン48)内のTransactionScopeへの参照をお勧めします。この問題に入った他の誰のために

using (var tx = new TransactionScope()) 
      { 
       using (var stream = nugetPackage.GetStream()) 
       { 
        UpdateIsLatest(packageRegistration); 
        packageRegistrationRepo.CommitChanges(); 
        packageFileSvc.SavePackageFile(package, stream); 
        tx.Complete(); 
       } 
      } 

とコントローラ\ PackageController.cs方法でVerifyPackage(BOOL?上場)ライン501

using (var tx = new TransactionScope()) 
      { 

       package = packageSvc.CreatePackage(nugetPackage, currentUser); 
       packageSvc.PublishPackage(package.PackageRegistration.Id, package.Version); 
       if (listed.HasValue && listed.Value == false) 
        packageSvc.MarkPackageUnlisted(package); 
       uploadFileSvc.DeleteUploadFile(currentUser.Key); 
       tx.Complete(); 
      } 

2のコメントを解除し、それらの行と、ここhttp://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx

述べたアプローチは、基本的にはSQL Serverとうまく働くことができるのTransactionScopeを作成してください。 InfraStructureFolderで新しいクラスを作成し、TranscationUtilsという名前でコードをコピーします。この第二のアプローチは、再びあなたがTransactionScopeのために指定することができ、デフォルトのタイムアウトに関連する他のサーバエラーが発生することができますしかし、その後使用してブロックが

using (var tx = new TransactionUtils.CreateTransactionScope()){ 

//cod here 
tx.Complete(); 
} 

ようになります。個人的には、アプローチ1を使用して、すべてのTransactionScope参照をコメントアウトすることを決定しました。