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