Use the daemon when we don't have write access to the Nix database
This commit is contained in:
		
							parent
							
								
									4fa08f3edb
								
							
						
					
					
						commit
						9e7c1a4bbd
					
				
					 7 changed files with 57 additions and 13 deletions
				
			
		| 
						 | 
					@ -12,6 +12,7 @@
 | 
				
			||||||
</partintro>
 | 
					</partintro>
 | 
				
			||||||
-->
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<xi:include href="rl-1.12.xml" />
 | 
				
			||||||
<xi:include href="rl-1.11.xml" />
 | 
					<xi:include href="rl-1.11.xml" />
 | 
				
			||||||
<xi:include href="rl-1.10.xml" />
 | 
					<xi:include href="rl-1.10.xml" />
 | 
				
			||||||
<xi:include href="rl-1.9.xml" />
 | 
					<xi:include href="rl-1.9.xml" />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								doc/manual/release-notes/rl-1.12.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								doc/manual/release-notes/rl-1.12.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					<section xmlns="http://docbook.org/ns/docbook"
 | 
				
			||||||
 | 
					      xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
				
			||||||
 | 
					      xmlns:xi="http://www.w3.org/2001/XInclude"
 | 
				
			||||||
 | 
					      version="5.0"
 | 
				
			||||||
 | 
					      xml:id="ssec-relnotes-1.12">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<title>Release 1.12 (TBA)</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<para>This release has the following new features:</para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<itemizedlist>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <listitem>
 | 
				
			||||||
 | 
					    <para>It is no longer necessary to set the
 | 
				
			||||||
 | 
					    <envar>NIX_REMOTE</envar> environment variable if you need to use
 | 
				
			||||||
 | 
					    the Nix daemon. Nix will use the daemon automatically if you don’t
 | 
				
			||||||
 | 
					    have write access to the Nix database.</para>
 | 
				
			||||||
 | 
					  </listitem>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</itemizedlist>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<para>This release has contributions from TBD.</para>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
| 
						 | 
					@ -397,9 +397,15 @@ int LocalStore::getSchema()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool LocalStore::haveWriteAccess()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return access(settings.nixDBPath.c_str(), R_OK | W_OK) == 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LocalStore::openDB(bool create)
 | 
					void LocalStore::openDB(bool create)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (access(settings.nixDBPath.c_str(), R_OK | W_OK))
 | 
					    if (!haveWriteAccess())
 | 
				
			||||||
        throw SysError(format("Nix database directory ‘%1%’ is not writable") % settings.nixDBPath);
 | 
					        throw SysError(format("Nix database directory ‘%1%’ is not writable") % settings.nixDBPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Open the Nix database. */
 | 
					    /* Open the Nix database. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,6 +253,12 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int getSchema();
 | 
					    int getSchema();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static bool haveWriteAccess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void openDB(bool create);
 | 
					    void openDB(bool create);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void makeStoreWritable();
 | 
					    void makeStoreWritable();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,14 +50,8 @@ void RemoteStore::openConnection(bool reserveSpace)
 | 
				
			||||||
    if (initialised) return;
 | 
					    if (initialised) return;
 | 
				
			||||||
    initialised = true;
 | 
					    initialised = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    string remoteMode = getEnv("NIX_REMOTE");
 | 
					    /* Connect to a daemon that does the privileged work for us. */
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (remoteMode == "daemon")
 | 
					 | 
				
			||||||
        /* Connect to a daemon that does the privileged work for
 | 
					 | 
				
			||||||
           us. */
 | 
					 | 
				
			||||||
    connectToDaemon();
 | 
					    connectToDaemon();
 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        throw Error(format("invalid setting for NIX_REMOTE, ‘%1%’") % remoteMode);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from.fd = fdSocket;
 | 
					    from.fd = fdSocket;
 | 
				
			||||||
    to.fd = fdSocket;
 | 
					    to.fd = fdSocket;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,10 +311,22 @@ std::shared_ptr<StoreAPI> store;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::shared_ptr<StoreAPI> openStore(bool reserveSpace)
 | 
					std::shared_ptr<StoreAPI> openStore(bool reserveSpace)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (getEnv("NIX_REMOTE") == "")
 | 
					    enum { mDaemon, mLocal, mAuto } mode;
 | 
				
			||||||
        return std::shared_ptr<StoreAPI>(new LocalStore(reserveSpace));
 | 
					
 | 
				
			||||||
 | 
					    mode = getEnv("NIX_REMOTE") == "daemon" ? mDaemon : mAuto;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (mode == mAuto) {
 | 
				
			||||||
 | 
					        if (LocalStore::haveWriteAccess())
 | 
				
			||||||
 | 
					            mode = mLocal;
 | 
				
			||||||
 | 
					        else if (pathExists(settings.nixDaemonSocketFile))
 | 
				
			||||||
 | 
					            mode = mDaemon;
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        return std::shared_ptr<StoreAPI>(new RemoteStore());
 | 
					            mode = mLocal;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return mode == mDaemon
 | 
				
			||||||
 | 
					        ? (std::shared_ptr<StoreAPI>) std::make_shared<RemoteStore>()
 | 
				
			||||||
 | 
					        : std::make_shared<LocalStore>(reserveSpace);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@ deps="$(nix-store -qR $TEST_ROOT/result)"
 | 
				
			||||||
nix-store --dump-db > $TEST_ROOT/dump
 | 
					nix-store --dump-db > $TEST_ROOT/dump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rm -rf $NIX_DB_DIR
 | 
					rm -rf $NIX_DB_DIR
 | 
				
			||||||
 | 
					mkdir $NIX_DB_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nix-store --load-db < $TEST_ROOT/dump
 | 
					nix-store --load-db < $TEST_ROOT/dump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue