Liron Aravot has uploaded a new change for review.

Change subject: core: avoid reconstructs based on stale data
......................................................................

core: avoid reconstructs based on stale data

IrsBrokerCommand._updatingTimer_Elapsed is triggered by a timer, loads
the storage pool from the db and then perform GetStoragePoolInfo vds
command. The master version received from vdsm and from the db are being
compared - if they are different reconstruct command is being executed
because of the version difference. There's no garuntee that recovery
didn't run after the storage pool data has been loaded from the DB but
before we added a new reconstruct operation to the queue.

The proposed solution adds a check to verify whether to master version
has changed since we first loaded it, if it did it means that recovery
operation ran meanwhile and that we shouldn't perform reconstruct.

Change-Id: Ib2dd69b1766ab92be7428c8973590709a52d5d48
Bug-Url: https://bugzilla.redhat.com/888259
Signed-off-by: Liron Aravot <[email protected]>
---
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
1 file changed, 17 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/64/10764/1

diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
index 3e44df5..8aa1b2f 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
@@ -310,7 +310,7 @@
                         && domainPoolMap.getstatus() != 
StorageDomainStatus.Locked) {
                     // and the domain is not master in the VDSM
                     if (!((data.getstorage_domain_type() == 
StorageDomainType.Master) || (data.getstorage_domain_type() == 
StorageDomainType.Unknown))) {
-                        
reconstructMasterDomainNotInSync(data.getstorage_pool_id().getValue(),
+                        reconstructMasterDomainNotInSync(storagePool,
                                 domainFromDb.getId(),
                                 "Mismatch between master in DB and VDSM",
                                 MessageFormat.format("Master domain is not in 
sync between DB and VDSM. "
@@ -428,7 +428,7 @@
          * @param logMessage
          *            The log message to write in the log.
          */
-        private void reconstructMasterDomainNotInSync(final Guid storagePoolId,
+        private void reconstructMasterDomainNotInSync(final storage_pool 
storagePool,
                 final Guid masterDomainId,
                 final String exceptionMessage,
                 final String logMessage) {
@@ -438,16 +438,23 @@
                     new Callable<EventResult>() {
                         @Override
                         public EventResult call() {
-                            log.warnFormat(logMessage);
+                            storage_pool storagePoolDb = 
DbFacade.getInstance().getStoragePoolDao()
+                                    .get(_storagePoolId);
+                            // means that no reconstruct/recovery operation 
ran before the event execution.
+                            if (storagePoolDb != null
+                                    && 
storagePoolDb.getmaster_domain_version() == 
storagePool.getmaster_domain_version()) {
+                                log.warnFormat(logMessage);
 
-                            AuditLogableBase logable = new 
AuditLogableBase(mCurrentVdsId);
-                            logable.setStorageDomainId(masterDomainId);
-                            AuditLogDirector.log(logable, 
AuditLogType.SYSTEM_MASTER_DOMAIN_NOT_IN_SYNC);
+                                AuditLogableBase logable = new 
AuditLogableBase(mCurrentVdsId);
+                                logable.setStorageDomainId(masterDomainId);
+                                AuditLogDirector.log(logable, 
AuditLogType.SYSTEM_MASTER_DOMAIN_NOT_IN_SYNC);
 
-                            return ResourceManager.getInstance()
-                                    .getEventListener()
-                                    
.masterDomainNotOperational(masterDomainId, storagePoolId);
-
+                                return ResourceManager.getInstance()
+                                        .getEventListener()
+                                        
.masterDomainNotOperational(masterDomainId, storagePool.getId());
+                            } else {
+                                return new EventResult(true, 
EventType.RECONSTRUCT);
+                            }
                         }
                     });
             throw new IRSNoMasterDomainException(exceptionMessage);


--
To view, visit http://gerrit.ovirt.org/10764
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib2dd69b1766ab92be7428c8973590709a52d5d48
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to