Why extra spacing:
+ private int logRollRetryCount;
Can these be final? Are they set in the Constructor?
Why not just set it back to a default with a log that this has happened rather than fail the precondition?
+ Preconditions.checkArgument(this.logRollRetryCount > 0,
+ "Log Roll retry count should be a positive number");
What is this about?
+ // there may be a case when fs has just become available; one can do one more retry
+ if (fsOk) throw ioe;
So if fs is ok, we throw the ioe? Should we not go around again and retry? (In comment says 'there may be a case'.. what is the case?
Are we incrementing in the for loop and below again when we do + i++; ? (i.e. incrementing in two places?)
Do you think we should pause here:
How long is default?
Are we holding up all writes when we are paused like this?
Looks like duplicated code. Could it be avoided?
You add a new method to FSUtils but its guts are from checkFileSystemAvailable. Why not make it so you do not duplicate code, have checkFileSystemAvailable call your new method or factor out a private method that both could use?