Comments (8)
I am just looking at the code, and unless I have missed it, I can't see any heap allocations taking place:
The JNI code from java/rocksjni/columnfamilyhandle.cc
:
jobject Java_org_rocksdb_ColumnFamilyHandle_getDescriptor(JNIEnv* env,
jobject /*jobj*/,
jlong jhandle) {
auto* cfh = reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jhandle);
ROCKSDB_NAMESPACE::ColumnFamilyDescriptor desc;
ROCKSDB_NAMESPACE::Status s = cfh->GetDescriptor(&desc);
if (s.ok()) {
return ROCKSDB_NAMESPACE::ColumnFamilyDescriptorJni::construct(env, &desc);
} else {
ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
return nullptr;
}
}
The underlying C++ API code from db/column_family.cc
:
Status ColumnFamilyHandleImpl::GetDescriptor(ColumnFamilyDescriptor* desc) {
// accessing mutable cf-options requires db mutex.
InstrumentedMutexLock l(mutex_);
*desc = ColumnFamilyDescriptor(cfd()->GetName(), cfd()->GetLatestCFOptions());
return Status::OK();
}
If there are no heap allocations in C++ then I don't think there is anything that we need to free explicitly. What do you think?
from rocksdb.
Unless I'm mistaken, this invokes the copy-constructor of ColumnFamilyDescriptor
:
*desc = ColumnFamilyDescriptor(cfd()->GetName(), cfd()->GetLatestCFOptions());
from rocksdb.
this invokes the copy-constructor
Yes, as I understand it that is the case. However, isn't that copy on the Stack (and not the Heap), and so it will be deleted implicitly when it goes out of scope?
from rocksdb.
Good point, although it looks like the ColumnFamilyOptions
within that descriptor is copied into the Java ColumnFamilyDescriptor
, here:
static jobject construct(JNIEnv* env, ColumnFamilyDescriptor* cfd) {
jbyteArray jcf_name = JniUtil::copyBytes(env, cfd->name);
jobject cfopts = ColumnFamilyOptionsJni::construct(env, &(cfd->options));
My guess is that the "leak" I'm seeing is really this ColumnFamilyOptions
, in which case, whenever we call ColumnFamilyHandle#getDescriptor()
to generate a ColumnFamilyDescriptor
, we always need to call columnFamilyDescriptor.getOptions().close()
to free the options after use?
from rocksdb.
@nicktelford Good spot!
I can't see a great solution to this apart from calling columnFamilyDescriptor.getOptions().close()
at the moment.
I can see a few possible options:
- We could perhaps have
ColumnFamilyDescriptor
extendAutoCloseable
and implementColumnFamilyDescriptor#close()
as:
@Override
public void close() {
columnFamilyOptions_.close();
}
- We refactor
ColumnFamilyDescriptor
in RocksJava so that it is also a RocksObject that wraps a C++ColumnFamilyDescriptor
. Previously we tried to keep it simple as in the past it only had acolumnFamilyName
.
from rocksdb.
I can see a few possible options:
- We could perhaps have
ColumnFamilyDescriptor
extendAutoCloseable
and implementColumnFamilyDescriptor#close()
as:@Override public void close() { columnFamilyOptions_.close(); }
This seems reasonable. It doesn't seem likely that anyone would explicitly want the lifetime of the options to exceed the descriptor.
At the very least a comment in the JavaDoc would be better than the status quo. 😄
from rocksdb.
This seems reasonable
Yes, but it may be more tricky than that, I will need to find some time to try it out...
At the very least a comment in the JavaDoc would be better than the status quo.
Please feel free to send a PR for that
from rocksdb.
- We refactor ColumnFamilyDescriptor in RocksJava so that it is also a RocksObject that wraps a C++ ColumnFamilyDescriptor. Previously we tried to keep it simple as in the past it only had a columnFamilyName.
I think we should attempt this approach initially!
from rocksdb.
Related Issues (20)
- RocksJava - Options cannot be instantiated directly HOT 1
- Opening LevelDB with corrupted MANIFEST-0* file HOT 6
- when to use checkpoint vs opening rocksdb in read only mode HOT 4
- CancelAllBackgroundWork: Flush of unpersisted data waits for stall conditions to clear and delays db close HOT 2
- Installation documentation for OSX is out of date HOT 3
- ArenaTest.UnmappedAllocation fails when "transparent hugepage" is enabled.
- API request: SeekForBase
- Master branch unable to find zstd HOT 1
- RocksDB crashing when doing simple get HOT 5
- unexplained sudden increase in memory usage HOT 14
- DirectIO WAL Write does not honor DBOptions.use_fsync HOT 2
- New LZ4 encoding HOT 1
- release 8.10.2 on maven central HOT 1
- tailing iterator ambiguity
- When run in two consecutive times DB::Open has quite different time cost HOT 2
- Is it possible to make the db.get operation after db.close without exception? HOT 3
- Feature Request: Graceful upgrade
- There is an error when I am compilling rocksDB version above 8.10.0 with zenFS 2.1.4 HOT 1
- Doc bug: CustomFilterPolicy example
- Feature request: check if prefix exists without seeking HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rocksdb.