diff --git a/bindings/java/fdbJNI.cpp b/bindings/java/fdbJNI.cpp index 04c87e3b197..e685d3ee53b 100644 --- a/bindings/java/fdbJNI.cpp +++ b/bindings/java/fdbJNI.cpp @@ -765,6 +765,71 @@ JNIEXPORT jdouble JNICALL Java_com_apple_foundationdb_FDBDatabase_Database_1getM return (jdouble)fdb_database_get_main_thread_busyness(database); } +JNIEXPORT jlong JNICALL Java_com_apple_foundationdb_FDBDatabase_Database_1purgeBlobGranules(JNIEnv* jenv, + jobject, + jlong dbPtr, + jbyteArray beginKeyBytes, + jbyteArray endKeyBytes, + jlong purgeVersion, + jboolean force) { + if (!dbPtr || !beginKeyBytes || !endKeyBytes) { + throwParamNotNull(jenv); + return 0; + } + + FDBDatabase* database = (FDBDatabase*)dbPtr; + + uint8_t* beginKeyArr = (uint8_t*)jenv->GetByteArrayElements(beginKeyBytes, JNI_NULL); + if (!beginKeyArr) { + if (!jenv->ExceptionOccurred()) + throwRuntimeEx(jenv, "Error getting handle to native resources"); + return 0; + } + + uint8_t* endKeyArr = (uint8_t*)jenv->GetByteArrayElements(endKeyBytes, JNI_NULL); + if (!endKeyArr) { + jenv->ReleaseByteArrayElements(beginKeyBytes, (jbyte*)beginKeyArr, JNI_ABORT); + if (!jenv->ExceptionOccurred()) + throwRuntimeEx(jenv, "Error getting handle to native resources"); + return 0; + } + + FDBFuture* f = fdb_database_purge_blob_granules(database, + beginKeyArr, + jenv->GetArrayLength(beginKeyBytes), + endKeyArr, + jenv->GetArrayLength(endKeyBytes), + purgeVersion, + (fdb_bool_t)force); + jenv->ReleaseByteArrayElements(beginKeyBytes, (jbyte*)beginKeyArr, JNI_ABORT); + jenv->ReleaseByteArrayElements(endKeyBytes, (jbyte*)endKeyArr, JNI_ABORT); + return (jlong)f; +} + +JNIEXPORT jlong JNICALL +Java_com_apple_foundationdb_FDBDatabase_Database_1waitPurgeGranulesComplete(JNIEnv* jenv, + jobject, + jlong dbPtr, + jbyteArray purgeKeyBytes) { + if (!dbPtr || !purgeKeyBytes) { + throwParamNotNull(jenv); + return 0; + } + FDBDatabase* database = (FDBDatabase*)dbPtr; + uint8_t* purgeKeyArr = (uint8_t*)jenv->GetByteArrayElements(purgeKeyBytes, JNI_NULL); + + if (!purgeKeyArr) { + if (!jenv->ExceptionOccurred()) + throwRuntimeEx(jenv, "Error getting handle to native resources"); + return 0; + } + FDBFuture* f = + fdb_database_wait_purge_granules_complete(database, purgeKeyArr, jenv->GetArrayLength(purgeKeyBytes)); + jenv->ReleaseByteArrayElements(purgeKeyBytes, (jbyte*)purgeKeyArr, JNI_ABORT); + + return (jlong)f; +} + JNIEXPORT jboolean JNICALL Java_com_apple_foundationdb_FDB_Error_1predicate(JNIEnv* jenv, jobject, jint predicate, diff --git a/bindings/java/src/main/com/apple/foundationdb/Database.java b/bindings/java/src/main/com/apple/foundationdb/Database.java index 8606d7ec39d..8608effe536 100644 --- a/bindings/java/src/main/com/apple/foundationdb/Database.java +++ b/bindings/java/src/main/com/apple/foundationdb/Database.java @@ -161,6 +161,24 @@ default Transaction createTransaction() { */ double getMainThreadBusyness(); + /** + * Queues a purge of blob granules for the specified key range, at the specified version. + * + * @param beginKey start of the key range + * @param endKey end of the key range + * @param purgeVersion version to purge at + * @param force if true delete all data, if not keep data >= purgeVersion + * @return the key to watch for purge complete + */ + CompletableFuture purgeBlobGranules(byte[] beginKey, byte[] endKey, long purgeVersion, boolean force, Executor e); + + /** + * Wait for a previous call to purgeBlobGranules to complete + * + * @param purgeKey key to watch + */ + CompletableFuture waitPurgeGranulesComplete(byte[] purgeKey, Executor e); + /** * Runs a read-only transactional function against this {@code Database} with retry logic. * {@link Function#apply(Object) apply(ReadTransaction)} will be called on the diff --git a/bindings/java/src/main/com/apple/foundationdb/FDBDatabase.java b/bindings/java/src/main/com/apple/foundationdb/FDBDatabase.java index 5e0b8082423..50a63cc910f 100644 --- a/bindings/java/src/main/com/apple/foundationdb/FDBDatabase.java +++ b/bindings/java/src/main/com/apple/foundationdb/FDBDatabase.java @@ -200,6 +200,26 @@ public double getMainThreadBusyness() { } } + @Override + public CompletableFuture purgeBlobGranules(byte[] beginKey, byte[] endKey, long purgeVersion, boolean force, Executor executor) { + pointerReadLock.lock(); + try { + return new FutureKey(Database_purgeBlobGranules(getPtr(), beginKey, endKey, purgeVersion, force), executor, eventKeeper); + } finally { + pointerReadLock.unlock(); + } + } + + @Override + public CompletableFuture waitPurgeGranulesComplete(byte[] purgeKey, Executor executor) { + pointerReadLock.lock(); + try { + return new FutureVoid(Database_waitPurgeGranulesComplete(getPtr(), purgeKey), executor); + } finally { + pointerReadLock.unlock(); + } + } + @Override public Executor getExecutor() { return executor; @@ -215,4 +235,6 @@ protected void closeInternal(long cPtr) { private native void Database_dispose(long cPtr); private native void Database_setOption(long cPtr, int code, byte[] value) throws FDBException; private native double Database_getMainThreadBusyness(long cPtr); + private native long Database_purgeBlobGranules(long cPtr, byte[] beginKey, byte[] endKey, long purgeVersion, boolean force); + private native long Database_waitPurgeGranulesComplete(long cPtr, byte[] purgeKey); } \ No newline at end of file