Michael Kublin has uploaded a new change for review.

Change subject: engine: Improving memory footprint - JSON part
......................................................................

engine: Improving memory footprint - JSON part

The following patch should imprtove a used memory in all work related to JSON.
The scenarious which will be improved: all scenarios which are using 
compensation and vm monitoring.
Motivation is due to wiki of Jackson serializer it is thread safe, except 
configuration part,
but we are not changing configuration (Also I did short code review in order to 
verify that ObjectMapper is thread safe)
ObjectMapper is not lightweight object and also has some internal cache in 
order to improve it performance, so
a change is obvious: serializer and desirializer which are based on 
ObjectMapper should be single instance.

Change-Id: I11a76b46a5bfa269605249c3dfc2d69a55d8bbef
Signed-off-by: Michael Kublin <mkub...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDeviceDAODbFacadeImpl.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/SerializationFactory.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectSerializer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
7 files changed, 72 insertions(+), 74 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/79/13879/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index d7bda4f..3ed6df8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -256,7 +256,7 @@
         defaultContext.setCommandType(getClass().getName());
         
defaultContext.setBusinessEntitySnapshotDAO(getBusinessEntitySnapshotDAO());
         defaultContext.setSnapshotSerializer(
-                SerializationFactory.getFactory().createSerializer());
+                SerializationFactory.getSerializer());
         return defaultContext;
     }
 
@@ -369,7 +369,7 @@
             @Override
             public Object runInTransaction() {
                 Deserializer deserializer =
-                        SerializationFactory.getFactory().createDeserializer();
+                        SerializationFactory.getDeserializer();
                 List<BusinessEntitySnapshot> entitySnapshots =
                         
getBusinessEntitySnapshotDAO().getAllForCommandId(commandId);
                 log.debugFormat("Command [id={0}]: {1} compensation data.", 
commandId,
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
index 37e5600..091b69d 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
@@ -19,10 +19,9 @@
 import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect;
 import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils;
 import org.ovirt.engine.core.utils.ReflectionUtils;
+import org.ovirt.engine.core.utils.SerializationFactory;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
-import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer;
-import org.ovirt.engine.core.utils.serialization.json.JsonObjectSerializer;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 
@@ -69,8 +68,9 @@
             if (className == null) {
                 return null;
             }
-            Class<Serializable> actionParamsClass = 
(Class<Serializable>)ReflectionUtils.getClassFor(className);
-            return (VdcActionParametersBase)new 
JsonObjectDeserializer().deserialize(payload, actionParamsClass);
+            Class<Serializable> actionParamsClass = (Class<Serializable>) 
ReflectionUtils.getClassFor(className);
+            return (VdcActionParametersBase) 
SerializationFactory.getDeserializer().deserialize(payload,
+                    actionParamsClass);
         }
     }
 
@@ -91,7 +91,7 @@
         }
 
         private static String serializeParameters(VdcActionParametersBase 
params) {
-            return new JsonObjectSerializer().serialize(params);
+            return SerializationFactory.getSerializer().serialize(params);
         }
     }
 
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDeviceDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDeviceDAODbFacadeImpl.java
index 282a9a2..7c5c78d 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDeviceDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDeviceDAODbFacadeImpl.java
@@ -42,8 +42,8 @@
                 .addValue("address", entity.getAddress())
                 .addValue("boot_order", entity.getBootOrder())
                 .addValue("spec_params",
-                        entity.getSpecParams() == null ? null : 
SerializationFactory.getFactory()
-                                .createSerializer()
+                        entity.getSpecParams() == null ? null : 
SerializationFactory
+                                .getSerializer()
                                 .serialize(entity.getSpecParams()))
                 .addValue("is_managed", entity.getIsManaged())
                 .addValue("is_plugged", entity.getIsPlugged())
@@ -140,8 +140,8 @@
             if (StringUtils.isEmpty(specParams)) {
                 vmDevice.setSpecParams(new HashMap<String, Object>());
             } else {
-                vmDevice.setSpecParams(SerializationFactory.getFactory()
-                        .createDeserializer()
+                vmDevice.setSpecParams(SerializationFactory
+                        .getDeserializer()
                         .deserialize(specParams, HashMap.class));
             }
 
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/SerializationFactory.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/SerializationFactory.java
index 3db3bbf..d78d959 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/SerializationFactory.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/SerializationFactory.java
@@ -6,20 +6,14 @@
 
 public class SerializationFactory {
 
-    private static SerializationFactory factory;
-    static {
-        factory = new SerializationFactory();
+    private static final JsonObjectSerializer serializer = new 
JsonObjectSerializer();
+    private static final JsonObjectDeserializer deserializer = new 
JsonObjectDeserializer();
+
+    public static JsonObjectSerializer getSerializer() {
+        return serializer;
     }
 
-    public static SerializationFactory getFactory() {
-        return factory;
-    }
-
-    public Serializer createSerializer() {
-        return new JsonObjectSerializer();
-    }
-
-    public Deserializer createDeserializer() {
-        return new JsonObjectDeserializer();
+    public static JsonObjectDeserializer getDeserializer() {
+        return deserializer;
     }
 }
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java
index 5d3a25c..2c90bbb 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java
@@ -28,27 +28,36 @@
  */
 public class JsonObjectDeserializer implements Deserializer {
 
+    private static final ObjectMapper formattedMapper;
+    static {
+        formattedMapper = new ObjectMapper();
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(NGuid.class, 
JsonNGuidMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(Guid.class, 
JsonNGuidMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VdcActionParametersBase.class,
+                JsonVdcActionParametersBaseMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(IVdcQueryable.class,
+                JsonIVdcQueryableMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VM.class, 
JsonVmMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(ValueObjectMap.class,
+                JsonValueObjectMapMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VdsStatic.class, 
JsonVdsStaticMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VDS.class, 
JsonVDSMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(AddVmTemplateParameters.class,
+                JsonAddVmTemplateParametersMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VmManagementParametersBase.class,
+                JsonVmManagementParametersBaseMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VmBase.class, 
JsonVmBaseMixIn.class);
+        
formattedMapper.getDeserializationConfig().addMixInAnnotations(VmStatic.class, 
JsonVmStaticMixIn.class);
+        formattedMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        formattedMapper.enableDefaultTyping();
+    }
+
     @Override
     public <T extends Serializable> T deserialize(Object source, Class<T> 
type) throws SerializationExeption {
         if (source == null) {
             return null;
         }
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.getDeserializationConfig().addMixInAnnotations(NGuid.class, 
JsonNGuidMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(Guid.class, 
JsonNGuidMixIn.class);
-        
mapper.getDeserializationConfig().addMixInAnnotations(VdcActionParametersBase.class,
 JsonVdcActionParametersBaseMixIn.class);
-        
mapper.getDeserializationConfig().addMixInAnnotations(IVdcQueryable.class, 
JsonIVdcQueryableMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(VM.class, 
JsonVmMixIn.class);
-        
mapper.getDeserializationConfig().addMixInAnnotations(ValueObjectMap.class, 
JsonValueObjectMapMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(VdsStatic.class, 
JsonVdsStaticMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(VDS.class, 
JsonVDSMixIn.class);
-        
mapper.getDeserializationConfig().addMixInAnnotations(AddVmTemplateParameters.class,
 JsonAddVmTemplateParametersMixIn.class);
-        
mapper.getDeserializationConfig().addMixInAnnotations(VmManagementParametersBase.class,
 JsonVmManagementParametersBaseMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(VmBase.class, 
JsonVmBaseMixIn.class);
-        mapper.getDeserializationConfig().addMixInAnnotations(VmStatic.class, 
JsonVmStaticMixIn.class);
-        mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        mapper.enableDefaultTyping();
-        return readJsonString(source, type, mapper);
+        return readJsonString(source, type, formattedMapper);
     }
 
     private <T> T readJsonString(Object source, Class<T> type, ObjectMapper 
mapper) {
@@ -61,18 +70,5 @@
         } catch (IOException e) {
             throw new SerializationException(e);
         }
-    }
-
-    /**
-     * Deserialize unformatted Json content.
-     *
-     * @param source
-     *            - The object which supposed to be deserialize.
-     * @return The serialized object.
-     * @throws SerializationExeption
-     */
-    public <T extends Serializable> T deserializeUnformattedJson(Object 
source, Class<T> type) throws SerializationExeption {
-        ObjectMapper mapper = new ObjectMapper();
-        return readJsonString(source, type, mapper);
     }
 }
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectSerializer.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectSerializer.java
index ec5ec0a..397fe29 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectSerializer.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectSerializer.java
@@ -31,25 +31,34 @@
  */
 public class JsonObjectSerializer implements Serializer {
 
+    private static final ObjectMapper unformattedMapper = new ObjectMapper();
+    private static final ObjectMapper formattedMapper;
+    static {
+        formattedMapper = new ObjectMapper();
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(NGuid.class, 
JsonNGuidMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(Guid.class, 
JsonNGuidMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VdcActionParametersBase.class,
+                JsonVdcActionParametersBaseMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(IVdcQueryable.class,
 JsonIVdcQueryableMixIn.class);
+        formattedMapper.getSerializationConfig().addMixInAnnotations(VM.class, 
JsonVmMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(ValueObjectMap.class,
+                JsonValueObjectMapMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VdsStatic.class, 
JsonVdsStaticMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VDS.class, 
JsonVDSMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(AddVmTemplateParameters.class,
+                JsonAddVmTemplateParametersMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VmManagementParametersBase.class,
+                JsonVmManagementParametersBaseMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VmBase.class, 
JsonVmBaseMixIn.class);
+        
formattedMapper.getSerializationConfig().addMixInAnnotations(VmStatic.class, 
JsonVmStaticMixIn.class);
+
+        formattedMapper.configure(Feature.INDENT_OUTPUT, true);
+        formattedMapper.enableDefaultTyping();
+    }
+
     @Override
     public String serialize(Object payload) throws SerializationExeption {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.getSerializationConfig().addMixInAnnotations(NGuid.class, 
JsonNGuidMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(Guid.class, 
JsonNGuidMixIn.class);
-        
mapper.getSerializationConfig().addMixInAnnotations(VdcActionParametersBase.class,
 JsonVdcActionParametersBaseMixIn.class);
-        
mapper.getSerializationConfig().addMixInAnnotations(IVdcQueryable.class, 
JsonIVdcQueryableMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(VM.class, 
JsonVmMixIn.class);
-        
mapper.getSerializationConfig().addMixInAnnotations(ValueObjectMap.class, 
JsonValueObjectMapMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(VdsStatic.class, 
JsonVdsStaticMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(VDS.class, 
JsonVDSMixIn.class);
-        
mapper.getSerializationConfig().addMixInAnnotations(AddVmTemplateParameters.class,
 JsonAddVmTemplateParametersMixIn.class);
-        
mapper.getSerializationConfig().addMixInAnnotations(VmManagementParametersBase.class,
 JsonVmManagementParametersBaseMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(VmBase.class, 
JsonVmBaseMixIn.class);
-        mapper.getSerializationConfig().addMixInAnnotations(VmStatic.class, 
JsonVmStaticMixIn.class);
-
-        mapper.configure(Feature.INDENT_OUTPUT, true);
-        mapper.enableDefaultTyping();
-        return writeJsonAsString(payload, mapper);
+        return writeJsonAsString(payload, formattedMapper);
     }
 
     /**
@@ -82,7 +91,6 @@
      * @throws SerializationExeption
      */
     public String serializeUnformattedJson(Serializable payload) throws 
SerializationExeption {
-        ObjectMapper mapper = new ObjectMapper();
-        return writeJsonAsString(payload, mapper);
+        return writeJsonAsString(payload, unformattedMapper);
     }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
index f157413..df7356b 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
@@ -48,9 +48,9 @@
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
 import org.ovirt.engine.core.utils.NetworkUtils;
+import org.ovirt.engine.core.utils.SerializationFactory;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
-import org.ovirt.engine.core.utils.serialization.json.JsonObjectSerializer;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct;
 
 /**
@@ -354,7 +354,7 @@
         Object[] vmDisksUsage = (Object[]) 
vmStruct.getItem(VdsProperties.VM_DISKS_USAGE);
         if (vmDisksUsage != null) {
             ArrayList<Object> disksUsageList = new 
ArrayList<Object>(Arrays.asList(vmDisksUsage));
-            vm.setDisksUsage(new 
JsonObjectSerializer().serializeUnformattedJson(disksUsageList));
+            
vm.setDisksUsage(SerializationFactory.getSerializer().serializeUnformattedJson(disksUsageList));
         }
     }
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I11a76b46a5bfa269605249c3dfc2d69a55d8bbef
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Michael Kublin <mkub...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to