Thinking about this a bit more (and sorry for the back and forth on this), but there is still a race condition here, in that another client may have added an index after you calculated this list of tables to delete. So it'd be possible that you'd be missing an index table in this list.

To fix this, let's add a List<byte[]> droppedTables member variable to MetaDataMutationResult. Then in MetaDataEndPointImpl, populate this list in the dropTable and subsequent doDropTable call. Then, don't include the tableNamesToDelete argument here, but get it from the result returned. That'll prevent any race condition. Make sense?