1 /*
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20 package org.apache.hadoop.hbase.coprocessor;
21
22 import java.io.IOException;
23 import java.util.List;
24
25 import org.apache.hadoop.classification.InterfaceAudience;
26 import org.apache.hadoop.classification.InterfaceStability;
27 import org.apache.hadoop.hbase.Coprocessor;
28 import org.apache.hadoop.hbase.HColumnDescriptor;
29 import org.apache.hadoop.hbase.HRegionInfo;
30 import org.apache.hadoop.hbase.HTableDescriptor;
31 import org.apache.hadoop.hbase.ServerName;
32 import org.apache.hadoop.hbase.master.RegionPlan;
33 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
34
35 /**
36 * Defines coprocessor hooks for interacting with operations on the
37 * {@link org.apache.hadoop.hbase.master.HMaster} process.
38 */
39 @InterfaceAudience.Public
40 @InterfaceStability.Evolving
41 public interface MasterObserver extends Coprocessor {
42
43 /**
44 * Called before a new table is created by
45 * {@link org.apache.hadoop.hbase.master.HMaster}. Called as part of create
46 * table RPC call.
47 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
48 * @param ctx the environment to interact with the framework and master
49 * @param desc the HTableDescriptor for the table
50 * @param regions the initial regions created for the table
51 * @throws IOException
52 */
53 void preCreateTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
54 HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
55
56 /**
57 * Called after the createTable operation has been requested. Called as part
58 * of create table RPC call.
59 * @param ctx the environment to interact with the framework and master
60 * @param desc the HTableDescriptor for the table
61 * @param regions the initial regions created for the table
62 * @throws IOException
63 */
64 void postCreateTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
65 HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
66 /**
67 * Called before a new table is created by
68 * {@link org.apache.hadoop.hbase.master.HMaster}. Called as part of create
69 * table handler and it is async to the create RPC call.
70 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
71 * @param ctx the environment to interact with the framework and master
72 * @param desc the HTableDescriptor for the table
73 * @param regions the initial regions created for the table
74 * @throws IOException
75 */
76 void preCreateTableHandler(final ObserverContext<MasterCoprocessorEnvironment>
77 ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
78
79 /**
80 * Called after the createTable operation has been requested. Called as part
81 * of create table RPC call. Called as part of create table handler and
82 * it is async to the create RPC call.
83 * @param ctx the environment to interact with the framework and master
84 * @param desc the HTableDescriptor for the table
85 * @param regions the initial regions created for the table
86 * @throws IOException
87 */
88 void postCreateTableHandler(final ObserverContext<MasterCoprocessorEnvironment>
89 ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
90
91 /**
92 * Called before {@link org.apache.hadoop.hbase.master.HMaster} deletes a
93 * table. Called as part of delete table RPC call.
94 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
95 * @param ctx the environment to interact with the framework and master
96 * @param tableName the name of the table
97 */
98 void preDeleteTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
99 byte[] tableName) throws IOException;
100
101 /**
102 * Called after the deleteTable operation has been requested. Called as part
103 * of delete table RPC call.
104 * @param ctx the environment to interact with the framework and master
105 * @param tableName the name of the table
106 */
107 void postDeleteTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
108 byte[] tableName) throws IOException;
109
110 /**
111 * Called before {@link org.apache.hadoop.hbase.master.HMaster} deletes a
112 * table. Called as part of delete table handler and
113 * it is async to the delete RPC call.
114 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
115 * @param ctx the environment to interact with the framework and master
116 * @param tableName the name of the table
117 */
118 void preDeleteTableHandler(
119 final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
120 throws IOException;
121
122 /**
123 * Called after {@link org.apache.hadoop.hbase.master.HMaster} deletes a
124 * table. Called as part of delete table handler and it is async to the
125 * delete RPC call.
126 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
127 * @param ctx the environment to interact with the framework and master
128 * @param tableName the name of the table
129 */
130 void postDeleteTableHandler(
131 final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
132 throws IOException;
133
134 /**
135 * Called prior to modifying a table's properties. Called as part of modify
136 * table RPC call.
137 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
138 * @param ctx the environment to interact with the framework and master
139 * @param tableName the name of the table
140 * @param htd the HTableDescriptor
141 */
142 void preModifyTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
143 final byte[] tableName, HTableDescriptor htd) throws IOException;
144
145 /**
146 * Called after the modifyTable operation has been requested. Called as part
147 * of modify table RPC call.
148 * @param ctx the environment to interact with the framework and master
149 * @param tableName the name of the table
150 * @param htd the HTableDescriptor
151 */
152 void postModifyTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
153 final byte[] tableName, HTableDescriptor htd) throws IOException;
154
155 /**
156 * Called prior to modifying a table's properties. Called as part of modify
157 * table handler and it is async to the modify table RPC call.
158 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
159 * @param ctx the environment to interact with the framework and master
160 * @param tableName the name of the table
161 * @param htd the HTableDescriptor
162 */
163 void preModifyTableHandler(
164 final ObserverContext<MasterCoprocessorEnvironment> ctx,
165 final byte[] tableName, HTableDescriptor htd) throws IOException;
166
167 /**
168 * Called after to modifying a table's properties. Called as part of modify
169 * table handler and it is async to the modify table RPC call.
170 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
171 * @param ctx the environment to interact with the framework and master
172 * @param tableName the name of the table
173 * @param htd the HTableDescriptor
174 */
175 void postModifyTableHandler(
176 final ObserverContext<MasterCoprocessorEnvironment> ctx,
177 final byte[] tableName, HTableDescriptor htd) throws IOException;
178
179 /**
180 * Called prior to adding a new column family to the table. Called as part of
181 * add column RPC call.
182 * @param ctx the environment to interact with the framework and master
183 * @param tableName the name of the table
184 * @param column the HColumnDescriptor
185 */
186 void preAddColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
187 byte[] tableName, HColumnDescriptor column) throws IOException;
188
189 /**
190 * Called after the new column family has been created. Called as part of
191 * add column RPC call.
192 * @param ctx the environment to interact with the framework and master
193 * @param tableName the name of the table
194 * @param column the HColumnDescriptor
195 */
196 void postAddColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
197 byte[] tableName, HColumnDescriptor column) throws IOException;
198
199 /**
200 * Called prior to adding a new column family to the table. Called as part of
201 * add column handler.
202 * @param ctx the environment to interact with the framework and master
203 * @param tableName the name of the table
204 * @param column the HColumnDescriptor
205 */
206 void preAddColumnHandler(
207 final ObserverContext<MasterCoprocessorEnvironment> ctx,
208 byte[] tableName, HColumnDescriptor column) throws IOException;
209
210 /**
211 * Called after the new column family has been created. Called as part of
212 * add column handler.
213 * @param ctx the environment to interact with the framework and master
214 * @param tableName the name of the table
215 * @param column the HColumnDescriptor
216 */
217 void postAddColumnHandler(
218 final ObserverContext<MasterCoprocessorEnvironment> ctx,
219 byte[] tableName, HColumnDescriptor column) throws IOException;
220
221 /**
222 * Called prior to modifying a column family's attributes. Called as part of
223 * modify column RPC call.
224 * @param ctx the environment to interact with the framework and master
225 * @param tableName the name of the table
226 * @param descriptor the HColumnDescriptor
227 */
228 void preModifyColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
229 byte [] tableName, HColumnDescriptor descriptor) throws IOException;
230
231 /**
232 * Called after the column family has been updated. Called as part of modify
233 * column RPC call.
234 * @param ctx the environment to interact with the framework and master
235 * @param tableName the name of the table
236 * @param descriptor the HColumnDescriptor
237 */
238 void postModifyColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
239 byte[] tableName, HColumnDescriptor descriptor) throws IOException;
240
241 /**
242 * Called prior to modifying a column family's attributes. Called as part of
243 * modify column handler.
244 * @param ctx the environment to interact with the framework and master
245 * @param tableName the name of the table
246 * @param descriptor the HColumnDescriptor
247 */
248 void preModifyColumnHandler(
249 final ObserverContext<MasterCoprocessorEnvironment> ctx,
250 byte[] tableName, HColumnDescriptor descriptor) throws IOException;
251
252 /**
253 * Called after the column family has been updated. Called as part of modify
254 * column handler.
255 * @param ctx the environment to interact with the framework and master
256 * @param tableName the name of the table
257 * @param descriptor the HColumnDescriptor
258 */
259 void postModifyColumnHandler(
260 final ObserverContext<MasterCoprocessorEnvironment> ctx,
261 byte[] tableName, HColumnDescriptor descriptor) throws IOException;
262
263
264 /**
265 * Called prior to deleting the entire column family. Called as part of
266 * delete column RPC call.
267 * @param ctx the environment to interact with the framework and master
268 * @param tableName the name of the table
269 * @param c the column
270 */
271 void preDeleteColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
272 final byte [] tableName, final byte[] c) throws IOException;
273
274 /**
275 * Called after the column family has been deleted. Called as part of delete
276 * column RPC call.
277 * @param ctx the environment to interact with the framework and master
278 * @param tableName the name of the table
279 * @param c the column
280 */
281 void postDeleteColumn(final ObserverContext<MasterCoprocessorEnvironment> ctx,
282 final byte [] tableName, final byte[] c) throws IOException;
283
284 /**
285 * Called prior to deleting the entire column family. Called as part of
286 * delete column handler.
287 * @param ctx the environment to interact with the framework and master
288 * @param tableName the name of the table
289 * @param c the column
290 */
291 void preDeleteColumnHandler(
292 final ObserverContext<MasterCoprocessorEnvironment> ctx,
293 final byte[] tableName, final byte[] c) throws IOException;
294
295 /**
296 * Called after the column family has been deleted. Called as part of
297 * delete column handler.
298 * @param ctx the environment to interact with the framework and master
299 * @param tableName the name of the table
300 * @param c the column
301 */
302 void postDeleteColumnHandler(
303 final ObserverContext<MasterCoprocessorEnvironment> ctx,
304 final byte[] tableName, final byte[] c) throws IOException;
305
306 /**
307 * Called prior to enabling a table. Called as part of enable table RPC call.
308 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
309 * @param ctx the environment to interact with the framework and master
310 * @param tableName the name of the table
311 */
312 void preEnableTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
313 final byte[] tableName) throws IOException;
314
315 /**
316 * Called after the enableTable operation has been requested. Called as part
317 * of enable table RPC call.
318 * @param ctx the environment to interact with the framework and master
319 * @param tableName the name of the table
320 */
321 void postEnableTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
322 final byte[] tableName) throws IOException;
323
324 /**
325 * Called prior to enabling a table. Called as part of enable table handler
326 * and it is async to the enable table RPC call.
327 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
328 * @param ctx the environment to interact with the framework and master
329 * @param tableName the name of the table
330 */
331 void preEnableTableHandler(
332 final ObserverContext<MasterCoprocessorEnvironment> ctx,
333 final byte[] tableName) throws IOException;
334
335 /**
336 * Called after the enableTable operation has been requested. Called as part
337 * of enable table handler and it is async to the enable table RPC call.
338 * @param ctx the environment to interact with the framework and master
339 * @param tableName the name of the table
340 */
341 void postEnableTableHandler(
342 final ObserverContext<MasterCoprocessorEnvironment> ctx,
343 final byte[] tableName) throws IOException;
344
345 /**
346 * Called prior to disabling a table. Called as part of disable table RPC
347 * call.
348 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
349 * @param ctx the environment to interact with the framework and master
350 * @param tableName the name of the table
351 */
352 void preDisableTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
353 final byte[] tableName) throws IOException;
354
355 /**
356 * Called after the disableTable operation has been requested. Called as part
357 * of disable table RPC call.
358 * @param ctx the environment to interact with the framework and master
359 * @param tableName the name of the table
360 */
361 void postDisableTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
362 final byte[] tableName) throws IOException;
363
364 /**
365 * Called prior to disabling a table. Called as part of disable table handler
366 * and it is asyn to the disable table RPC call.
367 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
368 * @param ctx the environment to interact with the framework and master
369 * @param tableName the name of the table
370 */
371 void preDisableTableHandler(
372 final ObserverContext<MasterCoprocessorEnvironment> ctx,
373 final byte[] tableName) throws IOException;
374
375 /**
376 * Called after the disableTable operation has been requested. Called as part
377 * of disable table handler and it is asyn to the disable table RPC call.
378 * @param ctx the environment to interact with the framework and master
379 * @param tableName the name of the table
380 */
381 void postDisableTableHandler(
382 final ObserverContext<MasterCoprocessorEnvironment> ctx,
383 final byte[] tableName) throws IOException;
384
385 /**
386 * Called prior to moving a given region from one region server to another.
387 * @param ctx the environment to interact with the framework and master
388 * @param region the HRegionInfo
389 * @param srcServer the source ServerName
390 * @param destServer the destination ServerName
391 */
392 void preMove(final ObserverContext<MasterCoprocessorEnvironment> ctx,
393 final HRegionInfo region, final ServerName srcServer,
394 final ServerName destServer)
395 throws IOException;
396
397 /**
398 * Called after the region move has been requested.
399 * @param ctx the environment to interact with the framework and master
400 * @param region the HRegionInfo
401 * @param srcServer the source ServerName
402 * @param destServer the destination ServerName
403 */
404 void postMove(final ObserverContext<MasterCoprocessorEnvironment> ctx,
405 final HRegionInfo region, final ServerName srcServer,
406 final ServerName destServer)
407 throws IOException;
408
409 /**
410 * Called prior to assigning a specific region.
411 * @param ctx the environment to interact with the framework and master
412 * @param regionInfo the regionInfo of the region
413 */
414 void preAssign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
415 final HRegionInfo regionInfo) throws IOException;
416
417 /**
418 * Called after the region assignment has been requested.
419 * @param ctx the environment to interact with the framework and master
420 * @param regionInfo the regionInfo of the region
421 */
422 void postAssign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
423 final HRegionInfo regionInfo) throws IOException;
424
425 /**
426 * Called prior to unassigning a given region.
427 * @param ctx the environment to interact with the framework and master
428 * @param regionInfo
429 * @param force whether to force unassignment or not
430 */
431 void preUnassign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
432 final HRegionInfo regionInfo, final boolean force) throws IOException;
433
434 /**
435 * Called after the region unassignment has been requested.
436 * @param ctx the environment to interact with the framework and master
437 * @param regionInfo
438 * @param force whether to force unassignment or not
439 */
440 void postUnassign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
441 final HRegionInfo regionInfo, final boolean force) throws IOException;
442
443 /**
444 * Called prior to marking a given region as offline. <code>ctx.bypass()</code> will not have any
445 * impact on this hook.
446 * @param ctx the environment to interact with the framework and master
447 * @param regionInfo
448 */
449 void preRegionOffline(final ObserverContext<MasterCoprocessorEnvironment> ctx,
450 final HRegionInfo regionInfo) throws IOException;
451
452 /**
453 * Called after the region has been marked offline.
454 * @param ctx the environment to interact with the framework and master
455 * @param regionInfo
456 */
457 void postRegionOffline(final ObserverContext<MasterCoprocessorEnvironment> ctx,
458 final HRegionInfo regionInfo) throws IOException;
459
460 /**
461 * Called prior to requesting rebalancing of the cluster regions, though after
462 * the initial checks for regions in transition and the balance switch flag.
463 * @param ctx the environment to interact with the framework and master
464 */
465 void preBalance(final ObserverContext<MasterCoprocessorEnvironment> ctx)
466 throws IOException;
467
468 /**
469 * Called after the balancing plan has been submitted.
470 * @param ctx the environment to interact with the framework and master
471 * @param plans the RegionPlans which master has executed. RegionPlan serves as hint
472 * as for the final destination for the underlying region but may not represent the
473 * final state of assignment
474 */
475 void postBalance(final ObserverContext<MasterCoprocessorEnvironment> ctx, List<RegionPlan> plans)
476 throws IOException;
477
478 /**
479 * Called prior to modifying the flag used to enable/disable region balancing.
480 * @param ctx the coprocessor instance's environment
481 * @param newValue the new flag value submitted in the call
482 */
483 boolean preBalanceSwitch(final ObserverContext<MasterCoprocessorEnvironment> ctx,
484 final boolean newValue) throws IOException;
485
486 /**
487 * Called after the flag to enable/disable balancing has changed.
488 * @param ctx the coprocessor instance's environment
489 * @param oldValue the previously set balanceSwitch value
490 * @param newValue the newly set balanceSwitch value
491 */
492 void postBalanceSwitch(final ObserverContext<MasterCoprocessorEnvironment> ctx,
493 final boolean oldValue, final boolean newValue) throws IOException;
494
495 /**
496 * Called prior to shutting down the full HBase cluster, including this
497 * {@link org.apache.hadoop.hbase.master.HMaster} process.
498 */
499 void preShutdown(final ObserverContext<MasterCoprocessorEnvironment> ctx)
500 throws IOException;
501
502
503 /**
504 * Called immediately prior to stopping this
505 * {@link org.apache.hadoop.hbase.master.HMaster} process.
506 */
507 void preStopMaster(final ObserverContext<MasterCoprocessorEnvironment> ctx)
508 throws IOException;
509
510 /**
511 * Called immediately after an active master instance has completed
512 * initialization. Will not be called on standby master instances unless
513 * they take over the active role.
514 */
515 void postStartMaster(final ObserverContext<MasterCoprocessorEnvironment> ctx)
516 throws IOException;
517
518 /**
519 * Called before a new snapshot is taken.
520 * Called as part of snapshot RPC call.
521 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
522 * @param ctx the environment to interact with the framework and master
523 * @param snapshot the SnapshotDescriptor for the snapshot
524 * @param hTableDescriptor the hTableDescriptor of the table to snapshot
525 * @throws IOException
526 */
527 void preSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
528 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
529 throws IOException;
530
531 /**
532 * Called after the snapshot operation has been requested.
533 * Called as part of snapshot RPC call.
534 * @param ctx the environment to interact with the framework and master
535 * @param snapshot the SnapshotDescriptor for the snapshot
536 * @param hTableDescriptor the hTableDescriptor of the table to snapshot
537 * @throws IOException
538 */
539 void postSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
540 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
541 throws IOException;
542
543 /**
544 * Called before a snapshot is cloned.
545 * Called as part of restoreSnapshot RPC call.
546 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
547 * @param ctx the environment to interact with the framework and master
548 * @param snapshot the SnapshotDescriptor for the snapshot
549 * @param hTableDescriptor the hTableDescriptor of the table to create
550 * @throws IOException
551 */
552 void preCloneSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
553 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
554 throws IOException;
555
556 /**
557 * Called after a snapshot clone operation has been requested.
558 * Called as part of restoreSnapshot RPC call.
559 * @param ctx the environment to interact with the framework and master
560 * @param snapshot the SnapshotDescriptor for the snapshot
561 * @param hTableDescriptor the hTableDescriptor of the table to create
562 * @throws IOException
563 */
564 void postCloneSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
565 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
566 throws IOException;
567
568 /**
569 * Called before a snapshot is restored.
570 * Called as part of restoreSnapshot RPC call.
571 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
572 * @param ctx the environment to interact with the framework and master
573 * @param snapshot the SnapshotDescriptor for the snapshot
574 * @param hTableDescriptor the hTableDescriptor of the table to restore
575 * @throws IOException
576 */
577 void preRestoreSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
578 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
579 throws IOException;
580
581 /**
582 * Called after a snapshot restore operation has been requested.
583 * Called as part of restoreSnapshot RPC call.
584 * @param ctx the environment to interact with the framework and master
585 * @param snapshot the SnapshotDescriptor for the snapshot
586 * @param hTableDescriptor the hTableDescriptor of the table to restore
587 * @throws IOException
588 */
589 void postRestoreSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
590 final SnapshotDescription snapshot, final HTableDescriptor hTableDescriptor)
591 throws IOException;
592
593 /**
594 * Called before a snapshot is deleted.
595 * Called as part of deleteSnapshot RPC call.
596 * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
597 * @param ctx the environment to interact with the framework and master
598 * @param snapshot the SnapshotDescriptor of the snapshot to delete
599 * @throws IOException
600 */
601 void preDeleteSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
602 final SnapshotDescription snapshot) throws IOException;
603
604 /**
605 * Called after the delete snapshot operation has been requested.
606 * Called as part of deleteSnapshot RPC call.
607 * @param ctx the environment to interact with the framework and master
608 * @param snapshot the SnapshotDescriptor of the snapshot to delete
609 * @throws IOException
610 */
611 void postDeleteSnapshot(final ObserverContext<MasterCoprocessorEnvironment> ctx,
612 final SnapshotDescription snapshot) throws IOException;
613 }