@ -104,6 +104,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
"[{}][{}] Stopping entity actor due to change partition event." :
"[{}][{}] Stopping entity actor due to change partition event." :
"[{}][{}] Stopping entity actor." ,
"[{}][{}] Stopping entity actor." ,
tenantId , entityId ) ;
tenantId , entityId ) ;
states . values ( ) . forEach ( this : : closeState ) ;
states . clear ( ) ;
states . clear ( ) ;
actorCtx . stop ( actorCtx . getSelf ( ) ) ;
actorCtx . stop ( actorCtx . getSelf ( ) ) ;
}
}
@ -123,7 +124,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
state . setPartition ( msg . getPartition ( ) ) ;
state . setPartition ( msg . getPartition ( ) ) ;
states . put ( cfId , state ) ;
states . put ( cfId , state ) ;
} else {
} else {
states . remove ( cfId ) ;
removeStat e ( cfId ) ;
}
}
}
}
@ -141,7 +142,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
var ctx = msg . getCtx ( ) ;
var ctx = msg . getCtx ( ) ;
CalculatedFieldState state ;
CalculatedFieldState state ;
if ( msg . getStateAction ( ) = = StateAction . RECREATE ) {
if ( msg . getStateAction ( ) = = StateAction . RECREATE ) {
states . remove ( ctx . getCfId ( ) ) ;
removeStat e ( ctx . getCfId ( ) ) ;
state = null ;
state = null ;
} else {
} else {
state = states . get ( ctx . getCfId ( ) ) ;
state = states . get ( ctx . getCfId ( ) ) ;
@ -195,14 +196,14 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
msg . getCallback ( ) . onSuccess ( ) ;
msg . getCallback ( ) . onSuccess ( ) ;
} else {
} else {
MultipleTbCallback multipleTbCallback = new MultipleTbCallback ( states . size ( ) , msg . getCallback ( ) ) ;
MultipleTbCallback multipleTbCallback = new MultipleTbCallback ( states . size ( ) , msg . getCallback ( ) ) ;
states . forEach ( ( cfId , state ) - > cfStateService . remov eState( new CalculatedFieldEntityCtxId ( tenantId , cfId , entityId ) , multipleTbCallback ) ) ;
states . forEach ( ( cfId , state ) - > cfStateService . delet eState( new CalculatedFieldEntityCtxId ( tenantId , cfId , entityId ) , multipleTbCallback ) ) ;
actorCtx . stop ( actorCtx . getSelf ( ) ) ;
actorCtx . stop ( actorCtx . getSelf ( ) ) ;
}
}
} else {
} else {
var cfId = new CalculatedFieldId ( msg . getEntityId ( ) . getId ( ) ) ;
var cfId = new CalculatedFieldId ( msg . getEntityId ( ) . getId ( ) ) ;
var state = states . remove ( cfId ) ;
var state = removeStat e ( cfId ) ;
if ( state ! = null ) {
if ( state ! = null ) {
cfStateService . remov eState( new CalculatedFieldEntityCtxId ( tenantId , cfId , entityId ) , msg . getCallback ( ) ) ;
cfStateService . delet eState( new CalculatedFieldEntityCtxId ( tenantId , cfId , entityId ) , msg . getCallback ( ) ) ;
} else {
} else {
msg . getCallback ( ) . onSuccess ( ) ;
msg . getCallback ( ) . onSuccess ( ) ;
}
}
@ -423,14 +424,30 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
if ( state . isSizeOk ( ) ) {
if ( state . isSizeOk ( ) ) {
cfStateService . persistState ( ctxId , state , callback ) ;
cfStateService . persistState ( ctxId , state , callback ) ;
} else {
} else {
remov eStateAndRaiseSizeException( ctxId , CalculatedFieldException . builder ( ) . ctx ( ctx ) . eventEntity ( entityId ) . errorMessage ( ctx . getSizeExceedsLimitMessage ( ) ) . build ( ) , callback ) ;
delet eStateAndRaiseSizeException( ctxId , CalculatedFieldException . builder ( ) . ctx ( ctx ) . eventEntity ( entityId ) . errorMessage ( ctx . getSizeExceedsLimitMessage ( ) ) . build ( ) , callback ) ;
}
}
}
}
}
}
private void removeStateAndRaiseSizeException ( CalculatedFieldEntityCtxId ctxId , CalculatedFieldException ex , TbCallback callback ) throws CalculatedFieldException {
private CalculatedFieldState removeState ( CalculatedFieldId cfId ) {
CalculatedFieldState state = states . remove ( cfId ) ;
closeState ( state ) ;
return state ;
}
private void closeState ( CalculatedFieldState state ) {
if ( state ! = null ) {
try {
state . close ( ) ;
} catch ( Exception e ) {
log . warn ( "[{}][{}] Failed to close CF state" , tenantId , state . getEntityId ( ) , e ) ;
}
}
}
private void deleteStateAndRaiseSizeException ( CalculatedFieldEntityCtxId ctxId , CalculatedFieldException ex , TbCallback callback ) throws CalculatedFieldException {
// We remove the state, but remember that it is over-sized in a local map.
// We remove the state, but remember that it is over-sized in a local map.
cfStateService . removeState ( ctxId , new TbCallback ( ) {
cfStateService . delet eState( ctxId , new TbCallback ( ) {
@Override
@Override
public void onSuccess ( ) {
public void onSuccess ( ) {
callback . onFailure ( ex ) ;
callback . onFailure ( ex ) ;