Salem's Euphoria

Sharing Experience


1 Comment

Lucene.Net corrupt indexes

lucene.net

 

 

DotLucene is the dotNet version of Java Lucene API. It is still an open source project with a smaller community. There are many classes that needs to be implemented especially those specific to the Java world. Many open source projects are built on top od DotLucene such as SubText, Lucandra.Net (Lucene and Cassandra) and the awesome RavenDB.
I’ve been using it since 2008 and I want to thank everyone that helped revive this project after two years of hibernation.

When playing with the .Net implementation, I faced the ambiguous exception saying “Read Past EOF”.  Contributors always suspected corrupt indexes. It was not my case: I double checked using the CheckIndex.Status class and it does not reveal any problem. I went through the Lucene.Net DLL code, and focused on the method throwing the error(Refill())


private void Refill()

{
long start = bufferStart + bufferPosition;
long end = start + _bufferSize;
if (end > Length())
// don't read past EOF
end = Length();
int newLength = (int) (end - start);

if (newLength <= 0)// The error is thrown here
throw new System.IO.IOException("read past EOF");

if (buffer == null)
{
NewBuffer(new byte[_bufferSize]); // allocate buffer lazily
SeekInternal(bufferStart);
}
ReadInternal(buffer, 0, newLength);
bufferLength = newLength;
bufferStart = start;
bufferPosition = 0;

To check whether your indexes are corrupt or not, you can use the CheckIndex class as below:

Dim cheker As CheckIndex = New CheckIndex(idxdir)
Dim status As CheckIndex.Status = checker.CheckIndex_Renamed_Method()

The status holds many attributes which can ensure the health of your indexes. Mine shows this:
CheckIndex.Status
So the indexes are healthy, no locks is left there (check locks on file also using Lock Hunter), RW rights are set up correctly, so what was happening?

 

Simply, a coding error ^^’


Dim pth As String = Application.StartupPath + INDEX_PATH + "\" + entityName
Dim idxdir As Lucene.Net.Store.Directory = SimpleFSDirectory.Open(New IO.DirectoryInfo(pth))
Dim crawler As IndexSearcher = New IndexSearcher(idxdir, False)

//and later when iterating through the results (i is the counter)

Dim scrd As ScoreDoc = hts.ScoreDocs(i)

//the error occurs here
Dim doc As Document = crawlr.Doc(scrd.Doc)

Two hours and 25 pages to find out the problem…. the crawler is the index searcher that fetches a given entity (entityName), whereas the  crawlr (without “e” before the “r”) is a global index searcher used somewhere else… That’s all.

A good lesson, do a diff for your team’s updates before starting any bug fix!

gym

Advertisements


2 Comments

Virtualisation des applications Desktop

Lors du développement d’une application de bureau destinée au grand public, on pense souvent à trois P essentiels:

Performance
Protection
Portabilité

Dans ce post, je voudrai parler de ma propre expérience avec les applications .Net et l’issue de portabilité que je rencontre à chaque fois.

La première restriction est que ces applications ne fonctionnent que sous Windows (sauf si vous développez avec MONO).

La deuxième contrainte concerne le framework DotNet lui même qui doit être installé sur le poste du client (même version que celle de l’application).Une application .Net nécessite son environnement pour pouvoir s’exécuter.

Deux approches communes se présente alors; Soit vous demandez à l’utilisateur final de télécharger le dotNet framework nécessaire, soit vous lui fournirez la version distribuable du framework lors de l’installation. Plusieurs outils sont à votre disposition pour le faire en commençant par l’installateur minimal de Visual Studio, InstallShield ou autres…

Ces deux approches entraînent un travail nécessaire à l’utilisateur final qui peut abandonner l’affaire dès le premier échec d’installation de dotnet framework(à cause des droits d’accès par exemple); Essayer d’installer le dotnet framework 4 sur windows server 2003 et vous verrez le nombre de problème que vous devriez résoudre…

La question suspendu et omniprésente: Comment exécuter une application DotNet sans avoir à installer le DotNet Framework?

La première réponse sera : Tu peux pas!!!

La solution qui reste alors sera la virtualisation de l’application: L’opération consiste à embarquer le dotnet framework (ou uniquement les composantes nécessaires) dans votre application afin que votre application n’ait aucune dépendance logicielle supplémentaire et devient une application réellement “Standalone”.

J’ai essayé de faire mon malin au début, utiliser IlMergeAl(Assembly Linker) et compilation en module,  puis NGEN, mais finalement j’ai abandonné parce que j’ai compris enfin ce que Microsoft veut dire par environnement; Il ne suffit pas de faire la résolution classique des dépendances aux différentes bibliothèques, mais il faut aussi faire l’abstraction du CLR et du JIT.

Le CLR (Common Language Runtime), est le moteur d’exécution qui permet d’obtenir le code en langage  intermédiaire (MSIL), un peu comme la JVM. Ce même code intermédiaire est compilé “à la volé”(~ Just In Time) pour pouvoir s’exécuter finalement.

Voici quelques solutions présentes sur le marché pour répondre à la question existentielle “Comment je peux exécuter une application dotnet sans installer le dotnet framework”.

Spoon Studio

Le produit leader présent sur le marché actuellement s’appelle Spoon Studio (ancien xenocode), Mais son prix est colossal (de 1995$ à 30000$ si votre boite fait plus que 100K$ par an). En plus, pour chaque copie vendu de votre application, vous devez 20$ à Spoon. Bref, ce n’est pas donné.

L’interface de l’application est intuitive. Vous pouvez embarquer les différentes versions du dotNet Framewok, Java, Flash, Acrobat Reader et même SqlServer Xpress. L’exécutable est de l’ordre de 90Mo pour une application minimale dotNet, juste pour vous donner une idée.

ThinApp

La procédure de post et pré scan du système avant et après installation du dotnet framework est expliquée étape par étape ici; Pour virtualiser votre application, il suffit de créer un installateur minimal avec Visual Studio par exemple et l’installer sur le même système après avoir installé le dotnet framework, et avant le pré-scan.

Salamander.Net Linker


Sa documentation dit qu’il peut faire des tas de choses, même l’abstraction du dotnet framework mais… je n’ai pas réussi à le tester car la version demo est à la demande; j’attends depuis un mois et il ne m’ont pas encore répondu.

Molebox

Dans sa présentation du produit, la société prétend qu’il peut embarquer des DLL, ActiveX et des composantes dotNet. J’ai vérifié: ça ne donne rien.

L’option “inherit virtual environment” disponible dans la configuration du projet n’inclue pas l’environnement dotnet dans l’application. Donc, ce produit sert à créer une pack unique pour tous les fichiers mais, pour une application dotNet, vous aurez toujours besoin d’installer le framework;

Cameyo

Une alternative prometteuse, mais qui n’est pas encore assez mure. Dans deux ans, je pense qu’il sera leader de ce marché s’il continue le travail au même rythme. C’est le seul produit gratuit de virtualisation.

La liste s’étend encore, mais, à mon avis ça ne vaut pas le coût. Pour les curieux, il y a aussi:

– Evalazer

– Ceedo

– Gilma

– BoxedApp et InstallAware

– Phoenix

– JauntePe

Pour conclure, je pense que cette question est un faux problème à l’origine. Lorsque vous souhaitez développer une application desktop, vous devez être conscient au départ, que pour bénéficier des facilités de développement offertes par dotNet, vous devriez créer un installateur et fournir les composantes requises avec votre produit. Mais si ça devient une fatalité, essayez de gagner au LOTO avant de commencer ou bien apprenez le C/C++;

PS: Je deteste VB6 😉