]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
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 | package org.rocksdb; | |
7 | ||
8 | import static org.rocksdb.AbstractEventListener.EnabledEventCallback.*; | |
9 | ||
10 | /** | |
11 | * Base class for Event Listeners. | |
12 | */ | |
13 | public abstract class AbstractEventListener extends RocksCallbackObject implements EventListener { | |
14 | public enum EnabledEventCallback { | |
15 | ON_FLUSH_COMPLETED((byte) 0x0), | |
16 | ON_FLUSH_BEGIN((byte) 0x1), | |
17 | ON_TABLE_FILE_DELETED((byte) 0x2), | |
18 | ON_COMPACTION_BEGIN((byte) 0x3), | |
19 | ON_COMPACTION_COMPLETED((byte) 0x4), | |
20 | ON_TABLE_FILE_CREATED((byte) 0x5), | |
21 | ON_TABLE_FILE_CREATION_STARTED((byte) 0x6), | |
22 | ON_MEMTABLE_SEALED((byte) 0x7), | |
23 | ON_COLUMN_FAMILY_HANDLE_DELETION_STARTED((byte) 0x8), | |
24 | ON_EXTERNAL_FILE_INGESTED((byte) 0x9), | |
25 | ON_BACKGROUND_ERROR((byte) 0xA), | |
26 | ON_STALL_CONDITIONS_CHANGED((byte) 0xB), | |
27 | ON_FILE_READ_FINISH((byte) 0xC), | |
28 | ON_FILE_WRITE_FINISH((byte) 0xD), | |
29 | ON_FILE_FLUSH_FINISH((byte) 0xE), | |
30 | ON_FILE_SYNC_FINISH((byte) 0xF), | |
31 | ON_FILE_RANGE_SYNC_FINISH((byte) 0x10), | |
32 | ON_FILE_TRUNCATE_FINISH((byte) 0x11), | |
33 | ON_FILE_CLOSE_FINISH((byte) 0x12), | |
34 | SHOULD_BE_NOTIFIED_ON_FILE_IO((byte) 0x13), | |
35 | ON_ERROR_RECOVERY_BEGIN((byte) 0x14), | |
36 | ON_ERROR_RECOVERY_COMPLETED((byte) 0x15); | |
37 | ||
38 | private final byte value; | |
39 | ||
40 | EnabledEventCallback(final byte value) { | |
41 | this.value = value; | |
42 | } | |
43 | ||
44 | /** | |
45 | * Get the internal representation value. | |
46 | * | |
47 | * @return the internal representation value | |
48 | */ | |
49 | byte getValue() { | |
50 | return value; | |
51 | } | |
52 | ||
53 | /** | |
54 | * Get the EnabledEventCallbacks from the internal representation value. | |
55 | * | |
56 | * @return the enabled event callback. | |
57 | * | |
58 | * @throws IllegalArgumentException if the value is unknown. | |
59 | */ | |
60 | static EnabledEventCallback fromValue(final byte value) { | |
61 | for (final EnabledEventCallback enabledEventCallback : EnabledEventCallback.values()) { | |
62 | if (enabledEventCallback.value == value) { | |
63 | return enabledEventCallback; | |
64 | } | |
65 | } | |
66 | ||
67 | throw new IllegalArgumentException( | |
68 | "Illegal value provided for EnabledEventCallback: " + value); | |
69 | } | |
70 | } | |
71 | ||
72 | /** | |
73 | * Creates an Event Listener that will | |
74 | * received all callbacks from C++. | |
75 | * | |
76 | * If you don't need all callbacks, it is much more efficient to | |
77 | * just register for the ones you need by calling | |
78 | * {@link #AbstractEventListener(EnabledEventCallback...)} instead. | |
79 | */ | |
80 | protected AbstractEventListener() { | |
81 | this(ON_FLUSH_COMPLETED, ON_FLUSH_BEGIN, ON_TABLE_FILE_DELETED, ON_COMPACTION_BEGIN, | |
82 | ON_COMPACTION_COMPLETED, ON_TABLE_FILE_CREATED, ON_TABLE_FILE_CREATION_STARTED, | |
83 | ON_MEMTABLE_SEALED, ON_COLUMN_FAMILY_HANDLE_DELETION_STARTED, ON_EXTERNAL_FILE_INGESTED, | |
84 | ON_BACKGROUND_ERROR, ON_STALL_CONDITIONS_CHANGED, ON_FILE_READ_FINISH, ON_FILE_WRITE_FINISH, | |
85 | ON_FILE_FLUSH_FINISH, ON_FILE_SYNC_FINISH, ON_FILE_RANGE_SYNC_FINISH, | |
86 | ON_FILE_TRUNCATE_FINISH, ON_FILE_CLOSE_FINISH, SHOULD_BE_NOTIFIED_ON_FILE_IO, | |
87 | ON_ERROR_RECOVERY_BEGIN, ON_ERROR_RECOVERY_COMPLETED); | |
88 | } | |
89 | ||
90 | /** | |
91 | * Creates an Event Listener that will | |
92 | * receive only certain callbacks from C++. | |
93 | * | |
94 | * @param enabledEventCallbacks callbacks to enable in Java. | |
95 | */ | |
96 | protected AbstractEventListener(final EnabledEventCallback... enabledEventCallbacks) { | |
97 | super(packToLong(enabledEventCallbacks)); | |
98 | } | |
99 | ||
100 | /** | |
101 | * Pack EnabledEventCallbacks to a long. | |
102 | * | |
103 | * @param enabledEventCallbacks the flags | |
104 | * | |
105 | * @return a long | |
106 | */ | |
107 | private static long packToLong(final EnabledEventCallback... enabledEventCallbacks) { | |
108 | long l = 0; | |
109 | for (int i = 0; i < enabledEventCallbacks.length; i++) { | |
110 | l |= 1 << enabledEventCallbacks[i].getValue(); | |
111 | } | |
112 | return l; | |
113 | } | |
114 | ||
115 | @Override | |
116 | public void onFlushCompleted(final RocksDB db, final FlushJobInfo flushJobInfo) { | |
117 | // no-op | |
118 | } | |
119 | ||
120 | /** | |
121 | * Called from JNI, proxy for | |
122 | * {@link #onFlushCompleted(RocksDB, FlushJobInfo)}. | |
123 | * | |
124 | * @param dbHandle native handle of the database | |
125 | * @param flushJobInfo the flush job info | |
126 | */ | |
127 | private void onFlushCompletedProxy(final long dbHandle, final FlushJobInfo flushJobInfo) { | |
128 | final RocksDB db = new RocksDB(dbHandle); | |
129 | db.disOwnNativeHandle(); // we don't own this! | |
130 | onFlushCompleted(db, flushJobInfo); | |
131 | } | |
132 | ||
133 | @Override | |
134 | public void onFlushBegin(final RocksDB db, final FlushJobInfo flushJobInfo) { | |
135 | // no-op | |
136 | } | |
137 | ||
138 | /** | |
139 | * Called from JNI, proxy for | |
140 | * {@link #onFlushBegin(RocksDB, FlushJobInfo)}. | |
141 | * | |
142 | * @param dbHandle native handle of the database | |
143 | * @param flushJobInfo the flush job info | |
144 | */ | |
145 | private void onFlushBeginProxy(final long dbHandle, final FlushJobInfo flushJobInfo) { | |
146 | final RocksDB db = new RocksDB(dbHandle); | |
147 | db.disOwnNativeHandle(); // we don't own this! | |
148 | onFlushBegin(db, flushJobInfo); | |
149 | } | |
150 | ||
151 | @Override | |
152 | public void onTableFileDeleted(final TableFileDeletionInfo tableFileDeletionInfo) { | |
153 | // no-op | |
154 | } | |
155 | ||
156 | @Override | |
157 | public void onCompactionBegin(final RocksDB db, final CompactionJobInfo compactionJobInfo) { | |
158 | // no-op | |
159 | } | |
160 | ||
161 | /** | |
162 | * Called from JNI, proxy for | |
163 | * {@link #onCompactionBegin(RocksDB, CompactionJobInfo)}. | |
164 | * | |
165 | * @param dbHandle native handle of the database | |
166 | * @param compactionJobInfo the flush job info | |
167 | */ | |
168 | private void onCompactionBeginProxy( | |
169 | final long dbHandle, final CompactionJobInfo compactionJobInfo) { | |
170 | final RocksDB db = new RocksDB(dbHandle); | |
171 | db.disOwnNativeHandle(); // we don't own this! | |
172 | onCompactionBegin(db, compactionJobInfo); | |
173 | } | |
174 | ||
175 | @Override | |
176 | public void onCompactionCompleted(final RocksDB db, final CompactionJobInfo compactionJobInfo) { | |
177 | // no-op | |
178 | } | |
179 | ||
180 | /** | |
181 | * Called from JNI, proxy for | |
182 | * {@link #onCompactionCompleted(RocksDB, CompactionJobInfo)}. | |
183 | * | |
184 | * @param dbHandle native handle of the database | |
185 | * @param compactionJobInfo the flush job info | |
186 | */ | |
187 | private void onCompactionCompletedProxy( | |
188 | final long dbHandle, final CompactionJobInfo compactionJobInfo) { | |
189 | final RocksDB db = new RocksDB(dbHandle); | |
190 | db.disOwnNativeHandle(); // we don't own this! | |
191 | onCompactionCompleted(db, compactionJobInfo); | |
192 | } | |
193 | ||
194 | @Override | |
195 | public void onTableFileCreated(final TableFileCreationInfo tableFileCreationInfo) { | |
196 | // no-op | |
197 | } | |
198 | ||
199 | @Override | |
200 | public void onTableFileCreationStarted( | |
201 | final TableFileCreationBriefInfo tableFileCreationBriefInfo) { | |
202 | // no-op | |
203 | } | |
204 | ||
205 | @Override | |
206 | public void onMemTableSealed(final MemTableInfo memTableInfo) { | |
207 | // no-op | |
208 | } | |
209 | ||
210 | @Override | |
211 | public void onColumnFamilyHandleDeletionStarted(final ColumnFamilyHandle columnFamilyHandle) { | |
212 | // no-op | |
213 | } | |
214 | ||
215 | @Override | |
216 | public void onExternalFileIngested( | |
217 | final RocksDB db, final ExternalFileIngestionInfo externalFileIngestionInfo) { | |
218 | // no-op | |
219 | } | |
220 | ||
221 | /** | |
222 | * Called from JNI, proxy for | |
223 | * {@link #onExternalFileIngested(RocksDB, ExternalFileIngestionInfo)}. | |
224 | * | |
225 | * @param dbHandle native handle of the database | |
226 | * @param externalFileIngestionInfo the flush job info | |
227 | */ | |
228 | private void onExternalFileIngestedProxy( | |
229 | final long dbHandle, final ExternalFileIngestionInfo externalFileIngestionInfo) { | |
230 | final RocksDB db = new RocksDB(dbHandle); | |
231 | db.disOwnNativeHandle(); // we don't own this! | |
232 | onExternalFileIngested(db, externalFileIngestionInfo); | |
233 | } | |
234 | ||
235 | @Override | |
236 | public void onBackgroundError( | |
237 | final BackgroundErrorReason backgroundErrorReason, final Status backgroundError) { | |
238 | // no-op | |
239 | } | |
240 | ||
241 | /** | |
242 | * Called from JNI, proxy for | |
243 | * {@link #onBackgroundError(BackgroundErrorReason, Status)}. | |
244 | * | |
245 | * @param reasonByte byte value representing error reason | |
246 | * @param backgroundError status with error code | |
247 | */ | |
248 | private void onBackgroundErrorProxy(final byte reasonByte, final Status backgroundError) { | |
249 | onBackgroundError(BackgroundErrorReason.fromValue(reasonByte), backgroundError); | |
250 | } | |
251 | ||
252 | @Override | |
253 | public void onStallConditionsChanged(final WriteStallInfo writeStallInfo) { | |
254 | // no-op | |
255 | } | |
256 | ||
257 | @Override | |
258 | public void onFileReadFinish(final FileOperationInfo fileOperationInfo) { | |
259 | // no-op | |
260 | } | |
261 | ||
262 | @Override | |
263 | public void onFileWriteFinish(final FileOperationInfo fileOperationInfo) { | |
264 | // no-op | |
265 | } | |
266 | ||
267 | @Override | |
268 | public void onFileFlushFinish(final FileOperationInfo fileOperationInfo) { | |
269 | // no-op | |
270 | } | |
271 | ||
272 | @Override | |
273 | public void onFileSyncFinish(final FileOperationInfo fileOperationInfo) { | |
274 | // no-op | |
275 | } | |
276 | ||
277 | @Override | |
278 | public void onFileRangeSyncFinish(final FileOperationInfo fileOperationInfo) { | |
279 | // no-op | |
280 | } | |
281 | ||
282 | @Override | |
283 | public void onFileTruncateFinish(final FileOperationInfo fileOperationInfo) { | |
284 | // no-op | |
285 | } | |
286 | ||
287 | @Override | |
288 | public void onFileCloseFinish(final FileOperationInfo fileOperationInfo) { | |
289 | // no-op | |
290 | } | |
291 | ||
292 | @Override | |
293 | public boolean shouldBeNotifiedOnFileIO() { | |
294 | return false; | |
295 | } | |
296 | ||
297 | @Override | |
298 | public boolean onErrorRecoveryBegin( | |
299 | final BackgroundErrorReason backgroundErrorReason, final Status backgroundError) { | |
300 | return true; | |
301 | } | |
302 | ||
303 | /** | |
304 | * Called from JNI, proxy for | |
305 | * {@link #onErrorRecoveryBegin(BackgroundErrorReason, Status)}. | |
306 | * | |
307 | * @param reasonByte byte value representing error reason | |
308 | * @param backgroundError status with error code | |
309 | */ | |
310 | private boolean onErrorRecoveryBeginProxy(final byte reasonByte, final Status backgroundError) { | |
311 | return onErrorRecoveryBegin(BackgroundErrorReason.fromValue(reasonByte), backgroundError); | |
312 | } | |
313 | ||
314 | @Override | |
315 | public void onErrorRecoveryCompleted(final Status oldBackgroundError) { | |
316 | // no-op | |
317 | } | |
318 | ||
319 | @Override | |
320 | protected long initializeNative(final long... nativeParameterHandles) { | |
321 | return createNewEventListener(nativeParameterHandles[0]); | |
322 | } | |
323 | ||
324 | /** | |
325 | * Deletes underlying C++ native callback object pointer | |
326 | */ | |
327 | @Override | |
328 | protected void disposeInternal() { | |
329 | disposeInternal(nativeHandle_); | |
330 | } | |
331 | ||
332 | private native long createNewEventListener(final long enabledEventCallbackValues); | |
333 | private native void disposeInternal(final long handle); | |
334 | } |