2010-11-12 25 views
1

J'essaie de configurer un site Web de test mono asp.net 4.0 qui utilise des fournisseurs memcached (http: //memcachedproviders.codeplex. com /) en utilisant Enyim.Memcached pour accéder à memcached. Le site Web et memcachedproviders fonctionnent correctement sur un serveur Windows.Dans Mono, les fournisseurs memcached se bloque après quelques heures avec "le socket n'est pas connecté" Erreur 500

J'ai migré sur le site Web de travail asp.net vers mono (Ubuntu 10.10, Mono 2.8), et il fonctionne correctement et tire des sessions d'un serveur externe exécutant memcached, mais inexplicablement, tous les quelques heures, le site tombe en panne, et renvoie juste une erreur 500 disant "Le socket n'est pas connecté" Cela se produit uniquement lorsque l'état de la session memcachedproviders est activé.

Quelqu'un at-il l'expérience de la configuration de memcachedproveders pour une session en mono, ou savoir au moins où je devrais commencer à chercher? Bien que je connaisse Linux et Apache, je suis généralement plus à l'aise avec Windows, donc il peut y avoir une configuration qui me manque.

Pour autant que je peux dire, c'est le journal de apache à partir du moment de l'erreur, même avec le débogage activé à partir mod_mono:

[Tue Nov 09 17:53:17 2010] [notice] caught SIGTERM, shutting down 
[Tue Nov 09 17:53:19 2010] [notice] Apache/2.2.14 (Ubuntu) mod_mono/2.8 configured -- resuming normal operations 
Listening on: /tmp/mod_mono_server_global 
Root directory:/
Listening on: /tmp/mod_mono_server_global 
Root directory:/
Error: There's already a server listening on /tmp/mod_mono_server_global 
mod-mono-server4 
mod-mono-server4 
Listening on: /tmp/mod_mono_server_mysite 
Root directory: /srv/www/mysite 
[Tue Nov 09 17:53:58 2010] [error] (104)Connection reset by peer: read_data failed 
[Tue Nov 09 17:53:58 2010] [error] Command stream corrupted, last command was -1 

La configuration memcached générale web.config est quelque chose comme:

<enyim.com> 
    <memcached> 
     <servers> 
      <add address="##.##.##.##" port="11211"/> 
     </servers> 
     <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00"/> 
    </memcached> 
</enyim.com> 
... 
<sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="MemcachedSessionProvider"> 
    <providers> 
     <add name="MemcachedSessionProvider" type="MemcachedProviders.Session.SessionStateProvider,MemcachedProviders" dbType="none" writeExceptionsToEventLog="true"/> 
    </providers> 
</sessionState> 

Et la trace de la pile:

System.Net.Sockets.SocketException: The socket is not connected 
    at System.Net.Sockets.Socket.Shutdown (SocketShutdown how) [0x00058] in /home/monoweb/mono-2.8/mcs/class/System/System.Net.Sockets/Socket_2_1.cs:698 
    at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.Destroy() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.MemcachedNode+InternalPoolImpl.ReleaseSocket (Enyim.Caching.Memcached.PooledSocket socket) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.System.IDisposable.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.ItemOperation.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.Operation.System.IDisposable.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.MemcachedClient.Store (Enyim.Caching.Memcached.ServerPool pool, StoreCommand mode, System.String key, System.Object value, UInt64 casValue, TimeSpan validFor, DateTime expiresAt) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.MemcachedClient.Store (StoreMode mode, System.String key, System.Object value, TimeSpan validFor) [0x00000] in <filename unknown>:0 
    at MemcachedProviders.Session.SessionStateProvider.SetAndReleaseItemExclusive (System.Web.HttpContext context, System.String id, System.Web.SessionState.SessionStateStoreData item, System.Object lockId, Boolean newItem) [0x00000] in <filename unknown>:0 
    at System.Web.SessionState.SessionStateModule.OnReleaseRequestState (System.Object o, System.EventArgs args) [0x0003f] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateModule.cs:292 
    at System.Web.HttpApplication+<RunHooks>c__Iterator1.MoveNext() [0x001aa] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1026 
    at System.Web.HttpApplication+<Pipeline>c__Iterator2.MoveNext() [0x00ec9] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1385 
    at System.Web.HttpApplication.Tick() [0x00000] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:914 

Répondre

2

J'ai fini par fixer cette en téléchargeant d'abord la source pour memcachedproviders, et en la recompilant en référence à enyim.memcached 2.7 (la dernière version). Cela a impliqué quelques changements mineurs. Ensuite, en mono, j'ai obtenu une erreur différente, au sein d'enyim memcached concernant string.IndexOfAny (http://msdn.microsoft.com/en-us/library/11w09h50.aspx) où la chaîne en cours de vérification était null, et était donc en train de lancer une exception. Si je lis bien les docs, je pense que c'est seulement supposé lancer une exception si le paramètre est null, pas si la chaîne est. Soit cela ou mod_mono essaye aléatoirement d'accéder à la session [null], alors qu'asp.net ne le fait pas.

Pour résoudre ce problème, j'ai téléchargé la source enyim memcached et ajouté une vérification qui remplacerait une valeur nulle par une chaîne vide avant l'appel de la fonction. Les sessions memcached sont terminées depuis plus de 24 heures sans aucun problème.