Commit Graph
67 Commits
Author SHA1 Message Date
Axel Dörfler 82e06fff68 Implemented BPlusTree::Validate().
* Walks the complete B+tree and checks all nodes for validity
  (duplicate/fragment as well), ie. if no key is larger than those of its
  parent, and that the left/right links are valid.
* This does not yet support repairing of broken trees, though.
2012-03-07 01:55:01 +01:00
Axel Dörfler f7f996cc32 * BPlusTree is now using the TransactionListener mechanism to update its private
fHeader copy on failure.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35492 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-02-16 12:23:43 +00:00
Axel Dörfler 2a8ae7fb92 * CachedNode::SetToWritable() already needs the updated header, so we need to
Unset() the header in Allocate() before calling it. This fixes bug #5410.
* CachedNode::Allocate() does not need to revert its changes; the transaction
  will take care of that. However, BPlusTree::fHeader is currently not correctly
  maintained if a transaction fails (working on that now).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35490 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-02-16 08:34:55 +00:00
Axel Dörfler a05e4ed330 * BPlusTree no longer caches the header in its own block, instead, it aggregates
a copy of its structure. CachedNode is only used to write to the header, now.
  This should cause the block_cache to no longer have any referenced blocks
  outside of any I/O.
* Coding style cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35473 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-02-15 16:39:54 +00:00
Ingo Weinhold 8859eeab53 Replaced "%Ld" and "%lld" in printf()s by the new B_PRI* macros to avoid
warnings when building with a 64 bit compiler.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34216 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-11-24 19:48:32 +00:00
Axel Dörfler 265694bb1f * Fixed warnings when compiled with DEBUG=1.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33550 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-10-12 14:33:22 +00:00
Axel Dörfler aee4b7e237 * Fixed two bugs in BPlusTree::Remove(): it could update the tree iterators
incorrectly in case of duplicates. And also, more importantly, it did not
  check if the entry to remove had the same value -- it would happily remove
  any entry with the same attribute content. This could only happen in the
  reindex case, though, and was the cause of bug #3854.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30616 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-05-03 20:29:50 +00:00
Ingo Weinhold e5b1c10e58 Calm down debug output a bit.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28148 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-10-15 17:19:45 +00:00
Axel Dörfler b33ba0e92e * Followed Marcus' suggestion and made the array a static const one.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27663 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-21 12:14:54 +00:00
Axel Dörfler 6126236e8a * Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27627 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-18 16:04:28 +00:00
Axel Dörfler 35a16d8f5e * Moved the inode_types into Utilities.h.
* Added a S_EXTENDED_TYPES constant to simplify some checks.
* Simplified the fAllowDuplicates computation in BPlusTree::SetTo().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27625 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-18 15:22:29 +00:00
Axel Dörfler 1be4b7c0c5 * Build fix when built with DEBUG defined.
* Forgot to remove the "bfs_block_runs" debugger command on module unload.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26800 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-04 17:56:13 +00:00
Axel Dörfler 02c8f6c89d * Coding style cleanups, no functional changes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26728 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-02 14:06:38 +00:00
Axel Dörfler 2accd07be4 * Replaced Chain with the new SinglyLinkedList.
* Renamed openModeToAccess() to open_mode_to_access().
* Cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26718 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-01 14:20:16 +00:00
Axel Dörfler 2e3477e3d8 * Changed the inode write locking to be held as long as the transaction is
running - this fixes several cases where someone could see outdated data
  when a transaction had to be reverted (the time between unlocking the inode
  and actually reverting the blocks). For that, Inodes can now be put into a
  singly linked list.
* Added a TODO in Inode::WriteAt() which explains why it cannot use the above
  method: seems that our VFS/VM locking model isn't really that good.
* Fixed a possible deadlock in Attribute::_Truncate() where the inode write
  lock was held before starting the transaction.
* Added an InodeReadLocker convenience class, that should be used instead
  of ReadLocker - Inode::Lock() only still exists because of the needs of
  bfs_io().
* Moved the bfs_io() callback hooks out of the exported module API region,
  and removed their bfs_ prefix.
* Added a Volume::IsInitializing() method that should be used rather than
  checking if Volume::ID() is >= 0.
* Removed the MultiInodeLocker again, as it's pretty much superfluous now.
* Moved openModeToAccess() to the Utility.h header.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26715 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-08-01 12:28:28 +00:00
Axel Dörfler b99521f213 First round of locking fixes:
* Moved locking the data stream out of the BPlusTree methods; this fixes at
  least two locations where another thread could have seen outdated/incorrect
  data.
* Removed some superfluous code in bfs_rename(): we don't have to revert to the
  previous situation, the transaction does this for us automatically.
* Added a simple MultiWriteLocker, even though it's not really necessary anymore
  (since we always hold the transaction lock first when we lock more than one
  inode at a time).
* Inode::Create() called InodeAllocator::Keep() a bit too early, the file cache
  and map wasn't created and assigned yet.
* InodeAllocator now keeps the inode write locked.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26689 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-07-30 18:32:14 +00:00
Ingo Weinhold 9083840f34 bonefish + mmlr + axeld:
* Fixed a bug that could easily corrupt your disks (yeah, one of those
  again): bfs_get_file_map() truncated the last vec incorrectly and
  would potentially return a too large file size -- which was later
  happily overwritten with file data, but could have belonged to
  anything but that file (like inodes, B+trees, etc.).
* Renamed previous round_up() function to key_align().
* Added round_up() template function, and used it where appropriate.
* The latter actually fixed two bugs where the and mask was computed in
  32 bit where it should have been in 64 bit.
* Inode::FindBlockRun() should have checked the max indirect size
  instead of the direct size - this didn't cause any problems, though.
* White space cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26531 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-07-20 23:59:32 +00:00
Axel Dörfler 1bde8b03e7 * Replaced BFS's ReadWriteLock implementation with the kernel's rw_lock.
* The BlockAllocator now uses the new mutex_transfer_lock() function instead
  of clobbering the mutex directly.
* Removed Lock.h - it's no longer needed.
* Minor white space cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26317 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-07-08 08:04:37 +00:00
Axel Dörfler 03fa417b70 * Removed the home-brewn locking classes in BFS besides the read/write lock
(for now).
* Inode::fSmallDataLock is now a recursive_lock, Journal::fLock is now
  a recursive_lock, too, Journal::fEntriesLock is now a mutex, as is
  BPlusTree::fIteratorLock.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26298 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-07-07 16:21:00 +00:00
Axel Dörfler cdde324d77 * Looks like r24456 was a bit premature: with string attributes, it makes sense
to ignore a trailing null byte, which the code now didn't do anymore.
* This caused bug #2054.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24888 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-10 11:43:45 +00:00
Axel Dörfler 974e087ef1 * If two equal keys were compared, the check for the key end was
incorrect; only the length of the key matters, not if they are null
  terminated. It would still return the correct value, though, it would
  just access one byte beyond the buffer (which didn't really matter 
  in this specific case).
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24456 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-19 08:41:00 +00:00
Axel Dörfler 7a3ecb82ba * _SeekDown() now checks if it has already reached the maximum tree
depth, and will bail out if it hasn't reached the leaf level then.
* This should at least avoid the crash of bug #1911; there is not much
  more I can do about that.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24411 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-16 16:26:05 +00:00
Axel Dörfler 9402b5edc6 Patch by Vasilis Kaoutsis to fix some warnings, thanks!
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24203 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-02 14:37:26 +00:00
Axel Dörfler 1204649234 * When shrinking the stream size after a node had been removed, its
parent node could temporarily get invalid (ie. CheckNode() would 
  fail).
* Since shrinking the stream was done in edge cases only, anyway, we 
  will no longer do that which works around the problem. This fixes
  bug #1716.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23656 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-19 23:12:11 +00:00
Axel Dörfler d1ba9c8adc Fixed warnings when building the bfs_shell.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23462 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-12 23:58:56 +00:00
Axel Dörfler ab88b095f2 * bfs_{read|write}_pages() now only try to lock - this fixes a possible
deadlock whenever someone without a lock (like the page_writer()) is calling
  this function.
* Added a new ReadWriteLock::TryLock() method.
* Renamed bfs_read_vnode() and bfs_release_vnode() to bfs_get_vnode() and
  bfs_put_vnode() just like those functions are called in fs_interface.h.
* Fixed a warning in BPlusTree::_SplitNode().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22372 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-09-29 14:06:04 +00:00
Ingo Weinhold 8a10c0b5a7 Changes in BPlusTree::_SplitNode():
* Added check for invalid keyIndex parameter.
* Removed superfluous break condition in the second loop.
* Increment "out" in the second loop only when we have processed a key
  that will end up in the node. Thus, after the loop, the variable will
  contain the numbers of keys to be copied/moved, not that number + 1.
  Adjusted later use of "out" accordingly, save in one place where it
  was used incorrectly, which resulted in one key length and value to
  many to be copied, thus occasionally causing a page fault (bug #1363).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22195 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-09-06 21:04:13 +00:00
Ingo Weinhold fd0831b98d axeld + bonefish:
Fixed off-by-one error in the b+ tree code splitting a node, which could
result in a read beyond the block bounds thus causing a page fault. Was
nicely reproducible when unzipping big archives. Now bug #1003 seems to
be fixed for real.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21671 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-07-19 21:55:05 +00:00
Jérôme Duval 5acd132fa4 replaced uint32 by addr_t where it applies to please gcc on x86_64
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21422 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-06-16 11:33:42 +00:00
Axel Dörfler 37593af284 Fixed a memory leak in _SplitNode() spotted by Stefano - thanks!
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21200 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-05-22 09:07:58 +00:00
Axel Dörfler 3bef51f0ae * Removed unused code when USER is defined - the fs_shell no longer does this, but
provides a kernel emulation layer.
* Renamed all private BPlusTree methods to have the '_' prefix.
* Removed useless set_sem_owner() from Lock.h - all semaphores created in the kernel
  always belong to the system team automatically.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21054 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-05-07 12:26:21 +00:00
Ingo Weinhold c391f84b2c * Prepared the BFS sources to be used with the new FS shell:
- Moved all inclusions of system headers into a new
    system_dependencies.h header, which conditionally either includes
    these or the FS shell headers.
  - Fixed compiler warnings related to printf-like functions (int32 is
    int, not long on non-BeOS platforms).
* Build a new bfs_shell. Compiles and links, but does nothing ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20860 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-27 12:25:49 +00:00
Axel Dörfler ecf0475ad0 Porting r18992 to the R5 version of BFS (and therefore, bfs_shell used to build the
Haiku image) revealed a problem with that change:
* If the root node only contained a single entry it was freed instead of just making
  it a leaf node - that could produce an invalid b+tree (could only happen with
  attribute or index trees, as directories always contain '.' and '..').


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19006 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-10-05 17:34:11 +00:00
Axel Dörfler 0d01edbaba Fixed a stupid bug found by accident:
* When removing the last key from a leaf node, the node wasn't freed, but just
  emptied, and thus the whole tree structure would never combast.
* This could also cause a bug in the TreeIterator: if the last entry was not
  in the last node, every second readdir() after the last one would return
  the last entry again. I only found this because that happens to be what
  Tracker does (which would run in an endless loop while scanning the directory
  then).
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18992 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-10-03 17:51:22 +00:00
Axel Dörfler 2594778c84 * Imported PPC big endian fixes into Haiku's BFS.
* Fixed another issue in BPlusTree::RemoveKey().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17558 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-05-22 23:44:00 +00:00
Jérôme Duval 866d738a05 added error tracing to help on bug #106
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16498 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-02-22 22:57:50 +00:00
Axel Dörfler 4af3d066e1 Better debug output.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16017 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-21 13:29:11 +00:00
Axel Dörfler 1397187532 Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15871 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-08 13:59:37 +00:00
Axel Dörfler 5e796c3bb3 A couple of endian fixes, inspired by Ingo - there might be some more left, though,
it's untested yet.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15693 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-12-28 14:03:10 +00:00
Axel Dörfler bdf1da4d6e Slightly improved debug output.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15656 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-12-22 18:21:37 +00:00
Axel Dörfler b68efdcaa7 We now use the kernel's Stack class instead of our own copy.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14417 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-18 20:03:00 +00:00
Axel Dörfler 1733a44231 Fixed a very stupid bug I introduced in r10056 (the Haiku-only switch):
CachedNode::Allocate() could return the wrong offset for the new node when
taken from the free node pool (it accidently returned the offset for the
next free node...).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14084 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-29 22:18:15 +00:00
Axel Dörfler 0afc66fa69 Made CachedNode::SetTo[Header]() return a const node/header. Made some other methods
that were supposed to be const const as well.
Found one bug this way: in one case, a duplicate node might not have been part of a
transaction (and thus, was not written back). This bug only affected the Haiku version
of BFS, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14083 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-29 21:57:08 +00:00
Axel Dörfler 4dcc6e972e Fixed two bugs in BPlusTree::RemoveDuplicate():
- if the left duplicate node of a removed node was the last node, the "array" variable
  still pointed to the old node when the loop was reentered which could lead to a tree
  corruption.
- if the value to be removed could not be found in the fragment it should have been in,
  the method still returned B_OK instead of B_ENTRY_NOT_FOUND.
Small cleanup, updated/improved comments.
Changed bplustree_node::FragmentsUsed() from int32 to uint32. Moved the calculation
of the maximal number of fragments in a node to the new bplustree_node::MaxFragments()
method.
If a bplustree_header is not valid, BPlusTree::SetTo() will now dump the header when
compiled with DEBUG defined.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14063 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-25 23:16:08 +00:00
Axel Dörfler bae91f0a4c Fixed a bug I introduced when porting BFS to Haiku: when the file size of a BPlusTree
could be shrinked (because the last node was freed), the free node pointer of the
header was still accidently set to that node.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14040 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-21 17:41:52 +00:00
Axel Dörfler 634c23467b If allocating a new node fails, the bplustree_header::maximum_size field is now
reseted to its old value.
BPlusTree::SetTo() is now less strict about maximum_size vs. inode size differences;
it will now print a warning and set the maximum_size to the inode size, even though
the tree might be corrupted (reading should always be as compatible and forgiving
as possible).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13946 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-12 22:13:28 +00:00
Axel Dörfler fbdd53ace2 Extended the node checker a bit.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13944 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-12 19:56:08 +00:00
Axel Dörfler 8c52ae3e96 SeekDown() now prints out an error message when failing in a certain way (instead
of just using the RETURN_ERROR() macro).
Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13878 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-08-02 12:12:23 +00:00
Axel Dörfler f7eefd8207 Fixed warnings: possibly uninitialized variable, missing friend classifier (struct/class).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11558 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-03-03 06:18:12 +00:00
Axel Dörfler 41eca62b69 Fixed debug build.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10196 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-11-23 01:38:44 +00:00