Skip to content

close does not close dependent dbs fully #7331

@julianhille

Description

@julianhille

Issue

Closing a database does not seem to close the dependent dbs / views / indices.
So one can not repair / rebuild the indices without a restart

Info

  • Environment: node
  • Platform: macos / Win
  • Adapter: leveldb
  • Server: Pouch db

Reproduce

Flow:

  • Create a db
  • Create an index / view
  • Close the database
  • delete the view directories
  • reopen the database
  • try to use the index
const PouchDB = require('pouchdb')
PouchDB.plugin(require('pouchdb-find'))
const fs = require('fs')
const expect = require('chai').expect
const path = require('path')
const util = require('util')
const rimraf = require('rimraf')
const chai = require('chai')


describe('index directory creation issue', () => {
	const databaseDir = path.join(__dirname, 'database-view-recreate') + path.sep
	let database 
	createDatabase = async () => {
		let db = new PouchDB(databaseDir)
		await db.info()	
		return db
	}
	before(async () => {
		database = await createDatabase()
	})

	after(() => {
		rimraf.sync(databaseDir)
	})

	context('create index', () => {
		before(async () => {
			await database.createIndex({
  				index: {
					fields: ['name'],
    				name: 'myindex',
    				ddoc: 'myindex'
  				}
			})
			await database.put({
				 _id: '_design/index',
  				views: {
  					anotherIndex: {
      					map: function (doc) { emit(doc.name) }.toString()
    				}
  				}
			})
		})

		it('creates a mr-view directory', () => {
			let directories = fs.readdirSync(databaseDir)
			let hasItem = directories.some((item) => {
				return item.match(/-mrview-/)
			})
			expect(hasItem).to.be.true
		})

		it('is able to search by query', async () => {
			
			await database.query('index/anotherIndex')
		})

		context('delete and recreate index', () => {
			before( async () => {
				await database.close()
				rimraf.sync(path.join(databaseDir, '*-mrview-*'))
			})

			it('deletes the view directory', () => {
				let directories = fs.readdirSync(databaseDir)
				let hasItem = directories.some((item) => {
					return item.match(/-mrview-/)
				})
				expect(hasItem).to.be.false
			})

			context('database reopen', () => {
				before(async () => {
					database = await createDatabase()

				})

				it('creates the view directories', () => {
					let directories = fs.readdirSync(databaseDir)
					let hasItem = directories.some((item) => {
						return item.match(/-mrview-/)
					})
					expect(hasItem).to.be.true
				})
			})
		})
	})

})

Package.json

{
  "dependencies": {
    "chai": "^4.1.2",
    "mocha": "^5.2.0",
    "pouchdb": "6.4.3",
    "pouchdb-find": "6.4.3",
    "rimraf": "^2.6.2"
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions