@@ -343,6 +343,9 @@ private IPAddressVO assignAndAllocateIpAddressEntry(final Account owner, final V
343343 if (possibleAddr .getState () != State .Free ) {
344344 continue ;
345345 }
346+ if (s_logger .isDebugEnabled ()) {
347+ s_logger .debug (String .format ("trying ip address %s" , possibleAddr .getAddress ()));
348+ }
346349 possibleAddr .setSourceNat (sourceNat );
347350 possibleAddr .setAllocatedTime (new Date ());
348351 possibleAddr .setAllocatedInDomainId (owner .getDomainId ());
@@ -357,15 +360,9 @@ private IPAddressVO assignAndAllocateIpAddressEntry(final Account owner, final V
357360 possibleAddr .setAssociatedWithNetworkId (guestNetworkId );
358361 possibleAddr .setVpcId (vpcId );
359362 }
360- if (_ipAddressDao .lockRow (possibleAddr .getId (), true ) != null ) {
361- final IPAddressVO userIp = _ipAddressDao .findById (possibleAddr .getId ());
362- if (userIp .getState () == State .Free ) {
363- possibleAddr .setState (State .Allocating );
364- if (_ipAddressDao .update (possibleAddr .getId (), possibleAddr )) {
365- finalAddress = possibleAddr ;
366- break ;
367- }
368- }
363+ finalAddress = assignIpAddressWithLock (possibleAddr );
364+ if (finalAddress != null ) {
365+ break ;
369366 }
370367 }
371368
@@ -387,6 +384,29 @@ private IPAddressVO assignAndAllocateIpAddressEntry(final Account owner, final V
387384 });
388385 }
389386
387+ private IPAddressVO assignIpAddressWithLock (IPAddressVO possibleAddr ) {
388+ IPAddressVO finalAddress = null ;
389+ IPAddressVO userIp = _ipAddressDao .acquireInLockTable (possibleAddr .getId ());
390+ if (userIp != null ) {
391+ if (s_logger .isDebugEnabled ()) {
392+ s_logger .debug (String .format ("locked row for ip address %s (id: %s)" , possibleAddr .getAddress (), possibleAddr .getUuid ()));
393+ }
394+ if (userIp .getState () == State .Free ) {
395+ possibleAddr .setState (State .Allocating );
396+ if (_ipAddressDao .update (possibleAddr .getId (), possibleAddr )) {
397+ s_logger .info (String .format ("successfully allocated ip address %s" , possibleAddr .getAddress ()));
398+ finalAddress = possibleAddr ;
399+ }
400+ } else {
401+ if (s_logger .isDebugEnabled ()) {
402+ s_logger .debug (String .format ("locked ip address %s is not free (%s)" , possibleAddr .getAddress (), userIp .getState ()));
403+ }
404+ }
405+ _ipAddressDao .releaseFromLockTable (possibleAddr .getId ());
406+ }
407+ return finalAddress ;
408+ }
409+
390410 @ Override
391411 public boolean configure (String name , Map <String , Object > params ) {
392412 // populate providers
0 commit comments