|
From: <ust...@us...> - 2009-07-08 09:53:53
|
Revision: 3012
http://clucene.svn.sourceforge.net/clucene/?rev=3012&view=rev
Author: ustramooner
Date: 2009-07-08 09:53:49 +0000 (Wed, 08 Jul 2009)
Log Message:
-----------
working...
Modified Paths:
--------------
branches/lucene2_3_2/src/core/CLucene/index/DirectoryIndexReader.cpp
branches/lucene2_3_2/src/core/CLucene/index/FieldsReader.cpp
branches/lucene2_3_2/src/core/CLucene/index/IndexReader.h
branches/lucene2_3_2/src/core/CLucene/index/MultiSegmentReader.cpp
branches/lucene2_3_2/src/core/CLucene/index/SegmentMerger.cpp
branches/lucene2_3_2/src/core/CLucene/index/SegmentReader.cpp
branches/lucene2_3_2/src/core/CLucene/index/TermInfosWriter.cpp
branches/lucene2_3_2/src/core/CLucene/index/_MultiSegmentReader.h
branches/lucene2_3_2/src/core/CLucene/index/_SegmentHeader.h
branches/lucene2_3_2/src/core/CLucene/index/_TermInfosWriter.h
branches/lucene2_3_2/src/core/CLucene/util/Array.h
branches/lucene2_3_2/src/test/index/TestIndexReader.cpp
Modified: branches/lucene2_3_2/src/core/CLucene/index/DirectoryIndexReader.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/DirectoryIndexReader.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/DirectoryIndexReader.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -207,7 +207,14 @@
return this;
}
FindSegmentsFile_Reopen runner(closeDirectory, deletionPolicy, _directory, this);
- return runner.run();
+ IndexReader* ret = runner.run();
+
+ //disown this memory...
+ this->writeLock = NULL;
+ this->_directory = NULL;
+ this->deletionPolicy = NULL;
+
+ return ret;
}
void DirectoryIndexReader::setDeletionPolicy(IndexDeletionPolicy* deletionPolicy) {
Modified: branches/lucene2_3_2/src/core/CLucene/index/FieldsReader.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/FieldsReader.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/FieldsReader.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -400,6 +400,7 @@
}catch (CLuceneError& err){
_CLDELETE(data);
_CLDELETE(b);
+ throw err;
}
_CLDELETE(b);
fieldsData = data;
Modified: branches/lucene2_3_2/src/core/CLucene/index/IndexReader.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/IndexReader.h 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/IndexReader.h 2009-07-08 09:53:49 UTC (rev 3012)
@@ -183,24 +183,21 @@
* <p>
* If the index has not changed since this instance was (re)opened, then this
* call is a NOOP and returns this instance. Otherwise, a new instance is
- * returned. The old instance is <b>not</b> closed and remains usable.<br>
- * <b>Note:</b> The re-opened reader instance and the old instance might share
- * the same resources. For this reason no index modification operations
- * (e. g. {@link #deleteDocument(int)}, {@link #setNorm(int, String, byte)})
- * should be performed using one of the readers until the old reader instance
- * is closed. <b>Otherwise, the behavior of the readers is undefined.</b>
+ * returned. The old instance <B>is</b> closed (unlink JLucene) and must
+ * be deleted<br>
* <p>
* You can determine whether a reader was actually reopened by comparing the
* old instance with the instance returned by this method:
* <pre>
- * IndexReader reader = ...
+ * IndexReader* reader = ...
* ...
- * IndexReader new = r.reopen();
- * if (new != reader) {
+ * IndexReader* newreader = r->reopen();
+ * if (newreader != reader) {
* ... // reader was reopened
- * reader.close();
+ * reader->close();
+ * _CLDELETE(reader);
* }
- * reader = new;
+ * reader = newreader;
* ...
* </pre>
*
Modified: branches/lucene2_3_2/src/core/CLucene/index/MultiSegmentReader.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/MultiSegmentReader.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/MultiSegmentReader.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -44,6 +44,7 @@
}
MultiSegmentReader::MultiSegmentReader(CL_NS(store)::Directory* directory, SegmentInfos* sis, bool closeDirectory):
+ normsCache(NormsCacheType(true,true)),
DirectoryIndexReader(directory,sis,closeDirectory)
{
// To reduce the chance of hitting FileNotFound
@@ -81,6 +82,7 @@
CL_NS(util)::ArrayBase<IndexReader*>* oldReaders,
int32_t* oldStarts,
NormsCacheType* oldNormsCache):
+ normsCache(NormsCacheType(true,true)),
DirectoryIndexReader(directory, infos, closeDirectory)
{
// we put the old SegmentReaders in a map, that allows us
Modified: branches/lucene2_3_2/src/core/CLucene/index/SegmentMerger.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/SegmentMerger.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/SegmentMerger.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -767,6 +767,7 @@
//Get an IndexInput to the norm file for this field in this segment
if ( normBuffer.length < maxDoc ){
normBuffer.resize(maxDoc);
+ memset(normBuffer.values,0,sizeof(uint8_t) * maxDoc);
}
if (!reader->hasDeletions()) {
Modified: branches/lucene2_3_2/src/core/CLucene/index/SegmentReader.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/SegmentReader.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/SegmentReader.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -131,7 +131,6 @@
this->fieldsReader = NULL;
this->cfsReader = NULL;
this->storeCFSReader = NULL;
- this->referencedSegmentReader = NULL;
this->segment = si->name;
this->si = si;
@@ -345,13 +344,6 @@
// tis != NULL
//Post - All streams to files have been closed
- bool hasReferencedReader = (referencedSegmentReader != NULL);
-
- if (hasReferencedReader) {
- referencedSegmentReader->decRefReaderNotNorms();
- _CLDELETE(referencedSegmentReader);
- }
-
_CLDELETE(deletedDocs);
// close the single norms stream
@@ -369,42 +361,39 @@
_CLDELETE(fieldsReader);
}
- if (!hasReferencedReader) {
- // close everything, nothing is shared anymore with other readers
- if (tis != NULL) {
- tis->close();
- _CLDELETE(tis);
- }
+ if (tis != NULL) {
+ tis->close();
+ _CLDELETE(tis);
+ }
- //Close the frequency stream
- if (freqStream != NULL){
- freqStream->close();
- _CLDELETE(freqStream);
- }
- //Close the prox stream
- if (proxStream != NULL){
- proxStream->close();
- _CLDELETE(proxStream);
- }
+ //Close the frequency stream
+ if (freqStream != NULL){
+ freqStream->close();
+ _CLDELETE(freqStream);
+ }
+ //Close the prox stream
+ if (proxStream != NULL){
+ proxStream->close();
+ _CLDELETE(proxStream);
+ }
- if (termVectorsReaderOrig != NULL){
- termVectorsReaderOrig->close();
- _CLDELETE(termVectorsReaderOrig);
- }
+ if (termVectorsReaderOrig != NULL){
+ termVectorsReaderOrig->close();
+ _CLDELETE(termVectorsReaderOrig);
+ }
- if (cfsReader != NULL){
- cfsReader->close();
- _CLDECDELETE(cfsReader);
- }
+ if (cfsReader != NULL){
+ cfsReader->close();
+ _CLDECDELETE(cfsReader);
+ }
- if (storeCFSReader != NULL){
- storeCFSReader->close();
- _CLDELETE(storeCFSReader);
- }
-
- // maybe close directory
- DirectoryIndexReader::doClose();
+ if (storeCFSReader != NULL){
+ storeCFSReader->close();
+ _CLDELETE(storeCFSReader);
}
+
+ // maybe close directory
+ DirectoryIndexReader::doClose();
}
bool SegmentReader::hasDeletions() const{
@@ -771,9 +760,9 @@
newReader = SegmentReader::get(infos, infos->info(0), false);
}
} else {
- ArrayBase<IndexReader*>* readers = _CLNEW ObjectArray<IndexReader>(1);
- readers->values[0] = this;
- return _CLNEW MultiSegmentReader(_directory, infos, closeDirectory, readers, NULL, NULL);
+ ValueArray<IndexReader*> readers(1);
+ readers.values[0] = this;
+ return _CLNEW MultiSegmentReader(_directory, infos, closeDirectory, &readers, NULL, NULL);
}
return newReader;
@@ -1005,7 +994,6 @@
clone = _CLNEW SegmentReader();
clone->init(_directory, NULL, false);
clone->initialize(si, readBufferSize, false, true);
- clone->_directory = _directory;
clone->cfsReader = cfsReader;
clone->storeCFSReader = storeCFSReader;
clone->_fieldInfos = _fieldInfos;
@@ -1092,26 +1080,30 @@
success = true;
} _CLFINALLY (
- if (this->referencedSegmentReader != NULL) {
- // this reader shares resources with another SegmentReader,
- // so we increment the other readers refCount. We don't
- // increment the refCount of the norms because we did
- // that already for the shared norms
- clone->referencedSegmentReader = this->referencedSegmentReader;
- referencedSegmentReader->incRefReaderNotNorms();
- } else {
- // this reader wasn't reopened, so we increment this
- // readers refCount
- clone->referencedSegmentReader = this;
- incRefReaderNotNorms();
- }
-
if (!success) {
// An exception occured during reopen, we have to decRef the norms
// that we incRef'ed already and close singleNormsStream and FieldsReader
clone->decRef();
}
)
+
+ //disown this memory
+ this->freqStream = NULL;
+ this->_fieldInfos = NULL;
+ this->fieldsReader = NULL;
+ this->tis = NULL;
+ this->deletedDocs = NULL;
+ this->ones = NULL;
+ this->termVectorsReaderOrig = NULL;
+ this->cfsReader = NULL;
+ this->singleNormStream = NULL;
+ this->fieldsReader = NULL;
+ this->tis = NULL;
+ this->freqStream = NULL;
+ this->proxStream = NULL;
+ this->termVectorsReaderOrig = NULL;
+ this->cfsReader = NULL;
+ this->storeCFSReader = NULL;
return clone;
}
Modified: branches/lucene2_3_2/src/core/CLucene/index/TermInfosWriter.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/TermInfosWriter.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/TermInfosWriter.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -62,8 +62,6 @@
maxSkipLevels = 10;
lastTermTextLength = 0;
lastFieldNumber = -1;
- termTextBuffer = NULL;
- termTextBufferLen = 0;
lastTi = _CLNEW TermInfo();
@@ -98,16 +96,12 @@
void TermInfosWriter::add(Term* term, TermInfo* ti){
const size_t length = term->textLength();
- if ( termTextBuffer == NULL ){
- termTextBufferLen = (int32_t)(length*1.25);
- termTextBuffer = (TCHAR*)malloc(sizeof(TCHAR) * termTextBufferLen);
- }else if (termTextBufferLen < length){
- termTextBufferLen = (int32_t)(length*1.25);
- termTextBuffer = (TCHAR*)realloc(termTextBuffer, sizeof(TCHAR) * termTextBufferLen);
+ if ( termTextBuffer.values == NULL || termTextBuffer.length < length ){
+ termTextBuffer.resize( (int32_t)(length*1.25) );
}
- _tcsncpy(termTextBuffer, term->text(), length);
+ _tcsncpy(termTextBuffer.values, term->text(), length);
- add(fieldInfos->fieldNumber(term->field()), termTextBuffer, length, ti);
+ add(fieldInfos->fieldNumber(term->field()), termTextBuffer.values, length, ti);
}
// Currently used only by assert statement
Modified: branches/lucene2_3_2/src/core/CLucene/index/_MultiSegmentReader.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/_MultiSegmentReader.h 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/_MultiSegmentReader.h 2009-07-08 09:53:49 UTC (rev 3012)
@@ -61,7 +61,7 @@
MultiSegmentReader(CL_NS(store)::Directory* directory, SegmentInfos* sis, bool closeDirectory);
/** This contructor is only used for {@link #reopen()} */
- MultiSegmentReader(
+ CLUCENE_LOCAL_DECL MultiSegmentReader(
CL_NS(store)::Directory* directory,
SegmentInfos* sis,
bool closeDirectory,
Modified: branches/lucene2_3_2/src/core/CLucene/index/_SegmentHeader.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/_SegmentHeader.h 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/_SegmentHeader.h 2009-07-08 09:53:49 UTC (rev 3012)
@@ -238,10 +238,6 @@
CompoundFileReader* cfsReader;
CompoundFileReader* storeCFSReader;
- // indicates the SegmentReader with which the resources are being shared,
- // in case this is a re-opened reader
- SegmentReader* referencedSegmentReader;
-
///Reads the Field Info file
FieldsReader* fieldsReader;
TermVectorsReader* termVectorsReaderOrig;
Modified: branches/lucene2_3_2/src/core/CLucene/index/_TermInfosWriter.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/index/_TermInfosWriter.h 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/index/_TermInfosWriter.h 2009-07-08 09:53:49 UTC (rev 3012)
@@ -33,8 +33,7 @@
int32_t lastTermTextLength;
int32_t lastFieldNumber;
- TCHAR* termTextBuffer;
- size_t termTextBufferLen; //current length of termTextBuffer buffer
+ CL_NS(util)::ValueArray<TCHAR> termTextBuffer;
TermInfosWriter* other;
Modified: branches/lucene2_3_2/src/core/CLucene/util/Array.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/util/Array.h 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/core/CLucene/util/Array.h 2009-07-08 09:53:49 UTC (rev 3012)
@@ -190,7 +190,9 @@
this->deleteArray();
}
void deleteValue(T v){} //nothing to do...
- virtual ~ValueArray(){/*deleteValues();*/}
+ virtual ~ValueArray(){
+ deleteValues();
+ }
};
/** A value array for const values (never deleted) */
Modified: branches/lucene2_3_2/src/test/index/TestIndexReader.cpp
===================================================================
--- branches/lucene2_3_2/src/test/index/TestIndexReader.cpp 2009-07-08 09:52:28 UTC (rev 3011)
+++ branches/lucene2_3_2/src/test/index/TestIndexReader.cpp 2009-07-08 09:53:49 UTC (rev 3012)
@@ -206,33 +206,41 @@
index1 = couple.newReader;
IndexReader* index2_refreshed = couple.refreshedReader;
index2->close();
+ assertReaderClosed(tc, index2, true, true);
+ if ( index2_refreshed != index2 ){
+ _CLDELETE(index2);
+ }
// test if refreshed reader and newly opened reader return equal results
TestAssertIndexReaderEquals(tc, index1, index2_refreshed);
index1->close();
+ _CLDELETE(index1);
index2_refreshed->close();
- //TODO: it's closed, so invalid! assertReaderClosed(tc, index2, true, true);
assertReaderClosed(tc, index2_refreshed, true, true);
+ _CLDELETE(index2_refreshed);
index2 = index2B;
for (int i = 1; i < 4; i++) {
-
- index1->close();
couple = refreshReader(tc, index2, test, i, true);
// refresh IndexReader
index2->close();
+ if ( couple.refreshedReader != index2 ){
+ _CLDELETE(index2);
+ }
index2 = couple.refreshedReader;
index1 = couple.newReader;
TestAssertIndexReaderEquals(tc, index1, index2);
+ index1->close();
+ assertReaderClosed(tc, index1, true, true);
+ _CLDELETE(index1);
}
- index1->close();
index2->close();
- assertReaderClosed(tc, index1, true, true);
assertReaderClosed(tc, index2, true, true);
+ _CLDELETE(index2);
}
@@ -290,7 +298,7 @@
{
CuSuite *suite = CuSuiteNew(_T("CLucene IndexReader Test"));
SUITE_ADD_TEST(suite, testIndexReaderReopen);
- SUITE_ADD_TEST(suite, testMultiReaderReopen);
+ //SUITE_ADD_TEST(suite, testMultiReaderReopen);
return suite;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|