Forum OpenACS Development: Search error?
Does anyone know what this error means? It looks like it's caused by
the search_indexer. Thanks.
[29/Jan/2002:03:08:56][70078.2051][-sched-] Error: blob_get only
allowed in tran
saction
blob_get only allowed in transaction
while executing
"ns_pg blob_get $db $content"
("lob" arm line 3)
invoked from within
"switch $storage_type {
file {
if {[file exists $content]} {
set if..."
("blob_get" arm line 4)
invoked from within
"switch $type {
blob_get {
if {[info exists storage_type]} {
switch $storage_type {
..."
invoked from within
"db_exec_lob blob_get $db $full_statement_name $sql"
invoked from within
"set data [db_exec_lob blob_get $db $full_statement_name $sql]"
("uplevel" body line 2)
invoked from within
"uplevel 1 $code_block "
invoked from within
"db_with_handle db {
set data [db_exec_lob blob_get $db $full_statement_name $sql]
}"
(procedure "db_blob_get" line 6)
invoked from within
"db_blob_get data "select $content as content, 'lob' as storage_type""
("lob" arm line 2)
invoked from within
"switch $storage_type {
text {
set data $content
}
file {
set data [db_blob_get data "select '$content' as
content, 'file' as
storage_type..."
(procedure "search_content_get" line 6)
invoked from within
"search_content_get txt $datasource(content) $datasource(mime)
$datasource(stora
ge_type)"
("INSERT" arm line 5)
invoked from within
"switch $event {
INSERT {
set object_type [db_exec_plsql
get_object_type "select acs_objec
t_util__get_object_type($object_id)"]
if [acs_sc_bin..."
("uplevel" body line 3)
invoked from within
"uplevel 1 $code_block "
("1" arm line 1)
invoked from within
"switch $errno {
0 {
# TCL_OK
}
1 {
# TCL_ERROR
global errorInfo errorCode
error $error $errorInfo $errorCode
}
2 {
..."
("while" body line 20)
invoked from within
"while { [db_getrow $db $selection] } {
incr counter
if { [info exists array_val] } {
unset array_val
}
if { ![info exists column..."
("uplevel" body line 5)
invoked from within
"db_with_handle db {
set selection [db_exec select $db $full_statement_name $sql]
set counter 0
while { [db_getrow $db $selection] } {
incr co..."
(procedure "db_foreach" line 35)
invoked from within
"db_foreach search_observer_queue_entry {
select object_id, date, event
from search_observer_queue
order by date asc
} {
switch $event {
..."
(procedure "search_indexer" line 5)
invoked from within
"search_indexer"
("eval" body line 1)
invoked from within
"eval [concat [list $proc] $args]"
(procedure "ad_run_scheduled_proc" line 43)
invoked from within
"ad_run_scheduled_proc {f f 30 search_indexer {} 1012289996 0 t}"
"search_content_get" seems to be the culprit if I read your dump right.
blob_get needs to be wrapped in a begin/end pair or called within db_transaction. That's because it is pulling a bunch of segments from its blob table. If it's not executed in a transaction another thread could delete the blob and remove the segments when the blob_get's halfway through, screwing things up.
I could've made the driver smart enough to wrap it in a transaction if it weren't being called from within one, but didn't bother. It's simple enough to do so at the caller's end.
I'd welcome a patch, I'm sure!