I'm working with Accumulo 1.6.2 and I am seeing an issue where it appears that TableOperations.createTable
may return without an exception, but the table still isn't ready.
For example in the following code:
String tableName = "foo";
TableOperations operations = connector.tableOperations();
if(!operations.exists(tableName))
{
operations.createTable(tableName);
}
//Make a bunch of mutations that write to the table
BatchWriter batchWriter = connector.createBatchWriter(tableName, someConfig);
batchWriter.addMutations(mutations);
batchWriter.close();
When I run a unit test with the above code, I will sometimes get an exception indicating that table foo
does not exist. However, the code just created table foo
.
The only thing I can think of is that there is a window of time after createTable()
returns where the table still might not exist.
The Javadoc doesn't explain the behavior. I also have read an early release copy of Orielly's Accumulo book and it doesn't say either.
What is the correct pattern here? I could add something like the following:
//Make table
while(!operations.exists(tableName){}
//Do stuff with table
However that seems like a really ugly and potentially bug prone thing to do. I'm hoping there is a better pattern here.
Creating a table should be a synchronous operation. You should not see an exception with the above example.
If you can provide the specific exception, that might hint at a bug that needs to be fixed.