|
@@ -126,23 +126,18 @@ class WebHdfs(Hdfs):
|
|
|
@property
|
|
@property
|
|
|
def trash_path(self):
|
|
def trash_path(self):
|
|
|
try:
|
|
try:
|
|
|
- return self._thread_local.trash_path
|
|
|
|
|
|
|
+ return self._thread_local.trash_path[self.user]
|
|
|
except AttributeError:
|
|
except AttributeError:
|
|
|
- self._thread_local.trash_path = self.join(self.get_home_dir(), '.Trash')
|
|
|
|
|
- return self._thread_local.trash_path
|
|
|
|
|
|
|
+ self._thread_local.trash_paths = {}
|
|
|
|
|
+ self._thread_local.trash_paths[self.user] = self.join(self.get_home_dir(), '.Trash')
|
|
|
|
|
+ except KeyError:
|
|
|
|
|
+ self._thread_local.trash_paths[self.user] = self.join(self.get_home_dir(), '.Trash')
|
|
|
|
|
+ return self._thread_local.trash_paths[self.user]
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def current_trash_path(self):
|
|
def current_trash_path(self):
|
|
|
return self.join(self.trash_path, self.TRASH_CURRENT)
|
|
return self.join(self.trash_path, self.TRASH_CURRENT)
|
|
|
|
|
|
|
|
- @property
|
|
|
|
|
- def skip_trash(self):
|
|
|
|
|
- try:
|
|
|
|
|
- return self._thread_local.skip_trash
|
|
|
|
|
- except AttributeError:
|
|
|
|
|
- self._thread_local.skip_trash = False
|
|
|
|
|
- return self._thread_local.skip_trash
|
|
|
|
|
-
|
|
|
|
|
def _getparams(self):
|
|
def _getparams(self):
|
|
|
return {
|
|
return {
|
|
|
"user.name" : WebHdfs.DEFAULT_USER,
|
|
"user.name" : WebHdfs.DEFAULT_USER,
|
|
@@ -155,11 +150,6 @@ class WebHdfs(Hdfs):
|
|
|
self._thread_local.user = user
|
|
self._thread_local.user = user
|
|
|
return curr
|
|
return curr
|
|
|
|
|
|
|
|
- def setskiptrash(self, skip_trash):
|
|
|
|
|
- curr = self.skip_trash
|
|
|
|
|
- self._thread_local.skip_trash = skip_trash
|
|
|
|
|
- return curr
|
|
|
|
|
-
|
|
|
|
|
def listdir_stats(self, path, glob=None):
|
|
def listdir_stats(self, path, glob=None):
|
|
|
"""
|
|
"""
|
|
|
listdir_stats(path, glob=None) -> [ WebHdfsStat ]
|
|
listdir_stats(path, glob=None) -> [ WebHdfsStat ]
|
|
@@ -234,7 +224,7 @@ class WebHdfs(Hdfs):
|
|
|
|
|
|
|
|
def _ensure_current_trash_directory(self):
|
|
def _ensure_current_trash_directory(self):
|
|
|
"""Create trash directory for a user if it doesn't exist."""
|
|
"""Create trash directory for a user if it doesn't exist."""
|
|
|
- if not self.exists(self.current_trash_path):
|
|
|
|
|
|
|
+ if self.exists(self.current_trash_path):
|
|
|
self.mkdir(self.current_trash_path)
|
|
self.mkdir(self.current_trash_path)
|
|
|
return self.current_trash_path
|
|
return self.current_trash_path
|
|
|
|
|
|
|
@@ -283,20 +273,20 @@ class WebHdfs(Hdfs):
|
|
|
if not result['boolean']:
|
|
if not result['boolean']:
|
|
|
raise IOError(_('Delete failed: %s') % path)
|
|
raise IOError(_('Delete failed: %s') % path)
|
|
|
|
|
|
|
|
- def remove(self, path):
|
|
|
|
|
|
|
+ def remove(self, path, skip_trash=False):
|
|
|
"""Delete a file."""
|
|
"""Delete a file."""
|
|
|
- if hadoop.core_site.get_trash_interval() is None or self.skip_trash:
|
|
|
|
|
|
|
+ if hadoop.core_site.get_trash_interval() is None or skip_trash:
|
|
|
self._delete(path, recursive=False)
|
|
self._delete(path, recursive=False)
|
|
|
else:
|
|
else:
|
|
|
self._trash(path, recursive=False)
|
|
self._trash(path, recursive=False)
|
|
|
|
|
|
|
|
- def rmdir(self, path):
|
|
|
|
|
|
|
+ def rmdir(self, path, skip_trash=False):
|
|
|
"""Delete a directory."""
|
|
"""Delete a directory."""
|
|
|
- self.remove(path)
|
|
|
|
|
|
|
+ self.remove(path, skip_trash)
|
|
|
|
|
|
|
|
- def rmtree(self, path):
|
|
|
|
|
|
|
+ def rmtree(self, path, skip_trash=False):
|
|
|
"""Delete a tree recursively."""
|
|
"""Delete a tree recursively."""
|
|
|
- if hadoop.core_site.get_trash_interval() is None or self.skip_trash:
|
|
|
|
|
|
|
+ if hadoop.core_site.get_trash_interval() is None or skip_trash:
|
|
|
self._delete(path, recursive=True)
|
|
self._delete(path, recursive=True)
|
|
|
else:
|
|
else:
|
|
|
self._trash(path, recursive=True)
|
|
self._trash(path, recursive=True)
|
|
@@ -339,10 +329,8 @@ class WebHdfs(Hdfs):
|
|
|
if hadoop.core_site.get_trash_interval() is None:
|
|
if hadoop.core_site.get_trash_interval() is None:
|
|
|
raise IOError(errno.EPERM, _("Trash is not enabled."))
|
|
raise IOError(errno.EPERM, _("Trash is not enabled."))
|
|
|
|
|
|
|
|
- original = self.setskiptrash(True)
|
|
|
|
|
for timestamped_directory in self.listdir(self.trash_path):
|
|
for timestamped_directory in self.listdir(self.trash_path):
|
|
|
- self.rmtree(self.join(self.trash_path, timestamped_directory))
|
|
|
|
|
- self.setskiptrash(original)
|
|
|
|
|
|
|
+ self.rmtree(self.join(self.trash_path, timestamped_directory), True)
|
|
|
|
|
|
|
|
def mkdir(self, path, mode=None):
|
|
def mkdir(self, path, mode=None):
|
|
|
"""
|
|
"""
|
|
@@ -661,7 +649,6 @@ class WebHdfs(Hdfs):
|
|
|
|
|
|
|
|
def do_as_user(self, username, fn, *args, **kwargs):
|
|
def do_as_user(self, username, fn, *args, **kwargs):
|
|
|
prev_user = self.user
|
|
prev_user = self.user
|
|
|
-
|
|
|
|
|
try:
|
|
try:
|
|
|
self.setuser(username)
|
|
self.setuser(username)
|
|
|
return fn(*args, **kwargs)
|
|
return fn(*args, **kwargs)
|