3434import java .io .File ;
3535import java .io .IOException ;
3636import java .util .Arrays ;
37+ import java .util .concurrent .atomic .AtomicReference ;
3738
3839public abstract class AbstractNodeAllocationStrategy implements NodeAllocationStrategy {
3940 private static final Logger logger =
4041 LoggerFactory .getLogger (AbstractNodeAllocationStrategy .class );
4142 private static final CommonConfig commonConfig = CommonDescriptor .getInstance ().getConfig ();
4243
4344 // manage wal folders
44- protected FolderManager folderManager ;
45+ protected AtomicReference < FolderManager > folderManager = new AtomicReference <>() ;
4546
4647 protected AbstractNodeAllocationStrategy () {
4748 try {
48- folderManager =
49+ folderManager . set (
4950 new FolderManager (
50- Arrays .asList (commonConfig .getWalDirs ()), DirectoryStrategyType .SEQUENCE_STRATEGY );
51+ Arrays .asList (commonConfig .getWalDirs ()), DirectoryStrategyType .SEQUENCE_STRATEGY )) ;
5152 } catch (DiskSpaceInsufficientException e ) {
5253 logger .error (
5354 "Fail to create wal node allocation strategy because all disks of wal folders are full." ,
@@ -57,12 +58,16 @@ protected AbstractNodeAllocationStrategy() {
5758
5859 protected IWALNode createWALNode (String identifier ) {
5960 try {
60- if (folderManager == null ) {
61- folderManager = new FolderManager (
62- Arrays .asList (commonConfig .getWalDirs ()), DirectoryStrategyType .SEQUENCE_STRATEGY );
61+ // already in lock, so no need to synchronized
62+ if (folderManager .get () == null ) {
63+ folderManager .set (
64+ new FolderManager (
65+ Arrays .asList (commonConfig .getWalDirs ()), DirectoryStrategyType .SEQUENCE_STRATEGY ));
6366 }
64- return folderManager .getNextWithRetry (
65- folder -> new WALNode (identifier , folder + File .separator + identifier ));
67+ return folderManager
68+ .get ()
69+ .getNextWithRetry (
70+ folder -> new WALNode (identifier , folder + File .separator + identifier ));
6671 } catch (DiskSpaceInsufficientException e ) {
6772 logger .error ("Fail to create wal node because all disks of wal folders are full." , e );
6873 return WALFakeNode .getFailureInstance (e );
0 commit comments