1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 // 6 // This file implements the callback "bridge" between Java and C++ for 7 // rocksdb::EventListener. 8 9 #ifndef JAVA_ROCKSJNI_EVENT_LISTENER_JNICALLBACK_H_ 10 #define JAVA_ROCKSJNI_EVENT_LISTENER_JNICALLBACK_H_ 11 12 #include <jni.h> 13 14 #include <memory> 15 #include <set> 16 17 #include "rocksdb/listener.h" 18 #include "rocksjni/jnicallback.h" 19 20 namespace rocksdb { 21 22 enum EnabledEventCallback { 23 ON_FLUSH_COMPLETED = 0x0, 24 ON_FLUSH_BEGIN = 0x1, 25 ON_TABLE_FILE_DELETED = 0x2, 26 ON_COMPACTION_BEGIN = 0x3, 27 ON_COMPACTION_COMPLETED = 0x4, 28 ON_TABLE_FILE_CREATED = 0x5, 29 ON_TABLE_FILE_CREATION_STARTED = 0x6, 30 ON_MEMTABLE_SEALED = 0x7, 31 ON_COLUMN_FAMILY_HANDLE_DELETION_STARTED = 0x8, 32 ON_EXTERNAL_FILE_INGESTED = 0x9, 33 ON_BACKGROUND_ERROR = 0xA, 34 ON_STALL_CONDITIONS_CHANGED = 0xB, 35 ON_FILE_READ_FINISH = 0xC, 36 ON_FILE_WRITE_FINISH = 0xD, 37 ON_FILE_FLUSH_FINISH = 0xE, 38 ON_FILE_SYNC_FINISH = 0xF, 39 ON_FILE_RANGE_SYNC_FINISH = 0x10, 40 ON_FILE_TRUNCATE_FINISH = 0x11, 41 ON_FILE_CLOSE_FINISH = 0x12, 42 SHOULD_BE_NOTIFIED_ON_FILE_IO = 0x13, 43 ON_ERROR_RECOVERY_BEGIN = 0x14, 44 ON_ERROR_RECOVERY_COMPLETED = 0x15, 45 46 NUM_ENABLED_EVENT_CALLBACK = 0x16, 47 }; 48 49 class EventListenerJniCallback : public JniCallback, public EventListener { 50 public: 51 EventListenerJniCallback( 52 JNIEnv* env, jobject jevent_listener, 53 const std::set<EnabledEventCallback>& enabled_event_callbacks); 54 virtual ~EventListenerJniCallback(); 55 virtual void OnFlushCompleted(DB* db, const FlushJobInfo& flush_job_info); 56 virtual void OnFlushBegin(DB* db, const FlushJobInfo& flush_job_info); 57 virtual void OnTableFileDeleted(const TableFileDeletionInfo& info); 58 virtual void OnCompactionBegin(DB* db, const CompactionJobInfo& ci); 59 virtual void OnCompactionCompleted(DB* db, const CompactionJobInfo& ci); 60 virtual void OnTableFileCreated(const TableFileCreationInfo& info); 61 virtual void OnTableFileCreationStarted( 62 const TableFileCreationBriefInfo& info); 63 virtual void OnMemTableSealed(const MemTableInfo& info); 64 virtual void OnColumnFamilyHandleDeletionStarted(ColumnFamilyHandle* handle); 65 virtual void OnExternalFileIngested(DB* db, 66 const ExternalFileIngestionInfo& info); 67 virtual void OnBackgroundError(BackgroundErrorReason reason, 68 Status* bg_error); 69 virtual void OnStallConditionsChanged(const WriteStallInfo& info); 70 virtual void OnFileReadFinish(const FileOperationInfo& info); 71 virtual void OnFileWriteFinish(const FileOperationInfo& info); 72 virtual void OnFileFlushFinish(const FileOperationInfo& info); 73 virtual void OnFileSyncFinish(const FileOperationInfo& info); 74 virtual void OnFileRangeSyncFinish(const FileOperationInfo& info); 75 virtual void OnFileTruncateFinish(const FileOperationInfo& info); 76 virtual void OnFileCloseFinish(const FileOperationInfo& info); 77 virtual bool ShouldBeNotifiedOnFileIO(); 78 virtual void OnErrorRecoveryBegin(BackgroundErrorReason reason, 79 Status bg_error, bool* auto_recovery); 80 virtual void OnErrorRecoveryCompleted(Status old_bg_error); 81 82 private: 83 inline void InitCallbackMethodId(jmethodID& mid, EnabledEventCallback eec, 84 JNIEnv* env, 85 jmethodID (*get_id)(JNIEnv* env)); 86 template <class T> 87 inline jobject SetupCallbackInvocation( 88 JNIEnv*& env, jboolean& attached_thread, const T& cpp_obj, 89 jobject (*convert)(JNIEnv* env, const T* cpp_obj)); 90 inline void CleanupCallbackInvocation(JNIEnv* env, jboolean attached_thread, 91 std::initializer_list<jobject*> refs); 92 inline void OnFileOperation(const jmethodID& mid, 93 const FileOperationInfo& info); 94 95 const std::set<EnabledEventCallback> m_enabled_event_callbacks; 96 jmethodID m_on_flush_completed_proxy_mid; 97 jmethodID m_on_flush_begin_proxy_mid; 98 jmethodID m_on_table_file_deleted_mid; 99 jmethodID m_on_compaction_begin_proxy_mid; 100 jmethodID m_on_compaction_completed_proxy_mid; 101 jmethodID m_on_table_file_created_mid; 102 jmethodID m_on_table_file_creation_started_mid; 103 jmethodID m_on_mem_table_sealed_mid; 104 jmethodID m_on_column_family_handle_deletion_started_mid; 105 jmethodID m_on_external_file_ingested_proxy_mid; 106 jmethodID m_on_background_error_proxy_mid; 107 jmethodID m_on_stall_conditions_changed_mid; 108 jmethodID m_on_file_read_finish_mid; 109 jmethodID m_on_file_write_finish_mid; 110 jmethodID m_on_file_flush_finish_mid; 111 jmethodID m_on_file_sync_finish_mid; 112 jmethodID m_on_file_range_sync_finish_mid; 113 jmethodID m_on_file_truncate_finish_mid; 114 jmethodID m_on_file_close_finish_mid; 115 jmethodID m_should_be_notified_on_file_io; 116 jmethodID m_on_error_recovery_begin_proxy_mid; 117 jmethodID m_on_error_recovery_completed_mid; 118 }; 119 120 } // namespace rocksdb 121 122 #endif // JAVA_ROCKSJNI_EVENT_LISTENER_JNICALLBACK_H_ 123