So I gather the *Ext mapping is absolutely necessary regardless of whether
remote or ext is used.
I took at the *Ext section again, could I use this maybe:
(setq *Ext # Define extension functions
'((@Host @Port @Ext)
(let Sock NIL
(curry (@Host @Ext Sock) (Obj)
(when (or Sock (setq Sock (connect @Host @Port)))
(out Sock (pr (cons 'qsym Obj)))
(prog1 (in Sock (rd))
(off Sock) ) ) ) ) ) ) ) )
(40 80) ) )
And then with *ext* I need to create that single look ahead queue in the
local code you talked about earlier, but how?
I mean at the moment the problem is that I get too many articles in my local
code since all the remotes send all their articles at once, thus swamping
the local process, I'll show you what I'm using now:
(dm evalAll> @
(for N (getMachine> This "localhost")
(later (chain (cons "void"))
(eval> This N (rest)))))
(wait 5000 (not (memq "void" Result)))
(Note that this logic does not respect a multi machine environment, I will
add that when/if my current single machine is not enough.)
This one will evalute code on all remotes and return all the results. If the
result contains let's say more than 10 000 articles I will choke as it is
now. That's why I need that single look ahead you talked about, but I don't
know how to implement it.
If it was just about returning the 25 newest articles I could have each
remote simply return the 25 newest ones and then sort again locally. In that
case I would get 50 back and not 10 000 in this case. And when I want the
next result which will be 25-50 I suppose I could return 50 from each remote
then but this is a very ugly solution that doesn't scale very well.
On Sun, Apr 25, 2010 at 12:05 PM, Alexander Burger <a...@software-lab.de>wrote:
> Hi Henrik,
> > I've reviewed the **Ext* part in the manual and I will need something
> > different as I will have several nodes on each machine on different ports
> > (starting with simply localhost). I suppose I could have simply modified
> > if I had had one node per machine?
> With "node" you mean a server process? What makes you think that the
> example limits it to one node? IIRC, the example is in fact a simplified
> version (perhaps too simplified?) of a system where there were many
> servers, of equal and different types, on each host.
> > Anyway, what would the whole procedure you've described look like if I
> > two external nodes listening on 4041 and 4042 respectively but on
> > both of them, and the E/R in question looks like this?:
> > (class +Article +Entity)
> > (rel aid (+Key +Number))
> > (rel title (+String))
> > (rel htmlUrl (+Key +String)) #
> > (rel body (+Blob))
> > (rel pubDate (+Ref +Number))
> Side question: Is there a special reason why 'pubDate' is a '+Number'
> and not a '+Date'? Should work that way, though.
> > In this case I want to fetch article 25 - 50 sorted by pubDate from both
> > nodes
> Unfortunately, this cannot be achieved directly with an '+Aux' relation,
> because the article number and the date cannot be organized into a
> single index with a primary and secondary sorting criterion.
> There is no other way then fetching and then sorting them, I think:
> (by '((This) (: pubDate)) sort (collect 'aid '+Article 25 50))
> Thus, the "send" part from a node to the central server would be
> (for Article
> '((This) (: pubDate))
> (collect 'aid '+Article 25 50) )
> (pr Article) # Send the article object
> (NIL (flush)) ) # Flush the socket
> The 'flush' is important, not so much to immediately send the data, but
> to detect whether the other side (the central server) has closed the
> connection, perhaps because it isn't interested in further data.
> 'flush' returns NIL if it cannot send the data successfully, and thus
> causes the 'for' loop to terminate.
> > So as far as I've understood it a (setq *Ext ... ) section is needed and
> > then the specific logic described in your previous post in the form of
> > something using *ext* or maybe *remote*?
> Yes. '*Ext' is necessary if remote objects are accessed locally.
> 'remote' might be handy if Pilog is used for remote queries. This is not
> the case in the above example.
> But 'ext' is needed on the central server, with the proper offsets for
> the clients. This can be all encapsulated in the +Agent objects.
> - Alex
> UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe