| 1 | #!/usr/bin/php
|
|---|
| 2 | <?php
|
|---|
| 3 | /*
|
|---|
| 4 | This simulates a problem I am having with Xapian/PHP/Ubuntu. Reduced
|
|---|
| 5 | the problem down to this contrived example.
|
|---|
| 6 |
|
|---|
| 7 | PHP Error: DatabaseCorruptError: Data ran out unexpectedly when reading posting list.
|
|---|
| 8 | xapian-check Error: Extra bytes after key for first chunk of posting list for term
|
|---|
| 9 |
|
|---|
| 10 | The use case is similar to this:
|
|---|
| 11 | Many accounts with individual data to be indexed. Using a handful of
|
|---|
| 12 | custom prefixes to do filtering when querying. When an account is
|
|---|
| 13 | disabled, the records are purged from the XapianDatabase.
|
|---|
| 14 |
|
|---|
| 15 | Errors with:
|
|---|
| 16 | Ubuntu Hardy 8.04.1
|
|---|
| 17 | libxapian15 1.0.5 (Ubuntu current package)
|
|---|
| 18 | php5 5.2.4 (Ubuntu current package)
|
|---|
| 19 |
|
|---|
| 20 | -- Did an upgrade install to 1.0.7 and had same problems errors.
|
|---|
| 21 |
|
|---|
| 22 | Works fine under:
|
|---|
| 23 | Ubuntu Gutsy 7.10
|
|---|
| 24 | libxapian15 1.0.2 (Ubuntu current package)
|
|---|
| 25 | php5 5.2.3 (Ubuntu current package)
|
|---|
| 26 |
|
|---|
| 27 | */
|
|---|
| 28 | require '/usr/share/php5/xapian.php';
|
|---|
| 29 |
|
|---|
| 30 | $db_file = '/tmp/xapiantest';
|
|---|
| 31 |
|
|---|
| 32 | try {
|
|---|
| 33 |
|
|---|
| 34 | /* Changing keys or values will give mixed results. */
|
|---|
| 35 | $recipe_for_fail = array (
|
|---|
| 36 | 219 => 74,
|
|---|
| 37 | 221 => 116,
|
|---|
| 38 | 222 => 199,
|
|---|
| 39 | 223 => 21,
|
|---|
| 40 | 224 => 45,
|
|---|
| 41 | 225 => 155,
|
|---|
| 42 | 226 => 189,
|
|---|
| 43 | );
|
|---|
| 44 |
|
|---|
| 45 | $testdata = array ();
|
|---|
| 46 | $pos = 0;
|
|---|
| 47 | foreach ($recipe_for_fail as $value => $num)
|
|---|
| 48 | {
|
|---|
| 49 | $testdata += array_fill($pos, $num, $value);
|
|---|
| 50 | $pos += $num;
|
|---|
| 51 | }
|
|---|
| 52 |
|
|---|
| 53 | // Populate Xapian database
|
|---|
| 54 | $database = new XapianWritableDatabase($db_file, Xapian::DB_CREATE_OR_OPEN);
|
|---|
| 55 | foreach ($testdata as $value)
|
|---|
| 56 | {
|
|---|
| 57 | $doc = new XapianDocument();
|
|---|
| 58 | $doc->add_term('XC' . $value);
|
|---|
| 59 | $doc->add_term('XTabc');
|
|---|
| 60 | $doc->add_term('XAdef');
|
|---|
| 61 | $doc->add_term('XRghi');
|
|---|
| 62 | // Magic quantity, if you comment this, it wont error.
|
|---|
| 63 | $doc->add_term('XYabc');
|
|---|
| 64 |
|
|---|
| 65 | $database->add_document($doc);
|
|---|
| 66 | }
|
|---|
| 67 | $database = null;
|
|---|
| 68 |
|
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 | // Did not normally delete /all/ entries, however, in testing, this
|
|---|
| 72 | // gave more consistent results/error.
|
|---|
| 73 | // Also of note, in production dont actually open the DB twice, however
|
|---|
| 74 | // the error would show up on subsequent calls, doing the second open
|
|---|
| 75 | // in here to reproduce multiple calls in one pass.
|
|---|
| 76 | $database = new XapianWritableDatabase($db_file, Xapian::DB_CREATE_OR_OPEN);
|
|---|
| 77 | foreach (array_keys ($recipe_for_fail) as $value)
|
|---|
| 78 | {
|
|---|
| 79 | $database->delete_document('XC' . $value);
|
|---|
| 80 | }
|
|---|
| 81 | $database = null;
|
|---|
| 82 |
|
|---|
| 83 | // Running xapian check on DB shows the errors. In normal use, the
|
|---|
| 84 | // database would work somewhat unless querying for one of the deleted
|
|---|
| 85 | // records.
|
|---|
| 86 | system("xapian-check $db_file");
|
|---|
| 87 |
|
|---|
| 88 | echo "Dont forget to remove the db file before next test. ($db_file)\n";
|
|---|
| 89 | //echo "Cleanup\n";
|
|---|
| 90 | //system("rm -Rf $db_file");
|
|---|
| 91 |
|
|---|
| 92 | } catch (Exception $e) {
|
|---|
| 93 | print $e->getMessage() . "\n";
|
|---|
| 94 | exit(1);
|
|---|
| 95 | }
|
|---|