Hi Daan, Rajani I looked at a code of master and 4.4 branch. findById is used at line 3031 of master branch and line 3299 of 4.4 branch, so I think this leads to an same problem.
The code snippets of master and 4.4 branch are below. [master] server/src/com/cloud/api/ApiResponseHelper.java 2987 @Override 2988 public UsageRecordResponse createUsageResponse(Usage usageRecord) { 2989 UsageRecordResponse usageRecResponse = new UsageRecordResponse(); 2990 2991 Account account = ApiDBUtils.findAccountById(usageRecord.getAccountId()); 2992 if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { 2993 //find the project 2994 Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); 2995 usageRecResponse.setProjectId(project.getUuid()); 2996 usageRecResponse.setProjectName(project.getName()); 2997 } else { 2998 usageRecResponse.setAccountId(account.getUuid()); 2999 usageRecResponse.setAccountName(account.getAccountName()); 3000 } 3001 3002 Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId()); 3003 if (domain != null) { 3004 usageRecResponse.setDomainId(domain.getUuid()); 3005 } 3006 3007 if (usageRecord.getZoneId() != null) { 3008 DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId()); 3009 if (zone != null) { 3010 usageRecResponse.setZoneId(zone.getUuid()); 3011 } 3012 } 3013 usageRecResponse.setDescription(usageRecord.getDescription()); 3014 usageRecResponse.setUsage(usageRecord.getUsageDisplay()); 3015 usageRecResponse.setUsageType(usageRecord.getUsageType()); 3016 if (usageRecord.getVmInstanceId() != null) { 3017 VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId()); 3018 if (vm != null) { 3019 usageRecResponse.setVirtualMachineId(vm.getUuid()); 3020 } 3021 } 3022 usageRecResponse.setVmName(usageRecord.getVmName()); 3023 if (usageRecord.getTemplateId() != null) { 3024 VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); 3025 if (template != null) { 3026 usageRecResponse.setTemplateId(template.getUuid()); 3027 } 3028 } 3029 3030 if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { 3031 ServiceOfferingVO svcOffering = _entityMgr.findById(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); 3032 //Service Offering Id 3033 usageRecResponse.setOfferingId(svcOffering.getUuid()); 3034 //VM Instance ID 3035 VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); 3036 if (vm != null) { 3037 usageRecResponse.setUsageId(vm.getUuid()); 3038 } 3039 //Hypervisor Type 3040 usageRecResponse.setType(usageRecord.getType()); 3041 [ACS 4.4] server/src/com/cloud/api/ApiResponseHelper.java 3255 @Override 3256 public UsageRecordResponse createUsageResponse(Usage usageRecord) { 3257 UsageRecordResponse usageRecResponse = new UsageRecordResponse(); 3258 3259 Account account = ApiDBUtils.findAccountById(usageRecord.getAccountId()); 3260 if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { 3261 //find the project 3262 Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); 3263 usageRecResponse.setProjectId(project.getUuid()); 3264 usageRecResponse.setProjectName(project.getName()); 3265 } else { 3266 usageRecResponse.setAccountId(account.getUuid()); 3267 usageRecResponse.setAccountName(account.getAccountName()); 3268 } 3269 3270 Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId()); 3271 if (domain != null) { 3272 usageRecResponse.setDomainId(domain.getUuid()); 3273 } 3274 3275 if (usageRecord.getZoneId() != null) { 3276 DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId()); 3277 if (zone != null) { 3278 usageRecResponse.setZoneId(zone.getUuid()); 3279 } 3280 } 3281 usageRecResponse.setDescription(usageRecord.getDescription()); 3282 usageRecResponse.setUsage(usageRecord.getUsageDisplay()); 3283 usageRecResponse.setUsageType(usageRecord.getUsageType()); 3284 if (usageRecord.getVmInstanceId() != null) { 3285 VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId()); 3286 if (vm != null) { 3287 usageRecResponse.setVirtualMachineId(vm.getUuid()); 3288 } 3289 } 3290 usageRecResponse.setVmName(usageRecord.getVmName()); 3291 if (usageRecord.getTemplateId() != null) { 3292 VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); 3293 if (template != null) { 3294 usageRecResponse.setTemplateId(template.getUuid()); 3295 } 3296 } 3297 3298 if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { 3299 ServiceOfferingVO svcOffering = _entityMgr.findById(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); 3300 //Service Offering Id 3301 usageRecResponse.setOfferingId(svcOffering.getUuid()); 3302 //VM Instance ID 3303 VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); 3304 if (vm != null) { 3305 usageRecResponse.setUsageId(vm.getUuid()); 3306 } 3307 //Hypervisor Type 3308 usageRecResponse.setType(usageRecord.getType()); 3309 In addition to this, I'm not sure whether findAccountById, findProjectByProjectAccountId, findDomainById, findZoneById and findTemplateById work correctly when resources are destroyed. Does anyone know these methods are OK? 2014-05-29 18:25 GMT+09:00 sebgoa <run...@gmail.com>: > > On May 29, 2014, at 11:20 AM, Rajani Karuturi <rajani.karut...@citrix.com> > wrote: > >> The fix is already in 4.4 >> >> commit 3a3457e7132d22f52aa38179d40a6eb9b0b29677 >> Author: Sam Schmit <sam.sch...@appcore.com> >> AuthorDate: Fri May 2 13:07:34 2014 -0500 >> Commit: Daan Hoogland <d...@onecht.net> >> CommitDate: Tue May 6 17:46:20 2014 +0200 >> >> CLOUDSTACK-6472 listUsageRecords: Pull information from removed items as >> well, fixing NPEs/Null UUIDs with usage API calls. >> >> M server/src/com/cloud/api/ApiResponseHelper.java >> > > still need to check if this fix in 4.4 is complete. Hiroki's change was to > 4.3 branch. I did not check 4.4. > >> >> @sebgoa >> i think it would be better to include bug id in the commit messages as thats >> the only way to track all the commits for a defect. >> > > yes my bad, did not take time to look up the bug id. > >> >> ~Rajani >> >> >> >> On 29-May-2014, at 2:25 pm, Daan Hoogland <daan.hoogl...@gmail.com> wrote: >> >>> Hiroki, >>> >>> Did you have a look at 4.4 or master as well? tell us when it works, >>> so we can cherry-pick the fix to later versions. >>> >>> On Thu, May 29, 2014 at 10:25 AM, Hiroki Ohashi <hiroki.s...@gmail.com> >>> wrote: >>>> sebgoa >>>> >>>> >>>> 2014-05-29 16:52 GMT+09:00 sebgoa <run...@gmail.com>: >>>>> >>>>> On May 29, 2014, at 9:26 AM, Hiroki Ohashi <hiroki.s...@gmail.com> wrote: >>>>> >>>>>> Dear guys >>>>>> >>>>>> I found a bug about listUsageRecords API in 4.3 related to a issue >>>>>> CLOUDSTACK-6472 and made a patch. Would you review the patch and >>>>>> correct me if I am wrong? >>>>>> >>>>>> Sam Schmit push a commit about NPEs/Null UUIDs at May 5th but I think >>>>>> his commit is not enough. >>>>>> >>>>>> commit e8047e11db7ef2bdc44bbedfdc47e63c55f080c5 >>>>>> Author: Sam Schmit <sam.sch...@appcore.com> >>>>>> Date: Mon May 5 16:38:23 2014 -0500 >>>>>> >>>>>> CLOUDSTACK-6472 (4.3 specific) listUsageRecords: Pull >>>>>> information from removed items as well, fixing NPEs/Null UUIDs with >>>>>> usage API calls. >>>>>> >>>>>> Signed-off-by: Sebastien Goasguen <run...@gmail.com> >>>>>> >>>>>> When I called listUsageRecords against CloudStack 4.3 management >>>>>> server that was build at latest 4.3 branch, usage records about >>>>>> destroyed instances of usage type 1 and 2 lacked 'virtualmachineid' as >>>>>> below. >>>>>> >>>>>> { >>>>>> "account": "sgcadm", >>>>>> "accountid": "f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e", >>>>>> "description": "mycluster-front allocated (ServiceOffering: 13) >>>>>> (Template: 203)", >>>>>> "domainid": "84dd635d-fb99-4895-b199-7d777aa144d5", >>>>>> "enddate": "2014-05-20'T'08:59:59+09:00", >>>>>> "name": "mycluster-front", >>>>>> "offeringid": "e5137018-8fca-4e4a-a79e-9e4d1707e079", >>>>>> "rawusage": "0.223611", >>>>>> "startdate": "2014-05-19'T'09:00:00+09:00", >>>>>> "templateid": "1ebdc71e-dcbe-4d3e-82d3-d31897f78d4c", >>>>>> "type": "KVM", >>>>>> "usage": "0.223611 Hrs", >>>>>> "usageid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>> "usagetype": 2, >>>>>> "zoneid": "c2ba1354-0c15-4284-bdba-4f201767362d" >>>>>> }, >>>>>> >>>>>> Hence, it is unable to refer to any destroyed instance id. I patched >>>>>> createUsageResponse method like this. >>>>>> >>>>>> diff --git a/server/src/com/cloud/api/ApiResponseHelper.java >>>>>> b/server/src/com/cloud/api/ApiResponseHelper.java >>>>>> index 7718fc1..cbf3914 100755 >>>>>> --- a/server/src/com/cloud/api/ApiResponseHelper.java >>>>>> +++ b/server/src/com/cloud/api/ApiResponseHelper.java >>>>>> @@ -3304,7 +3304,7 @@ public class ApiResponseHelper implements >>>>>> ResponseGenerator { >>>>>> usageRecResponse.setUsage(usageRecord.getUsageDisplay()); >>>>>> usageRecResponse.setUsageType(usageRecord.getUsageType()); >>>>>> if (usageRecord.getVmInstanceId() != null) { >>>>>> - VMInstanceVO vm = >>>>>> _entityMgr.findById(VMInstanceVO.class, >>>>>> usageRecord.getVmInstanceId()); >>>>>> + VMInstanceVO vm = >>>>>> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, >>>>>> usageRecord.getVmInstanceId()); >>>>>> if (vm != null) { >>>>>> usageRecResponse.setVirtualMachineId(vm.getUuid()); >>>>>> } >>>>>> >>>>> >>>>> Looks like an omission to me, I went ahead and patched it: >>>>> >>>>> commit 24e03bed560feb959a61126b76c2d6971e77092e >>>>> Author: Sebastien Goasguen <run...@gmail.com> >>>>> Date: Thu May 29 09:48:46 2014 +0200 >>>>> >>>>> Fix usage response, patch by Hiroki Ohashi >>>>> >>>>> We can always revert if people don't agree. >>>>> >>>>> Can you pull the latest 4.3 and try it. >>>>> >>>> >>>> Thanks! I will try it. >>>> >>>>> Thanks for the patch. you can always attach a patch at >>>>> http://reviews.apache.org >>>>> and follow the instructions at >>>>> http://cloudstack.apache.org/developers.html >>>> >>>> OK, I will follow the instruction next time. >>>> >>>> >>>>>> After that, listUsageRecords API contains 'virtualmachineid' whether >>>>>> or not instances are destroyed. Here is a result. >>>>>> >>>>>> { >>>>>> "account": "sgcadm", >>>>>> "accountid": "f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e", >>>>>> "description": "mycluster-front allocated (ServiceOffering: 13) >>>>>> (Template: 203)", >>>>>> "domainid": "84dd635d-fb99-4895-b199-7d777aa144d5", >>>>>> "enddate": "2014-05-20'T'08:59:59+09:00", >>>>>> "name": "mycluster-front", >>>>>> "offeringid": "e5137018-8fca-4e4a-a79e-9e4d1707e079", >>>>>> "rawusage": "0.223611", >>>>>> "startdate": "2014-05-19'T'09:00:00+09:00", >>>>>> "templateid": "1ebdc71e-dcbe-4d3e-82d3-d31897f78d4c", >>>>>> "type": "KVM", >>>>>> "usage": "0.223611 Hrs", >>>>>> "usageid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>> "usagetype": 2, >>>>>> "virtualmachineid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>> "zoneid": "c2ba1354-0c15-4284-bdba-4f201767362d" >>>>>> }, >>>>>> >>>>>> I think this is an expectecd behaviour, so please review and test this >>>>>> patch. >>>>>> >>>>>> >>>>>> Best Regards >>>>>> >>>>>> -- >>>>>> Hiroki Ohashi >>>>> >>>> >>>> >>>> Best Regards >>>> >>>> -- >>>> Hiroki Ohashi >>> >>> >>> >>> -- >>> Daan >> > Best Regards -- Hiroki Ohashi