airavata-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Douglas Chau <>
Subject PGA Cache and AJAX/PHP
Date Wed, 17 Jun 2015 19:18:39 GMT
Hello Devs,

Nothing that requires immediate attention, but I thought I would document some of my hurdles
while working on adding a feature to the PGA in case anyone else encounters similar issues.
So there are two takeaways: be wary of PGA caching results, and be careful of boolean variables
passed through AJAX being treated as strings in PHP. 

I was working on the admin interface that allows a gateway admin to turn on/off the visibility
of a resource to regular users. The page before was only a dummy page with a bunch of buttons
for each resource. I added some AJAX functionality to the current buttons so that when one
is switched on/off a call is made to a PHP controller method that resides in AdminController.php;
that call then invokes a utility function within CRUtilities.php which does the actual calling
to the the Airavata API to update the compute resource description with the new boolean value
that reflects the button's on/off state. So basically, the button just updates a boolean field
in the compute resource description. Sounds simple enough.

To make sure everything was working, I wrote some sanity checks to print the before and after
states of the compute resource description to the browser (using javascript's console.log()
function). For the record, I used the CRUtilities::register_or_update_compute_resource method
to do the actual updating of the compute resource and then the CRUtilities::get_compute_resource
method to check the results. So strangely and surely, when I got the results back and printed
them to the screen, the changes were not reflected; the compute resource object’s fields
were completely unchanged. But, the even stranger thing was that after periods of time, the
object fields would change. Huh?... This lead me on a wild goose chase to see if there was
something I forgot in the airavata backend code, or if there was some composer command I forgot
to call, and so on. I looked through the CRUtilities code more carefully and found that the
CRUtilities::register_or_update_compute_resource method actually returns the compute resource
when it succeeds. I tried printing this return value to the screen and discovered that the
changes were happily reflected in these results but still not in the results of the other
CRUtilities::get_compute_resource method. Why? With some more stumbling around, I discovered
that the CRUtilities::register_or_update_compute_resource method actually gets it’s resulting
resource description by calling the Airavata::getComputeResource method and not the getter
method already provided in CRUtilities; so the succeeding results actually come directly from
the airavata backend. And finally, after looking carefully at the CRUtilities::get_compute_resource
method, I found that this method actually returns a cached version of the resource if available,
which explains why none of the changes were immediately reflected but did after a period of

If you did not follow all that, the takeaway is, CRUtilities::get_compute_resource returns
a cached version of the resource, so if you ever make an update and are trying to check the
results to see if they have changed, use the return value of the CRUtilities::register_or_update_compute_resource
instead; the results of CRUtilities::get_compute_resource will deceive you into thinking the
change did not go through. I guess that makes sense, but may not be so apparent to newcomers
to the PGA code.

Also, if any of you ever try passing boolean values from AJAX to PHP, when PHP get’s the
POST/GET results, it will take your original boolean types and covert them to strings. So
if you passed in boolean true, PHP will get it as string “true”. And of course, if you
are eventually setting a boolean field to the string “true”, PHP always evaluates a string
to boolean true unless it is something that is considered empty by PHP (i.e. “” or “0”).
So if you need to do this, make sure the values are converted back to boolean. See these links
for more detail:
<> <>

I hope this was all somewhat clear. And at the least, I hope this helps anyone who may eventually
work on the PGA code.


View raw message