Hello Rob, <br><br>Thank you for this detailed solution I have tested it and it work great. I have created a file called migration.vcl that contains:<br><br>"""<br>backend oldcmsnode { .host = "old_cms_webserver"; .port="8081"; }<br>
backend newcmsnode { .host = "new_cms_webserver"; .port="8082"; }<br>director oldcms random {<br>   { .backend = oldcmsnode ; .weight = 1; }<br>}<br>director newcms random {<br>   { .backend = newcmsnode ; .weight = 1; }<br>
}<br>sub vcl_recv {<br>    set req.backend = newcms;<br>    if (req.restarts > 0) {<br>       set req.backend = oldcms;<br>    }<br>}<br>sub vcl_fetch {<br>    if (obj.status == 404 && req.restarts==0) {<br>       restart;<br>
    }<br>}<br>"""<br><br>Then I run it using this command :<br>sudo varnishd -a <a href="http://127.0.0.1:8080">127.0.0.1:8080</a> -F -f /etc/varnish/migration.vcl<br>Regards,<br>Yann<br><br><br><div class="gmail_quote">
On Tue, Aug 18, 2009 at 3:19 AM, Rob S <span dir="ltr"><<a href="mailto:rtshilston@gmail.com">rtshilston@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">Yann Malet wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Browser request the page :  *frontend:8080/foo/bar*<br>
This request reach the frontend:8080, it looks if the page is the cache. If the page is in the cache it serves it from there else it sends the request to* weserver_new_cms:8081*. There are 2 cases there the page exists or  not. If the page exists it serves the page to the frontend that puts it in the cache and sends it to the client. If the page does not exist it means that weserver_new_cms:8081 returns 404 the frontend should reverse proxy *to webserver_old_cms:8082. *There is  again 2 cases there the page exists or it doesn't. If the page exists it serves the page to the frontend that puts it in the cache and send it to the client. If the page does not exist it returns a 404 error to the client because the page does not exist in any (new, old) cms.<br>

<br>
It seems to me that *vcl_fetch* is the right place to hook this logic but so far I have no idea on how to write this. Some help/ guidance would be very appreciated.<br>
<br>
</blockquote></div>
Yann,<br>
<br>
Varnish can definitely do this, and by default Varnish will serve from its cache anything that is there.  So, you just need to worry about the "it's not in the cache" scenario, and instead do something like the following.  First, you'll need to define your backend nodes:<br>

<br>
  backend oldcmsnode { .host = "webserver_old_cms"; .port="8082"; }<br>
  backend newcmsnode { .host = "webserver_new_cms"; .port="8081"; }<br>
<br>
  director oldcms random {<br>
     { .backend = oldcmsnode ; .weight = 1; }<br>
  }<br>
<br>
  director newcms random {<br>
     { .backend = newcmsnode ; .weight = 1; }<br>
  }<br>
<br>
then, at the top of sub vcl_recv, we say "If we're trying for the first time, use the newcmsnode, otherwise use the oldcmsnode"<br>
<br>
  set req.backend = newcmsnode;<br>
  if (req.restarts > 0) {<br>
     set req.backend = oldcmsnode;<br>
  }<br>
<br>
in vcl_fetch, put some logic to say "if we got a 404, and it was our first attempt (and therefore we're using the newcmsnode), we should restart and try again".<br>
<br>
  if (obj.status == 404 && req.restarts==0) {<br>
     restart;<br>
  }<br>
<br>
I hope this points you in the right direction.<br><font color="#888888">
<br>
<br>
<br>
Rob<br>
<br>
<br>
</font></blockquote></div><br>