Please find attached a partial patch (using diff -u and not git, as I
don't have my development up and running), using shutil.move instead
of os.rename.
Why partial? because in the case of a local repository, the move is
done from the real repository to Spacewalk mount point. So the
original repository gets corrupted after this move (the package
imported in spacewalk is missing). The behavior is correct for remote
repository.
As it allows me to get back a working spacewalk, I go with it. But any
improvement would be really appreciated.


[root@tu-spa-d15 importlib]# diff -u /root/importlib.py.orig importLib.py
--- /root/importlib.py.orig     2012-01-23 15:52:03.649825333 +0000
+++ importLib.py        2012-01-23 15:55:59.625754383 +0000
@@ -17,6 +17,7 @@
 #

 import os
+import shutil
 from types import IntType, StringType, InstanceType
 from UserDict import UserDict
 from UserList import UserList
@@ -808,7 +809,7 @@
     # Create the directory where the file will reside
     if not os.path.exists(dir):
         createPath(dir)
-    os.rename(filename, packagePath)
+   shutil.move(filename, packagePath)
     # set the path perms readable by all users
     os.chmod(packagePath, 0644)


Pierre

2012/1/23 Pierre Casenove <[email protected]>:
> I keep working on my issue,
> Here is a working strace, when downloading package osad from spacewalk
> client web repository:
> stat("/data/satellite/redhat/1/b4f/osad/5.10.34-1.el5/noarch/b4f797216885818ee51d9a01813422a1/osad-5.10.34-1.el5.noarch.rpm",
> 0x7fff36060790) = -1 ENOENT (No such file or directory)
> stat("/data/satellite/redhat/1/b4f/osad/5.10.34-1.el5/noarch/b4f797216885818ee51d9a01813422a1",
> {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> rename("/data/satellite/redhat/1/stage/osad-5.10.34-1.el5.noarch.rpm",
> "/data/satellite/redhat/1/b4f/osad/5.10.34-1.el5/noarch/b4f797216885818ee51d9a01813422a1/osad-5.10.34-1.el5.noarch.rpm")
> = 0
> chmod("/data/satellite/redhat/1/b4f/osad/5.10.34-1.el5/noarch/b4f797216885818ee51d9a01813422a1/osad-5.10.34-1.el5.noarch.rpm",
> 0644) = 0
>
> It seems that spacewalk-repo-sync behaves differently when a local
> repo is used (ie file:///var/...) or a web repo.
> With a local repo, the rename is called on the source name to the dest name.
> With a web repo, the repo is created in /MOUNT_POINT/redhat/1/stage
> and then renamed, which is much better.
>
> Could you please help me with this one? I'm really stuck and have no
> idea where to look at in the code.
>
> Pierre
>
>
>
> 2012/1/23 Pierre Casenove <[email protected]>:
>> Hello,
>> I've straced spacewalk-repo-sync call.
>> Here is the error:
>> stat("/data/satellite/redhat/1/bbe/mrepo/0.8.7-2.el5/noarch/bbe01b9ea61f85f4892dedc0fbb89b73/mrepo-0.8.7-2.el5.noarch.rpm",
>> 0x7fff4f62f540) = -1 ENOENT (No such file or directory)
>> stat("/data/satellite/redhat/1/bbe/mrepo/0.8.7-2.el5/noarch/bbe01b9ea61f85f4892dedc0fbb89b73",
>> {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
>> rename("/var/www/html/pub/epel/5/epel5-x86_64/mrepo-0.8.7-2.el5.noarch.rpm",
>> "/data/satellite/redhat/1/bbe/mrepo/0.8.7-2.el5/noarch/bbe01b9ea61f85f4892dedc0fbb89b73/mrepo-0.8.7-2.el5.noarch.rpm")
>> = -1 EXDEV (Invalid cross-device link)
>>
>> /data/satellite is Spacewalk mount_point
>> /var/www/html/pub/epel/5/epel5-x86_64 is where the rpm is stored
>> locally on the server. It gets here using reposync.
>> Folder 
>> /data/satellite/redhat/1/bbe/mrepo/0.8.7-2.el5/noarch/bbe01b9ea61f85f4892dedc0fbb89b73/
>> is correctly created.
>>
>> I've also dug a bit in bugzilla and found BZ 676369 being corrected
>> for spacewalk 1.6. And this commit in particular:
>> 2dbe4deade884d410f93bfcd30947bb77dd18e88
>> -    pkgfd = os.open(packagePath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
>> -    os.lseek(fd, 0, 0)
>> -    while 1:
>> -        buffer = os.read(fd, 65536)
>> -        if not buffer:
>> -            break
>> -        n = os.write(pkgfd, buffer)
>> -        if n != len(buffer):
>> -            # Error writing to the file
>> -            raise IOError, "Wrote %s out of %s bytes in file %s" % (
>> -                n, len(buffer), packagePath)
>> -    os.close(pkgfd)
>> +    os.rename(filename, packagePath)
>>     # set the path perms readable by all users
>> -    setPermsPath(packagePath, chmod=0644)
>> +    os.chmod(packagePath, 0644)
>>
>>
>> This patch introduces the use of os.rename command... which seems to
>> be a problem with local repositories.
>>
>> Thanks in advance for your help,
>>
>> Pierre
>>
>>
>> 2012/1/23 Pierre Casenove <[email protected]>:
>>> Sorry to spam: it works well with public repositories, it only fails
>>> with repositories built on the server, in my case:
>>> - mrepo
>>> - a subset of EPEL : I use reposync to download and built locally a
>>> repo with only some rpms of EPEL.
>>>
>>> Pierre
>>>
>>> 2012/1/23 Pierre Casenove <[email protected]>:
>>>> Some more information:
>>>> - reposync also fails with public repositories from internet (like
>>>> spacewalk client)
>>>> - on my system /usr partition is mounted readonly
>>>> - the rpms are stored on a NFS volume
>>>>
>>>> Thanks,
>>>>
>>>> Pierre
>>>>
>>>>
>>>> 2012/1/23 Pierre Casenove <[email protected]>:
>>>>> Hello,
>>>>> I have spacewalk 1.6 on postgresql and I have the following error log
>>>>> when trying to reposync packages dowloaded by mrepo:
>>>>> 57/57 : busybox-1.2.0-10.el5_7.1-1.x86_64
>>>>> (50, 'Package upload failed: [Errno 18] Invalid cross-device link',
>>>>> 'Invalid information uploaded to the server')
>>>>>
>>>>> Could you please tell me waht is the meaning of such error?
>>>>>
>>>>> Thanks in advance,
>>>>>
>>>>> Pierre

_______________________________________________
Spacewalk-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/spacewalk-list

Reply via email to