GithubHelp home page GithubHelp logo

Comments (8)

adamretter avatar adamretter commented on April 28, 2024

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.

nicktelford avatar nicktelford commented on April 28, 2024

Unless I'm mistaken, this invokes the copy-constructor of ColumnFamilyDescriptor:

*desc = ColumnFamilyDescriptor(cfd()->GetName(), cfd()->GetLatestCFOptions());

from rocksdb.

adamretter avatar adamretter commented on April 28, 2024

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.

nicktelford avatar nicktelford commented on April 28, 2024

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.

adamretter avatar adamretter commented on April 28, 2024

@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:

  1. We could perhaps have ColumnFamilyDescriptor extend AutoCloseable and implement ColumnFamilyDescriptor#close() as:
@Override
public void close() {
  columnFamilyOptions_.close();
}
  1. 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.

from rocksdb.

nicktelford avatar nicktelford commented on April 28, 2024

I can see a few possible options:

  1. We could perhaps have ColumnFamilyDescriptor extend AutoCloseable and implement ColumnFamilyDescriptor#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.

adamretter avatar adamretter commented on April 28, 2024

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.

adamretter avatar adamretter commented on April 28, 2024
  1. 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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.