diff options
author | Bernard Normier <bernard@zeroc.com> | 2003-10-03 00:26:42 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2003-10-03 00:26:42 +0000 |
commit | 0f5093399e9366d0300dc41ec1ddd66f2a60a4f7 (patch) | |
tree | 2dd9a9f3dd90c1b0d1046548d11265770da82d2e /java/src | |
parent | Fixed property warning. (diff) | |
download | ice-0f5093399e9366d0300dc41ec1ddd66f2a60a4f7.tar.bz2 ice-0f5093399e9366d0300dc41ec1ddd66f2a60a4f7.tar.xz ice-0f5093399e9366d0300dc41ec1ddd66f2a60a4f7.zip |
Switched to DBT_MALLOC as DBT_REALLOC is buggy
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Freeze/EvictorI.java | 33 | ||||
-rw-r--r-- | java/src/Freeze/EvictorIteratorI.java | 56 |
2 files changed, 54 insertions, 35 deletions
diff --git a/java/src/Freeze/EvictorI.java b/java/src/Freeze/EvictorI.java index daebb6b1668..6b1f8421cb9 100644 --- a/java/src/Freeze/EvictorI.java +++ b/java/src/Freeze/EvictorI.java @@ -1247,28 +1247,33 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable } boolean - load(Ice.Identity ident, com.sleepycat.db.Dbc dbc, - com.sleepycat.db.Dbt key, com.sleepycat.db.Dbt value, java.util.List evictorElements) + load(com.sleepycat.db.Dbc dbc, com.sleepycat.db.Dbt key, com.sleepycat.db.Dbt value, + java.util.List identities, java.util.List evictorElements) throws com.sleepycat.db.DbException { - byte[] root = marshalRootKey(ident, _communicator); EvictorElement elt = new EvictorElement(); int rs = 0; + byte[] root = null; + do { // // Unmarshal key and data and insert it into elt's facet map // EvictorStorageKey esk = unmarshalKey(key.get_data(), _communicator); - + Facet facet = new Facet(elt); facet.status = clean; facet.rec = unmarshalValue(value.get_data(), _communicator); facet.path = esk.facet; assert(facet.path != null); elt.facets.put(new StringArray(esk.facet), facet); - if(esk.facet.length == 0) + + if(root == null) { + assert(esk.facet.length == 0); + identities.add(esk.identity); + root = marshalRootKey(esk.identity, _communicator); elt.mainObject = facet; } @@ -1276,27 +1281,33 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable } while(rs == 0 && startWith(key.get_data(), root)); - buildFacetMap(elt.facets); + buildFacetMap(elt.facets); evictorElements.add(elt); return (rs == 0); } boolean - skipFacets(Ice.Identity ident, com.sleepycat.db.Dbc dbc, - com.sleepycat.db.Dbt key, com.sleepycat.db.Dbt value) + load(com.sleepycat.db.Dbc dbc, com.sleepycat.db.Dbt key, + com.sleepycat.db.Dbt value, java.util.List identities) throws com.sleepycat.db.DbException { - byte[] root = marshalRootKey(ident, _communicator); int rs = 0; + byte[] root = null; do - { + { + if(root == null) + { + EvictorStorageKey esk = unmarshalKey(key.get_data(), _communicator); + assert(esk.facet.length == 0); + identities.add(esk.identity); + root = marshalRootKey(esk.identity, _communicator); + } rs = dbc.get(key, value, com.sleepycat.db.Db.DB_NEXT); } while(rs == 0 && startWith(key.get_data(), root)); return (rs == 0); } - void insert(java.util.List identities, java.util.List evictorElements, int loadedGeneration) { diff --git a/java/src/Freeze/EvictorIteratorI.java b/java/src/Freeze/EvictorIteratorI.java index c7ec9efa108..bcfe5fe8962 100644 --- a/java/src/Freeze/EvictorIteratorI.java +++ b/java/src/Freeze/EvictorIteratorI.java @@ -51,11 +51,15 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator assert(batchSize > 0); - _key.set_flags(com.sleepycat.db.Db.DB_DBT_REALLOC); + // + // We should use DB_DBT_REALLOC, but it's buggy in 4.1.25 + // (causes weird problems, e.g. can't find some values) + // + _key.set_flags(com.sleepycat.db.Db.DB_DBT_MALLOC); if(_loadServants) { - _value.set_flags(com.sleepycat.db.Db.DB_DBT_REALLOC); + _value.set_flags(com.sleepycat.db.Db.DB_DBT_MALLOC); } else { @@ -77,7 +81,14 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator java.util.List evictorElements = null; Ice.Communicator communicator = _evictor.communicator(); - + + byte[] firstKey = null; + if(_key.get_size() > 0) + { + firstKey = new byte[_key.get_size()]; + System.arraycopy(_key.get_data(), 0, firstKey, 0, firstKey.length); + } + int loadedGeneration = 0; try @@ -91,16 +102,14 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator { evictorElements = new java.util.ArrayList(); } - - int count = _batchSize; - + try { // // Move to the first record // int flags = com.sleepycat.db.Db.DB_NEXT; - if(_key.get_size() > 0) + if(firstKey != null) { // // _key represents the next element not yet returned @@ -115,38 +124,36 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator } dbc = _evictor.db().cursor(null, 0); _more = (dbc.get(_key, _value, flags) == 0); - - while(count > 0 && _more) + + while(_batch.size() < _batchSize && _more) { - EvictorStorageKey esk = EvictorI.unmarshalKey(_key.get_data(), communicator); - - // - // Because of the Ice encoding and default binary comparison, records with - // facet length = 0 are before records with facet length > 0 (for a given - // identity). - // - assert(esk.facet.length == 0); - - Ice.Identity ident = esk.identity; - _batch.add(ident); - count--; - // // Even when count is 0, we read one more record (unless we reach the end) // if(_loadServants) { - _more = _evictor.load(ident, dbc, _key, _value, evictorElements); + _more = _evictor.load(dbc, _key, _value, _batch, evictorElements); } else { - _more = _evictor.skipFacets(ident, dbc, _key, _value); + _more = _evictor.load(dbc, _key, _value, _batch); } } break; // for (;;) } catch(com.sleepycat.db.DbDeadlockException dx) { + if(firstKey != null) + { + assert(_key.get_data().length >= firstKey.length); + System.arraycopy(firstKey, 0, _key.get_data(), 0, firstKey.length); + _key.set_size(firstKey.length); + } + else + { + _key.set_size(0); + } + // // Retry // @@ -187,6 +194,7 @@ class EvictorIteratorI extends Ice.LocalObjectImpl implements EvictorIterator { _evictor.insert(_batch, evictorElements, loadedGeneration); } + return _batch.listIterator(); } } |