From 23572433afb1de06a02cc7b80ce35ca7d37673d6 Mon Sep 17 00:00:00 2001 From: berick Date: Thu, 31 Mar 2011 13:53:20 -0400 Subject: [PATCH] do some basic parallelizing optimization --- .../support-scripts/test-scripts/unapi_bench.pl | 142 ++++++++++++++------- 1 file changed, 98 insertions(+), 44 deletions(-) diff --git a/Open-ILS/src/support-scripts/test-scripts/unapi_bench.pl b/Open-ILS/src/support-scripts/test-scripts/unapi_bench.pl index 9e1e20573f..656330f4ed 100755 --- a/Open-ILS/src/support-scripts/test-scripts/unapi_bench.pl +++ b/Open-ILS/src/support-scripts/test-scripts/unapi_bench.pl @@ -43,27 +43,68 @@ sub unapi { my @recs = @_; my $start = time(); + my $ses1 = OpenSRF::AppSession->create('open-ils.cstore'); + my $ses2 = OpenSRF::AppSession->create('open-ils.cstore'); + my $ses3 = OpenSRF::AppSession->create('open-ils.cstore'); + my ($req1, $req2, $req3); + my %records; - for my $rec_id (@recs) { - #my $data = $e->json_query({from => ['unapi.biblio_record_entry_feed', "{$rec_id}", 'marcxml', '{holdings_xml,acp}', 'CONS']})->[0]; - my $data = $e->json_query({from => ['unapi.bre', $rec_id, 'marcxml', 'record', '{holdings_xml,acp}', 'CONS']})->[0]; - my $xml = XML::LibXML->new->parse_string($data->{'unapi.bre'}); - #$xml = $xml->documentElement->getElementsByLocalName('record')->[0]; - $xml = $xml->documentElement; - my $attrs = get_bib_attrs($xml); - $records{$rec_id}{$_} = $attrs->{$_} for keys %$attrs; + while(@recs) { + my ($id1, $id2, $id3) = (pop @recs, pop @recs, pop @recs); + + for my $r ($req1, $req2, $req3) { + if($r) { + my $data = $r->gather(1); + my $xml = XML::LibXML->new->parse_string($data->{'unapi.bre'}); + $xml = $xml->documentElement; + my $attrs = get_bib_attrs($xml); + my $rec_id = xptext($xml,'*[@tag="901"]/*[@code="c"]'); + $records{$rec_id}{$_} = $attrs->{$_} for keys %$attrs; + + my $rvols = []; + for my $volnode ($xml->findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]')) { + my $vol = {}; + $vol->{copies} = []; + $vol->{label} = $volnode->getAttribute('label'); + for my $copynode ($volnode->getElementsByLocalName('copy')) { + my $copy = {}; + $copy->{barcode} = $copynode->getAttribute('barcode'); + push(@{$vol->{copies}}, $copy); + } + push(@{$records{$rec_id}->{volumes}}, $vol); + } - my $rvols = []; - for my $volnode ($xml->findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]')) { - my $vol = {}; - $vol->{copies} = []; - $vol->{label} = $volnode->getAttribute('label'); - for my $copynode ($volnode->getElementsByLocalName('copy')) { - my $copy = {}; - $copy->{barcode} = $copynode->getAttribute('barcode'); - push(@{$vol->{copies}}, $copy); } - push(@{$records{$rec_id}->{volumes}}, $vol); + } + + $req1 = ($id1) ? $ses1->request('open-ils.cstore.json_query', {from => ['unapi.bre', $id1, 'marcxml', 'record', '{holdings_xml,acp}', 'CONS']}) : undef; + $req2 = ($id2) ? $ses1->request('open-ils.cstore.json_query', {from => ['unapi.bre', $id2, 'marcxml', 'record', '{holdings_xml,acp}', 'CONS']}) : undef; + $req3 = ($id3) ? $ses1->request('open-ils.cstore.json_query', {from => ['unapi.bre', $id3, 'marcxml', 'record', '{holdings_xml,acp}', 'CONS']}) : undef; + } + + + for my $r ($req1, $req2, $req3) { + if($r) { + my $data = $r->gather(1); + my $xml = XML::LibXML->new->parse_string($data->{'unapi.bre'}); + $xml = $xml->documentElement; + my $attrs = get_bib_attrs($xml); + my $rec_id = xptext($xml,'*[@tag="901"]/*[@code="c"]'); + $records{$rec_id}{$_} = $attrs->{$_} for keys %$attrs; + + my $rvols = []; + for my $volnode ($xml->findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]')) { + my $vol = {}; + $vol->{copies} = []; + $vol->{label} = $volnode->getAttribute('label'); + for my $copynode ($volnode->getElementsByLocalName('copy')) { + my $copy = {}; + $copy->{barcode} = $copynode->getAttribute('barcode'); + push(@{$vol->{copies}}, $copy); + } + push(@{$records{$rec_id}->{volumes}}, $vol); + } + } } @@ -128,42 +169,55 @@ sub direct { my $start = time(); - my $cstore = OpenSRF::AppSession->create('open-ils.cstore'); - my $cstore2 = OpenSRF::AppSession->create('open-ils.cstore'); - my $bre_req = $cstore->request( - 'open-ils.cstore.direct.biblio.record_entry.search', - {id => \@recs}, - { - flesh => 4, - flesh_fields => { - bre => ['call_numbers'], - acn => ['copies', 'uris'], - acp => ['location', 'stat_cat_entries', 'parts'], - ascecm => ['stat_cat', 'stat_cat_entry'], - acpm => ['part'] - } + my $ses1 = OpenSRF::AppSession->create('open-ils.cstore'); + my $ses2 = OpenSRF::AppSession->create('open-ils.cstore'); + my $ses3 = OpenSRF::AppSession->create('open-ils.cstore'); + my ($req1, $req2, $req3); + + my $query = { + flesh => 4, + flesh_fields => { + bre => ['call_numbers'], + acn => ['copies', 'uris'], + acp => ['location', 'stat_cat_entries', 'parts'], + ascecm => ['stat_cat', 'stat_cat_entry'], + acpm => ['part'] } - # in practice, ^-- this might be a separate, paged json_query - # note, not fleshing copy status since copy statuses will always be cached in the ML - ); + }; - my @data; - while (my $resp = $bre_req->recv) { - my $bre = $resp->content; + my $first = 1; + while(@recs) { + my ($id1, $id2, $id3) = (pop @recs, pop @recs, pop @recs); + + for my $r ($req1, $req2, $req3) { + last unless $r; + my $bre = $r->gather(1); + my $xml = XML::LibXML->new->parse_string($bre->marc)->documentElement; + my $attrs = get_bib_attrs($xml); + $records{$bre->id}{record} = $bre; + $records{$bre->id}{$_} = $attrs->{$_} for keys %$attrs; + } - my $cc_req = $cstore2->request( - 'open-ils.cstore.json_query', - {from => ['asset.record_copy_count', 1, $bre->id, 0]} - ); + $req1 = ($id1) ? $ses1->request('open-ils.cstore.direct.biblio.record_entry.search', {id => $id1}, $query) : undef; + $req2 = ($id2) ? $ses1->request('open-ils.cstore.direct.biblio.record_entry.search', {id => $id2}, $query) : undef; + $req3 = ($id3) ? $ses1->request('open-ils.cstore.direct.biblio.record_entry.search', {id => $id3}, $query) : undef; + + if($first) { + $records{$_}{counts} = $e->json_query({from => ['asset.record_copy_count', 1, $_, 0]})->[0] for @recs; + $first = 0; + } + } + for my $r ($req1, $req2, $req3) { + last unless $r; + my $bre = $r->gather(1); my $xml = XML::LibXML->new->parse_string($bre->marc)->documentElement; my $attrs = get_bib_attrs($xml); $records{$bre->id}{record} = $bre; $records{$bre->id}{$_} = $attrs->{$_} for keys %$attrs; - - $records{$bre->id}->{counts} = $cc_req->gather(1); } + my $duration = time() - $start; for my $rec_id (keys %records) { -- 2.11.0