private int transactionRORead(Map<Integer,Site> sitesSnapshotAtTROStart, int readVarIndex, Operation operation){
		int readValue = Integer.MAX_VALUE;
		for (int i: sitesSnapshotAtTROStart.keySet()) {
			Site site = sitesSnapshotAtTROStart.get(i);
			if (site.hasVariable(readVarIndex)){
				boolean siteUPhasVar = sites.get(i).isUp();
				boolean siteRECOVERUnRepVar = sites.get(i).isRecovering() && !isVarReplicate(readVarIndex);
				boolean siteRECOVERRepVarReadReady = sites.get(i).isRecovering() && sites.get(i).isVarWritten(readVarIndex);
				if(siteUPhasVar || siteRECOVERUnRepVar || siteRECOVERRepVarReadReady) {
					readValue = site.readVariable(readVarIndex);
					if(readValue != Integer.MAX_VALUE) {
						System.out.println(operation.getString()+ " is done. Read result is "+ readValue);
						// OTHER ACTION
					}
					else {
						// the READ operation totally fails. maybe all the sites failed
						updateBufferedROOperation(readVarIndex, operation);
						System.out.println(operation.getString()+ " waits. ");
					}								
					break;
				}
			}					
		}
		return readValue;
	}